)]}'
{"cliff/lister.py":[{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"2d4714ac97298879cd6d6b3283a8aca5b7dd146d","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            nargs\u003d\u0027+\u0027,"},{"line_number":50,"context_line":"            metavar\u003d\u0027SORT_COLUMN\u0027,"},{"line_number":51,"context_line":"            help\u003d\"space separated list of keys for sorting the data, \""},{"line_number":52,"context_line":"                 \"wrong values are ignored.\")"},{"line_number":53,"context_line":"        return parser"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def produce_output(self, parsed_args, column_names, data):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f485f77_c5a6bac1","line":52,"updated":"2017-11-19 18:36:27.000000000","message":"Let\u0027s make this option work the same way we implemented the -c option, asking the caller to repeat it instead of having it take multiple arguments. That makes it easier to use with commands that take arguments other than the options, because the parser knows when to stop consuming the options and treat the remaining values as arguments. See the base class of Lister in display.py for the implementation.","commit_id":"4839bfc886659f42b1ffb72fdaccae08fd0dd149"},{"author":{"_account_id":18446,"name":"vkulanov","email":"vitaliy@kulanov.org.ua","username":"vkulanov"},"change_message_id":"3839d8778f474cfa94abe0fe560473e523de41a7","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            nargs\u003d\u0027+\u0027,"},{"line_number":50,"context_line":"            metavar\u003d\u0027SORT_COLUMN\u0027,"},{"line_number":51,"context_line":"            help\u003d\"space separated list of keys for sorting the data, \""},{"line_number":52,"context_line":"                 \"wrong values are ignored.\")"},{"line_number":53,"context_line":"        return parser"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def produce_output(self, parsed_args, column_names, data):"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff82abbf_5f39243f","line":52,"in_reply_to":"1f485f77_c5a6bac1","updated":"2017-11-20 11:23:10.000000000","message":"Done","commit_id":"4839bfc886659f42b1ffb72fdaccae08fd0dd149"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"2d4714ac97298879cd6d6b3283a8aca5b7dd146d","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            c_ids \u003d [columns_to_include.index(c)"},{"line_number":67,"context_line":"                     for c in parsed_args.sort_column"},{"line_number":68,"context_line":"                     if c in columns_to_include]"},{"line_number":69,"context_line":"            data \u003d sorted(data, key\u003dlambda x: [x[c_id] for c_id in c_ids])"},{"line_number":70,"context_line":"        self.formatter.emit_list(columns_to_include,"},{"line_number":71,"context_line":"                                 data,"},{"line_number":72,"context_line":"                                 self.app.stdout,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f485f77_05985272","line":69,"updated":"2017-11-19 18:36:27.000000000","message":"Commands that retrieve a lot of data may find this operation rather expensive. Is there a way we can have the command instance indicate whether it was able to pass the sorting instructions to another library (or API service) so that the data is already sorted? For example, if I have an app built on top of an SQL database, I would rather have the app pass the sort instructions to the database in the query, and not do the sorting here in memory.","commit_id":"4839bfc886659f42b1ffb72fdaccae08fd0dd149"},{"author":{"_account_id":18446,"name":"vkulanov","email":"vitaliy@kulanov.org.ua","username":"vkulanov"},"change_message_id":"3839d8778f474cfa94abe0fe560473e523de41a7","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            c_ids \u003d [columns_to_include.index(c)"},{"line_number":67,"context_line":"                     for c in parsed_args.sort_column"},{"line_number":68,"context_line":"                     if c in columns_to_include]"},{"line_number":69,"context_line":"            data \u003d sorted(data, key\u003dlambda x: [x[c_id] for c_id in c_ids])"},{"line_number":70,"context_line":"        self.formatter.emit_list(columns_to_include,"},{"line_number":71,"context_line":"                                 data,"},{"line_number":72,"context_line":"                                 self.app.stdout,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff82abbf_9f180cd4","line":69,"in_reply_to":"1f485f77_05985272","updated":"2017-11-20 11:23:10.000000000","message":"Thanks for the tips. I thought about this case. Please, check my next patch set.","commit_id":"4839bfc886659f42b1ffb72fdaccae08fd0dd149"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"3f5afdd347729984d0c7cedd64cc4a337eaef1e5","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        return \u0027table\u0027"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @property"},{"line_number":35,"context_line":"    def is_sort_by_client(self):"},{"line_number":36,"context_line":"        \"\"\"Whether sort procedure is performed on a client side."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        This property should be overridden (return False) when there"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff82abbf_048ee477","line":35,"updated":"2017-11-20 18:00:06.000000000","message":"Can we make it \"is_sorted_by_client\"?","commit_id":"7ef123d7016809ca680c1540868394c0e36040bc"},{"author":{"_account_id":18446,"name":"vkulanov","email":"vitaliy@kulanov.org.ua","username":"vkulanov"},"change_message_id":"29934ef1bc4f0eb2b5ba4bd4232fe898097eae3e","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        return \u0027table\u0027"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @property"},{"line_number":35,"context_line":"    def is_sort_by_client(self):"},{"line_number":36,"context_line":"        \"\"\"Whether sort procedure is performed on a client side."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        This property should be overridden (return False) when there"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff82abbf_dbfe8804","line":35,"in_reply_to":"ff82abbf_048ee477","updated":"2017-11-21 12:01:33.000000000","message":"Done","commit_id":"7ef123d7016809ca680c1540868394c0e36040bc"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"3f5afdd347729984d0c7cedd64cc4a337eaef1e5","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        This property should be overridden (return False) when there"},{"line_number":39,"context_line":"        is a need to not make client-side sorting procedure.\"\"\""},{"line_number":40,"context_line":"        return True"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @abc.abstractmethod"},{"line_number":43,"context_line":"    def take_action(self, parsed_args):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff82abbf_2469a8bd","line":40,"updated":"2017-11-20 18:00:06.000000000","message":"If we don\u0027t expect this to be something we compute at runtime, it could just be a class attribute, right? I suppose even if it is something we compute at runtime in some cases we could start with a simple class attribute and override it as a property if we need to.","commit_id":"7ef123d7016809ca680c1540868394c0e36040bc"},{"author":{"_account_id":18446,"name":"vkulanov","email":"vitaliy@kulanov.org.ua","username":"vkulanov"},"change_message_id":"29934ef1bc4f0eb2b5ba4bd4232fe898097eae3e","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        This property should be overridden (return False) when there"},{"line_number":39,"context_line":"        is a need to not make client-side sorting procedure.\"\"\""},{"line_number":40,"context_line":"        return True"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @abc.abstractmethod"},{"line_number":43,"context_line":"    def take_action(self, parsed_args):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff82abbf_bb04e47c","line":40,"in_reply_to":"ff82abbf_2469a8bd","updated":"2017-11-21 12:01:33.000000000","message":"Done","commit_id":"7ef123d7016809ca680c1540868394c0e36040bc"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"3f5afdd347729984d0c7cedd64cc4a337eaef1e5","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    def get_parser(self, prog_name):"},{"line_number":49,"context_line":"        parser \u003d super(Lister, self).get_parser(prog_name)"},{"line_number":50,"context_line":"        # Add sorting key argument to the \u0027output formatters\u0027 group"},{"line_number":51,"context_line":"        # (if exists), otherwise add it to the general group"},{"line_number":52,"context_line":"        matching_groups \u003d (group for group in parser._action_groups"},{"line_number":53,"context_line":"                           if group.title \u003d\u003d \u0027output formatters\u0027)"},{"line_number":54,"context_line":"        group \u003d next(matching_groups, None) or parser"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff82abbf_64a49009","line":51,"updated":"2017-11-20 18:00:06.000000000","message":"The formatters group is intended for the formatter plugins to use. I don\u0027t think the command class should extend it.","commit_id":"7ef123d7016809ca680c1540868394c0e36040bc"},{"author":{"_account_id":18446,"name":"vkulanov","email":"vitaliy@kulanov.org.ua","username":"vkulanov"},"change_message_id":"29934ef1bc4f0eb2b5ba4bd4232fe898097eae3e","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    def get_parser(self, prog_name):"},{"line_number":49,"context_line":"        parser \u003d super(Lister, self).get_parser(prog_name)"},{"line_number":50,"context_line":"        # Add sorting key argument to the \u0027output formatters\u0027 group"},{"line_number":51,"context_line":"        # (if exists), otherwise add it to the general group"},{"line_number":52,"context_line":"        matching_groups \u003d (group for group in parser._action_groups"},{"line_number":53,"context_line":"                           if group.title \u003d\u003d \u0027output formatters\u0027)"},{"line_number":54,"context_line":"        group \u003d next(matching_groups, None) or parser"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff82abbf_c871dce2","line":51,"in_reply_to":"ff82abbf_64a49009","updated":"2017-11-21 12:01:33.000000000","message":"As the description of a current group is \u0027output formatter options\u0027 I decided to make this flag as a part of this group, just like for \u0027-c/--column\u0027. I mean that this option is involved in formatting of output results.\nBut if you have any ideas I will appreciate you.","commit_id":"7ef123d7016809ca680c1540868394c0e36040bc"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"3f5afdd347729984d0c7cedd64cc4a337eaef1e5","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            data \u003d (list(self._compress_iterable(row, selector))"},{"line_number":74,"context_line":"                    for row in data)"},{"line_number":75,"context_line":"        if parsed_args.sort_columns:"},{"line_number":76,"context_line":"            if self.is_sort_by_client:"},{"line_number":77,"context_line":"                c_ids \u003d [columns_to_include.index(c)"},{"line_number":78,"context_line":"                         for c in parsed_args.sort_columns"},{"line_number":79,"context_line":"                         if c in columns_to_include]"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff82abbf_e490a098","line":76,"updated":"2017-11-20 18:00:06.000000000","message":"I think you want this to be\n\n  if parsed_args.sort_columns and self.is_sorted_by_client:","commit_id":"7ef123d7016809ca680c1540868394c0e36040bc"},{"author":{"_account_id":18446,"name":"vkulanov","email":"vitaliy@kulanov.org.ua","username":"vkulanov"},"change_message_id":"29934ef1bc4f0eb2b5ba4bd4232fe898097eae3e","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            data \u003d (list(self._compress_iterable(row, selector))"},{"line_number":74,"context_line":"                    for row in data)"},{"line_number":75,"context_line":"        if parsed_args.sort_columns:"},{"line_number":76,"context_line":"            if self.is_sort_by_client:"},{"line_number":77,"context_line":"                c_ids \u003d [columns_to_include.index(c)"},{"line_number":78,"context_line":"                         for c in parsed_args.sort_columns"},{"line_number":79,"context_line":"                         if c in columns_to_include]"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff82abbf_08e264d6","line":76,"in_reply_to":"ff82abbf_e490a098","updated":"2017-11-21 12:01:33.000000000","message":"Done","commit_id":"7ef123d7016809ca680c1540868394c0e36040bc"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"3f5afdd347729984d0c7cedd64cc4a337eaef1e5","unresolved":false,"context_lines":[{"line_number":74,"context_line":"                    for row in data)"},{"line_number":75,"context_line":"        if parsed_args.sort_columns:"},{"line_number":76,"context_line":"            if self.is_sort_by_client:"},{"line_number":77,"context_line":"                c_ids \u003d [columns_to_include.index(c)"},{"line_number":78,"context_line":"                         for c in parsed_args.sort_columns"},{"line_number":79,"context_line":"                         if c in columns_to_include]"},{"line_number":80,"context_line":"                data \u003d sorted(data, key\u003dlambda x: [x[c_id] for c_id in c_ids])"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff82abbf_8482f44e","line":77,"updated":"2017-11-20 18:00:06.000000000","message":"What if c represents a column name that is invalid for the data set?","commit_id":"7ef123d7016809ca680c1540868394c0e36040bc"},{"author":{"_account_id":18446,"name":"vkulanov","email":"vitaliy@kulanov.org.ua","username":"vkulanov"},"change_message_id":"29934ef1bc4f0eb2b5ba4bd4232fe898097eae3e","unresolved":false,"context_lines":[{"line_number":74,"context_line":"                    for row in data)"},{"line_number":75,"context_line":"        if parsed_args.sort_columns:"},{"line_number":76,"context_line":"            if self.is_sort_by_client:"},{"line_number":77,"context_line":"                c_ids \u003d [columns_to_include.index(c)"},{"line_number":78,"context_line":"                         for c in parsed_args.sort_columns"},{"line_number":79,"context_line":"                         if c in columns_to_include]"},{"line_number":80,"context_line":"                data \u003d sorted(data, key\u003dlambda x: [x[c_id] for c_id in c_ids])"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff82abbf_68cbf052","line":77,"in_reply_to":"ff82abbf_8482f44e","updated":"2017-11-21 12:01:33.000000000","message":"Wrong values are ignored (see @L62, @L79), Actually this is the almost the same behavior as for \u0027-c/--column\u0027 in display.py.","commit_id":"7ef123d7016809ca680c1540868394c0e36040bc"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"96b2fcddb69f9cfa6f9c889e4959157e672d6017","unresolved":false,"context_lines":[{"line_number":27,"context_line":"                             side. If set to False it is intended that a user-"},{"line_number":28,"context_line":"                             defined sort procedure is implemented."},{"line_number":29,"context_line":"    \"\"\""},{"line_number":30,"context_line":"    is_sorted_by_client \u003d True"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    @property"},{"line_number":33,"context_line":"    def formatter_namespace(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff82abbf_2a07181f","line":30,"updated":"2017-11-21 15:09:56.000000000","message":"Sorry, I\u0027m doing a bad job here. Obviously you were using a property to mirror the other similar values. Feel free to put that back, or leave it as it is now.","commit_id":"1c52882050bac276ff88f637844fe91a4633a9cf"},{"author":{"_account_id":18446,"name":"vkulanov","email":"vitaliy@kulanov.org.ua","username":"vkulanov"},"change_message_id":"c0b3193d4a089fd89f4e41d49f5185a2c2edf0fa","unresolved":false,"context_lines":[{"line_number":27,"context_line":"                             side. If set to False it is intended that a user-"},{"line_number":28,"context_line":"                             defined sort procedure is implemented."},{"line_number":29,"context_line":"    \"\"\""},{"line_number":30,"context_line":"    is_sorted_by_client \u003d True"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    @property"},{"line_number":33,"context_line":"    def formatter_namespace(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff82abbf_731c356a","line":30,"in_reply_to":"ff82abbf_2a07181f","updated":"2017-11-22 07:04:02.000000000","message":"I will put it back to make code consistent (define as a property).","commit_id":"1c52882050bac276ff88f637844fe91a4633a9cf"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"d976ad42c653727c39605f0d86afeee67249d5fb","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        parser \u003d super(Lister, self).get_parser(prog_name)"},{"line_number":48,"context_line":"        # Add sorting key argument to the \u0027output formatters\u0027 group"},{"line_number":49,"context_line":"        # (if exists), otherwise add it to the general group"},{"line_number":50,"context_line":"        matching_groups \u003d (group for group in parser._action_groups"},{"line_number":51,"context_line":"                           if group.title \u003d\u003d \u0027output formatters\u0027)"},{"line_number":52,"context_line":"        group \u003d next(matching_groups, None) or parser"},{"line_number":53,"context_line":"        group.add_argument("}],"source_content_type":"text/x-python","patch_set":4,"id":"ff82abbf_6a7d201b","line":50,"updated":"2017-11-21 14:58:00.000000000","message":"OK, I didn\u0027t remember that the -c option was in the formatter group. It\u0027s OK to put this new option in the same group, but we can\u0027t use a private property of the parser to find the group.\n\nThe group is created in the base class get_parser() method. Store it there as an attribute of the command (self._formatter_group maybe?) and then use that variable here instead of searching through the implementation details of the argument parser to find it.","commit_id":"1c52882050bac276ff88f637844fe91a4633a9cf"},{"author":{"_account_id":18446,"name":"vkulanov","email":"vitaliy@kulanov.org.ua","username":"vkulanov"},"change_message_id":"c0b3193d4a089fd89f4e41d49f5185a2c2edf0fa","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        parser \u003d super(Lister, self).get_parser(prog_name)"},{"line_number":48,"context_line":"        # Add sorting key argument to the \u0027output formatters\u0027 group"},{"line_number":49,"context_line":"        # (if exists), otherwise add it to the general group"},{"line_number":50,"context_line":"        matching_groups \u003d (group for group in parser._action_groups"},{"line_number":51,"context_line":"                           if group.title \u003d\u003d \u0027output formatters\u0027)"},{"line_number":52,"context_line":"        group \u003d next(matching_groups, None) or parser"},{"line_number":53,"context_line":"        group.add_argument("}],"source_content_type":"text/x-python","patch_set":4,"id":"ff82abbf_6e00bf68","line":50,"in_reply_to":"ff82abbf_6a7d201b","updated":"2017-11-22 07:04:02.000000000","message":"Done","commit_id":"1c52882050bac276ff88f637844fe91a4633a9cf"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"d976ad42c653727c39605f0d86afeee67249d5fb","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            data \u003d (list(self._compress_iterable(row, selector))"},{"line_number":72,"context_line":"                    for row in data)"},{"line_number":73,"context_line":"        if parsed_args.sort_columns and self.is_sorted_by_client:"},{"line_number":74,"context_line":"            c_ids \u003d [columns_to_include.index(c)"},{"line_number":75,"context_line":"                     for c in parsed_args.sort_columns"},{"line_number":76,"context_line":"                     if c in columns_to_include]"},{"line_number":77,"context_line":"            data \u003d sorted(data, key\u003dlambda x: [x[c_id] for c_id in c_ids])"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff82abbf_cab6acda","line":74,"range":{"start_line":74,"start_character":21,"end_line":74,"end_character":48},"updated":"2017-11-21 14:58:00.000000000","message":"Suppose I have data with columns a, b, c and I say to sort on column d. The column does not exist anywhere in the data. The index() method will throw a ValueError exception, which isn\u0027t caught here.","commit_id":"1c52882050bac276ff88f637844fe91a4633a9cf"},{"author":{"_account_id":18446,"name":"vkulanov","email":"vitaliy@kulanov.org.ua","username":"vkulanov"},"change_message_id":"c0b3193d4a089fd89f4e41d49f5185a2c2edf0fa","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            data \u003d (list(self._compress_iterable(row, selector))"},{"line_number":72,"context_line":"                    for row in data)"},{"line_number":73,"context_line":"        if parsed_args.sort_columns and self.is_sorted_by_client:"},{"line_number":74,"context_line":"            c_ids \u003d [columns_to_include.index(c)"},{"line_number":75,"context_line":"                     for c in parsed_args.sort_columns"},{"line_number":76,"context_line":"                     if c in columns_to_include]"},{"line_number":77,"context_line":"            data \u003d sorted(data, key\u003dlambda x: [x[c_id] for c_id in c_ids])"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff82abbf_f6135365","line":74,"range":{"start_line":74,"start_character":21,"end_line":74,"end_character":48},"in_reply_to":"ff82abbf_cab6acda","updated":"2017-11-22 07:04:02.000000000","message":"See my comments below.","commit_id":"1c52882050bac276ff88f637844fe91a4633a9cf"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"d976ad42c653727c39605f0d86afeee67249d5fb","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        if parsed_args.sort_columns and self.is_sorted_by_client:"},{"line_number":74,"context_line":"            c_ids \u003d [columns_to_include.index(c)"},{"line_number":75,"context_line":"                     for c in parsed_args.sort_columns"},{"line_number":76,"context_line":"                     if c in columns_to_include]"},{"line_number":77,"context_line":"            data \u003d sorted(data, key\u003dlambda x: [x[c_id] for c_id in c_ids])"},{"line_number":78,"context_line":"        self.formatter.emit_list(columns_to_include,"},{"line_number":79,"context_line":"                                 data,"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff82abbf_eadcd019","line":76,"range":{"start_line":76,"start_character":21,"end_line":76,"end_character":47},"updated":"2017-11-21 14:58:00.000000000","message":"This requires me to show a column in order to sort on it. What if I want to sort on something but not show it?","commit_id":"1c52882050bac276ff88f637844fe91a4633a9cf"},{"author":{"_account_id":18446,"name":"vkulanov","email":"vitaliy@kulanov.org.ua","username":"vkulanov"},"change_message_id":"c0b3193d4a089fd89f4e41d49f5185a2c2edf0fa","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        if parsed_args.sort_columns and self.is_sorted_by_client:"},{"line_number":74,"context_line":"            c_ids \u003d [columns_to_include.index(c)"},{"line_number":75,"context_line":"                     for c in parsed_args.sort_columns"},{"line_number":76,"context_line":"                     if c in columns_to_include]"},{"line_number":77,"context_line":"            data \u003d sorted(data, key\u003dlambda x: [x[c_id] for c_id in c_ids])"},{"line_number":78,"context_line":"        self.formatter.emit_list(columns_to_include,"},{"line_number":79,"context_line":"                                 data,"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff82abbf_4952a015","line":76,"range":{"start_line":76,"start_character":21,"end_line":76,"end_character":47},"in_reply_to":"ff82abbf_eadcd019","updated":"2017-11-22 07:04:02.000000000","message":"Thanks, I think this is a good idea, then, let\u0027s sort data first and then show only results we need, e.g. http://paste.openstack.org/show/627001/\nAlso let\u0027s ignore sorting by non-existing columns.","commit_id":"1c52882050bac276ff88f637844fe91a4633a9cf"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8ae0d31e1ea922a1836f2e235146af94779d7cab","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        return \u0027table\u0027"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @property"},{"line_number":35,"context_line":"    def is_sorted_by_client(self):"},{"line_number":36,"context_line":"        \"\"\"Whether sort procedure is performed on a client side."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        Should be overridden (return False) when there is a need to implement"}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_6f6854f4","line":35,"updated":"2017-12-19 17:57:03.000000000","message":"What does \u0027client\u0027 mean? If \"client\" is a cliff app, True/False should be reverted. If \u0027client\u0027 is cliff itself, True/False is correct, but the description needs to be improved. Anyway \u0027client side\u0027 is unclear.\n\nI don\u0027t have a good idea but my idea is \u0027is_already_sorted\u0027 or \u0027is_sorted_by_app\u0027. Thought?","commit_id":"3066e13baf27dc16bff1abed10ca9a088c550106"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"75ddba8421d4eeffb35376857ce0219c5215d858","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        return \u0027table\u0027"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @property"},{"line_number":35,"context_line":"    def is_sorted_by_client(self):"},{"line_number":36,"context_line":"        \"\"\"Whether sort procedure is performed on a client side."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        Should be overridden (return False) when there is a need to implement"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf8cb3f7_7f3b88ea","line":35,"in_reply_to":"bf8cb3f7_6134824b","updated":"2017-12-25 05:38:41.000000000","message":"\u003e Let\u0027s try to find name (or logic) that best fits, before I will\n \u003e make any further changes in this part of code.\n \u003e \n \u003e As far as I can see we have several cases:\n \u003e 1. Data to be displayed by cliff lister is already sorted. Then,\n \u003e there is no need to make any sort procedure.\n \u003e 2. Data that we want to display is not sorted yet and we want to do\n \u003e this by using cliff itself.\n \u003e 3. Data that we want to display is not sorted yet, but we want to\n \u003e give the ability to the end-user to implement some custom sort\n \u003e procedure.\n\nThanks for summarizing the possible cases.\n\nMy vote is something like \"need_sort_by_cliff\". I think it covers all cases.\n\nThought?","commit_id":"3066e13baf27dc16bff1abed10ca9a088c550106"},{"author":{"_account_id":18446,"name":"vkulanov","email":"vitaliy@kulanov.org.ua","username":"vkulanov"},"change_message_id":"3dab8ab0c4571c3455d066fa73443c17a3380481","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        return \u0027table\u0027"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @property"},{"line_number":35,"context_line":"    def is_sorted_by_client(self):"},{"line_number":36,"context_line":"        \"\"\"Whether sort procedure is performed on a client side."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        Should be overridden (return False) when there is a need to implement"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf8cb3f7_6134824b","line":35,"in_reply_to":"bf8cb3f7_755be086","updated":"2017-12-21 06:42:13.000000000","message":"Let\u0027s try to find name (or logic) that best fits, before I will make any further changes in this part of code.\n\nAs far as I can see we have several cases:\n1. Data to be displayed by cliff lister is already sorted. Then, there is no need to make any sort procedure.\n2. Data that we want to display is not sorted yet and we want to do this by using cliff itself.\n3. Data that we want to display is not sorted yet, but we want to give the ability to the end-user to implement some custom sort procedure.\n\nFirst, I thought about your proposition to call it \u0027is_already_sorted\u0027 that sounds rather good, but doesn\u0027t fit the last case (doesn\u0027t it?), e.g.:\n\n    @property\n    def is_already_sorted(self):\n        return False\n\n    def produce_output(self, parsed_args, column_names, data):\n        if parsed_args.sort_columns and not self.is_already_sorted:\n            indexes \u003d [column_names.index(c) for c in parsed_args.sort_columns\n                       if c in column_names]\n            if indexes:\n                data \u003d sorted(data, key\u003doperator.itemgetter(*indexes))\n        ...\n        ...\n\nThoughts?","commit_id":"3066e13baf27dc16bff1abed10ca9a088c550106"},{"author":{"_account_id":18446,"name":"vkulanov","email":"vitaliy@kulanov.org.ua","username":"vkulanov"},"change_message_id":"8589a1210ce8fdef6b01ff7bf30c852ec0022945","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        return \u0027table\u0027"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @property"},{"line_number":35,"context_line":"    def is_sorted_by_client(self):"},{"line_number":36,"context_line":"        \"\"\"Whether sort procedure is performed on a client side."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        Should be overridden (return False) when there is a need to implement"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf8cb3f7_209e2d54","line":35,"in_reply_to":"bf8cb3f7_7f3b88ea","updated":"2017-12-27 06:19:44.000000000","message":"Sounds good","commit_id":"3066e13baf27dc16bff1abed10ca9a088c550106"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8cbacd08874f6395ddaa0b70510e2818ff0a9e97","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        return \u0027table\u0027"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @property"},{"line_number":35,"context_line":"    def is_sorted_by_client(self):"},{"line_number":36,"context_line":"        \"\"\"Whether sort procedure is performed on a client side."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        Should be overridden (return False) when there is a need to implement"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf8cb3f7_755be086","line":35,"in_reply_to":"bf8cb3f7_80898b27","updated":"2017-12-21 01:57:49.000000000","message":"is_sorted_by_cliff sounds a bit tricky because the passed data is NOT sorted by cliff yet.","commit_id":"3066e13baf27dc16bff1abed10ca9a088c550106"},{"author":{"_account_id":18446,"name":"vkulanov","email":"vitaliy@kulanov.org.ua","username":"vkulanov"},"change_message_id":"1dce03b6a3d5057079537ddb95715b9493c50b8e","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        return \u0027table\u0027"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @property"},{"line_number":35,"context_line":"    def is_sorted_by_client(self):"},{"line_number":36,"context_line":"        \"\"\"Whether sort procedure is performed on a client side."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        Should be overridden (return False) when there is a need to implement"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf8cb3f7_80898b27","line":35,"in_reply_to":"df87a7cf_6f6854f4","updated":"2017-12-20 19:50:45.000000000","message":"Thanks for the review.\nI\u0027ve made some changes. What do you think about?","commit_id":"3066e13baf27dc16bff1abed10ca9a088c550106"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8ae0d31e1ea922a1836f2e235146af94779d7cab","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            dest\u003d\u0027sort_columns\u0027,"},{"line_number":56,"context_line":"            metavar\u003d\u0027SORT_COLUMN\u0027,"},{"line_number":57,"context_line":"            help\u003d\"specify the column(s) to sort the data \""},{"line_number":58,"context_line":"                 \"(wrong values are ignored), can be repeated\")"},{"line_number":59,"context_line":"        return parser"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def produce_output(self, parsed_args, column_names, data):"}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_ef00e436","line":58,"updated":"2017-12-19 17:57:03.000000000","message":"Columns specified first has a priority. I think it is worth mentioned.\n\nIn addition, what does \u0027wrong values\u0027 mean? Does it mean \u0027non-existing columns\u0027?","commit_id":"3066e13baf27dc16bff1abed10ca9a088c550106"},{"author":{"_account_id":18446,"name":"vkulanov","email":"vitaliy@kulanov.org.ua","username":"vkulanov"},"change_message_id":"1dce03b6a3d5057079537ddb95715b9493c50b8e","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            dest\u003d\u0027sort_columns\u0027,"},{"line_number":56,"context_line":"            metavar\u003d\u0027SORT_COLUMN\u0027,"},{"line_number":57,"context_line":"            help\u003d\"specify the column(s) to sort the data \""},{"line_number":58,"context_line":"                 \"(wrong values are ignored), can be repeated\")"},{"line_number":59,"context_line":"        return parser"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def produce_output(self, parsed_args, column_names, data):"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf8cb3f7_c076b33f","line":58,"in_reply_to":"df87a7cf_ef00e436","updated":"2017-12-20 19:50:45.000000000","message":"Done","commit_id":"3066e13baf27dc16bff1abed10ca9a088c550106"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8ae0d31e1ea922a1836f2e235146af94779d7cab","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def produce_output(self, parsed_args, column_names, data):"},{"line_number":62,"context_line":"        if parsed_args.sort_columns and self.is_sorted_by_client:"},{"line_number":63,"context_line":"            c_ids \u003d [column_names.index(c) for c in parsed_args.sort_columns"},{"line_number":64,"context_line":"                     if c in column_names]"},{"line_number":65,"context_line":"            data \u003d sorted(data, key\u003dlambda x: [x[c_id] for c_id in c_ids])"},{"line_number":66,"context_line":"        (columns_to_include, selector) \u003d self._generate_columns_and_selector("}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_af52dc33","line":63,"range":{"start_line":63,"start_character":14,"end_line":63,"end_character":17},"updated":"2017-12-19 17:57:03.000000000","message":"\u0027indexes\u0027 looks better. \u0027ID\u0027 is usually used in a different meaning in OpenStack API and it associates ID of resources. In addition, we usually use an index to specify an item of an array.","commit_id":"3066e13baf27dc16bff1abed10ca9a088c550106"},{"author":{"_account_id":18446,"name":"vkulanov","email":"vitaliy@kulanov.org.ua","username":"vkulanov"},"change_message_id":"1dce03b6a3d5057079537ddb95715b9493c50b8e","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def produce_output(self, parsed_args, column_names, data):"},{"line_number":62,"context_line":"        if parsed_args.sort_columns and self.is_sorted_by_client:"},{"line_number":63,"context_line":"            c_ids \u003d [column_names.index(c) for c in parsed_args.sort_columns"},{"line_number":64,"context_line":"                     if c in column_names]"},{"line_number":65,"context_line":"            data \u003d sorted(data, key\u003dlambda x: [x[c_id] for c_id in c_ids])"},{"line_number":66,"context_line":"        (columns_to_include, selector) \u003d self._generate_columns_and_selector("}],"source_content_type":"text/x-python","patch_set":7,"id":"bf8cb3f7_a0936f4f","line":63,"range":{"start_line":63,"start_character":14,"end_line":63,"end_character":17},"in_reply_to":"df87a7cf_af52dc33","updated":"2017-12-20 19:50:45.000000000","message":"Done","commit_id":"3066e13baf27dc16bff1abed10ca9a088c550106"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8ae0d31e1ea922a1836f2e235146af94779d7cab","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        if parsed_args.sort_columns and self.is_sorted_by_client:"},{"line_number":63,"context_line":"            c_ids \u003d [column_names.index(c) for c in parsed_args.sort_columns"},{"line_number":64,"context_line":"                     if c in column_names]"},{"line_number":65,"context_line":"            data \u003d sorted(data, key\u003dlambda x: [x[c_id] for c_id in c_ids])"},{"line_number":66,"context_line":"        (columns_to_include, selector) \u003d self._generate_columns_and_selector("},{"line_number":67,"context_line":"            parsed_args, column_names)"},{"line_number":68,"context_line":"        if selector:"}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_6a9b62c8","line":65,"range":{"start_line":65,"start_character":32,"end_line":65,"end_character":73},"updated":"2017-12-19 17:57:03.000000000","message":"Consider using operator.itemgetter.\n\n  key\u003doperator.itemgetter(*c_ids)\n\n[1] https://docs.python.org/3.6/howto/sorting.html#operator-module-functions","commit_id":"3066e13baf27dc16bff1abed10ca9a088c550106"},{"author":{"_account_id":18446,"name":"vkulanov","email":"vitaliy@kulanov.org.ua","username":"vkulanov"},"change_message_id":"1dce03b6a3d5057079537ddb95715b9493c50b8e","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        if parsed_args.sort_columns and self.is_sorted_by_client:"},{"line_number":63,"context_line":"            c_ids \u003d [column_names.index(c) for c in parsed_args.sort_columns"},{"line_number":64,"context_line":"                     if c in column_names]"},{"line_number":65,"context_line":"            data \u003d sorted(data, key\u003dlambda x: [x[c_id] for c_id in c_ids])"},{"line_number":66,"context_line":"        (columns_to_include, selector) \u003d self._generate_columns_and_selector("},{"line_number":67,"context_line":"            parsed_args, column_names)"},{"line_number":68,"context_line":"        if selector:"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf8cb3f7_609d6758","line":65,"range":{"start_line":65,"start_character":32,"end_line":65,"end_character":73},"in_reply_to":"df87a7cf_6a9b62c8","updated":"2017-12-20 19:50:45.000000000","message":"Done","commit_id":"3066e13baf27dc16bff1abed10ca9a088c550106"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8cbacd08874f6395ddaa0b70510e2818ff0a9e97","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            default\u003d[],"},{"line_number":56,"context_line":"            dest\u003d\u0027sort_columns\u0027,"},{"line_number":57,"context_line":"            metavar\u003d\u0027SORT_COLUMN\u0027,"},{"line_number":58,"context_line":"            help\u003d\"specify the column(s) to sort the data (columns specified \""},{"line_number":59,"context_line":"                 \"first has a priority, non-existing columns are ignored), \""},{"line_number":60,"context_line":"                 \"can be repeated\")"},{"line_number":61,"context_line":"        return parser"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def produce_output(self, parsed_args, column_names, data):"}],"source_content_type":"text/x-python","patch_set":8,"id":"bf8cb3f7_151e14ba","line":60,"range":{"start_line":58,"start_character":17,"end_line":60,"end_character":34},"updated":"2017-12-21 01:57:49.000000000","message":"Could you wrap the help text by parentheses?\n\n  help\u003d(\"specify ....\"\n        \"first has ....\"\n        \"can be repeated\")\n\nBy doing, most editor can indent them automatically.","commit_id":"410124ff8071e93b57095caca8918e9f969b21f2"},{"author":{"_account_id":18446,"name":"vkulanov","email":"vitaliy@kulanov.org.ua","username":"vkulanov"},"change_message_id":"3dab8ab0c4571c3455d066fa73443c17a3380481","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            default\u003d[],"},{"line_number":56,"context_line":"            dest\u003d\u0027sort_columns\u0027,"},{"line_number":57,"context_line":"            metavar\u003d\u0027SORT_COLUMN\u0027,"},{"line_number":58,"context_line":"            help\u003d\"specify the column(s) to sort the data (columns specified \""},{"line_number":59,"context_line":"                 \"first has a priority, non-existing columns are ignored), \""},{"line_number":60,"context_line":"                 \"can be repeated\")"},{"line_number":61,"context_line":"        return parser"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def produce_output(self, parsed_args, column_names, data):"}],"source_content_type":"text/x-python","patch_set":8,"id":"bf8cb3f7_c68ec42d","line":60,"range":{"start_line":58,"start_character":17,"end_line":60,"end_character":34},"in_reply_to":"bf8cb3f7_151e14ba","updated":"2017-12-21 06:42:13.000000000","message":"Done","commit_id":"410124ff8071e93b57095caca8918e9f969b21f2"}],"cliff/tests/test_lister.py":[{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"2d4714ac97298879cd6d6b3283a8aca5b7dd146d","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        parsed_args \u003d mock.Mock()"},{"line_number":54,"context_line":"        parsed_args.columns \u003d (\u0027Col1\u0027, \u0027Col2\u0027)"},{"line_number":55,"context_line":"        parsed_args.formatter \u003d \u0027test\u0027"},{"line_number":56,"context_line":"        parsed_args.sort_column \u003d None"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        test_lister.run(parsed_args)"},{"line_number":59,"context_line":"        f \u003d test_lister._formatter_plugins[\u0027test\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f485f77_a5829efe","line":56,"updated":"2017-11-19 18:36:27.000000000","message":"I think we\u0027ll want the default to be an empty list for consistency.","commit_id":"4839bfc886659f42b1ffb72fdaccae08fd0dd149"},{"author":{"_account_id":18446,"name":"vkulanov","email":"vitaliy@kulanov.org.ua","username":"vkulanov"},"change_message_id":"3839d8778f474cfa94abe0fe560473e523de41a7","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        parsed_args \u003d mock.Mock()"},{"line_number":54,"context_line":"        parsed_args.columns \u003d (\u0027Col1\u0027, \u0027Col2\u0027)"},{"line_number":55,"context_line":"        parsed_args.formatter \u003d \u0027test\u0027"},{"line_number":56,"context_line":"        parsed_args.sort_column \u003d None"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        test_lister.run(parsed_args)"},{"line_number":59,"context_line":"        f \u003d test_lister._formatter_plugins[\u0027test\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff82abbf_5f1284b3","line":56,"in_reply_to":"1f485f77_a5829efe","updated":"2017-11-20 11:23:10.000000000","message":"Done","commit_id":"4839bfc886659f42b1ffb72fdaccae08fd0dd149"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8cbacd08874f6395ddaa0b70510e2818ff0a9e97","unresolved":false,"context_lines":[{"line_number":83,"context_line":"            )"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def test_sort_by_column_cliff_side_procedure(self):"},{"line_number":86,"context_line":"        test_lister \u003d ExerciseLister(mock.MagicMock(), [])"},{"line_number":87,"context_line":"        parsed_args \u003d mock.MagicMock()"},{"line_number":88,"context_line":"        parsed_args.columns \u003d (\u0027Col1\u0027, \u0027Col2\u0027)"},{"line_number":89,"context_line":"        parsed_args.formatter \u003d \u0027test\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"bf8cb3f7_1545b4b3","line":86,"range":{"start_line":86,"start_character":36,"end_line":86,"end_character":53},"updated":"2017-12-21 01:57:49.000000000","message":"Do you need to use MagicMock? If not, Mock() is suggested.","commit_id":"410124ff8071e93b57095caca8918e9f969b21f2"},{"author":{"_account_id":18446,"name":"vkulanov","email":"vitaliy@kulanov.org.ua","username":"vkulanov"},"change_message_id":"3dab8ab0c4571c3455d066fa73443c17a3380481","unresolved":false,"context_lines":[{"line_number":83,"context_line":"            )"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def test_sort_by_column_cliff_side_procedure(self):"},{"line_number":86,"context_line":"        test_lister \u003d ExerciseLister(mock.MagicMock(), [])"},{"line_number":87,"context_line":"        parsed_args \u003d mock.MagicMock()"},{"line_number":88,"context_line":"        parsed_args.columns \u003d (\u0027Col1\u0027, \u0027Col2\u0027)"},{"line_number":89,"context_line":"        parsed_args.formatter \u003d \u0027test\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"bf8cb3f7_a62dc047","line":86,"range":{"start_line":86,"start_character":36,"end_line":86,"end_character":53},"in_reply_to":"bf8cb3f7_1545b4b3","updated":"2017-12-21 06:42:13.000000000","message":"Done","commit_id":"410124ff8071e93b57095caca8918e9f969b21f2"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8cbacd08874f6395ddaa0b70510e2818ff0a9e97","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def test_sort_by_column_cliff_side_procedure(self):"},{"line_number":86,"context_line":"        test_lister \u003d ExerciseLister(mock.MagicMock(), [])"},{"line_number":87,"context_line":"        parsed_args \u003d mock.MagicMock()"},{"line_number":88,"context_line":"        parsed_args.columns \u003d (\u0027Col1\u0027, \u0027Col2\u0027)"},{"line_number":89,"context_line":"        parsed_args.formatter \u003d \u0027test\u0027"},{"line_number":90,"context_line":"        parsed_args.sort_columns \u003d [\u0027Col2\u0027, \u0027Col1\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"bf8cb3f7_b52ac8e4","line":87,"range":{"start_line":87,"start_character":26,"end_line":87,"end_character":36},"updated":"2017-12-21 01:57:49.000000000","message":"Do we really need MagicMock()? If Mock() is enough, it is better to use Mock().","commit_id":"410124ff8071e93b57095caca8918e9f969b21f2"},{"author":{"_account_id":18446,"name":"vkulanov","email":"vitaliy@kulanov.org.ua","username":"vkulanov"},"change_message_id":"3dab8ab0c4571c3455d066fa73443c17a3380481","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def test_sort_by_column_cliff_side_procedure(self):"},{"line_number":86,"context_line":"        test_lister \u003d ExerciseLister(mock.MagicMock(), [])"},{"line_number":87,"context_line":"        parsed_args \u003d mock.MagicMock()"},{"line_number":88,"context_line":"        parsed_args.columns \u003d (\u0027Col1\u0027, \u0027Col2\u0027)"},{"line_number":89,"context_line":"        parsed_args.formatter \u003d \u0027test\u0027"},{"line_number":90,"context_line":"        parsed_args.sort_columns \u003d [\u0027Col2\u0027, \u0027Col1\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"bf8cb3f7_c63244a8","line":87,"range":{"start_line":87,"start_character":26,"end_line":87,"end_character":36},"in_reply_to":"bf8cb3f7_b52ac8e4","updated":"2017-12-21 06:42:13.000000000","message":"Done","commit_id":"410124ff8071e93b57095caca8918e9f969b21f2"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"7e869103757c3ae887c6dbcffe07f001b04dbfc0","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        parsed_args.formatter \u003d \u0027test\u0027"},{"line_number":90,"context_line":"        parsed_args.sort_columns \u003d [\u0027Col2\u0027, \u0027Col1\u0027]"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        test_lister.run(parsed_args)"},{"line_number":93,"context_line":"        f \u003d test_lister._formatter_plugins[\u0027test\u0027]"},{"line_number":94,"context_line":"        args \u003d f.args[0]"},{"line_number":95,"context_line":"        data \u003d list(args[1])"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf8cb3f7_80061986","line":92,"updated":"2017-12-27 06:28:00.000000000","message":"It would be nice if we have a blank line here between \"test run\" and \"check after run\".","commit_id":"47350099eb15e3767dc47885abe65f2e84c453d3"},{"author":{"_account_id":18446,"name":"vkulanov","email":"vitaliy@kulanov.org.ua","username":"vkulanov"},"change_message_id":"3ddb12f35a1380637417d38e7ee05f4ed6764077","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        parsed_args.formatter \u003d \u0027test\u0027"},{"line_number":90,"context_line":"        parsed_args.sort_columns \u003d [\u0027Col2\u0027, \u0027Col1\u0027]"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        test_lister.run(parsed_args)"},{"line_number":93,"context_line":"        f \u003d test_lister._formatter_plugins[\u0027test\u0027]"},{"line_number":94,"context_line":"        args \u003d f.args[0]"},{"line_number":95,"context_line":"        data \u003d list(args[1])"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf8cb3f7_5a2f99f5","line":92,"in_reply_to":"bf8cb3f7_80061986","updated":"2017-12-27 14:11:01.000000000","message":"Done","commit_id":"47350099eb15e3767dc47885abe65f2e84c453d3"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"7e869103757c3ae887c6dbcffe07f001b04dbfc0","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                (\u0027Col1\u0027, \u0027Col2\u0027), [[\u0027a\u0027, \u0027A\u0027], [\u0027b\u0027, \u0027B\u0027], [\u0027c\u0027, \u0027A\u0027]]"},{"line_number":121,"context_line":"            )"},{"line_number":122,"context_line":"            test_lister.run(parsed_args)"},{"line_number":123,"context_line":"            f \u003d test_lister._formatter_plugins[\u0027test\u0027]"},{"line_number":124,"context_line":"            args \u003d f.args[0]"},{"line_number":125,"context_line":"            data \u003d list(args[1])"},{"line_number":126,"context_line":"            self.assertEqual([[\u0027a\u0027], [\u0027c\u0027], [\u0027b\u0027]], data)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def test_sort_by_non_existing_column(self):"},{"line_number":129,"context_line":"        test_lister \u003d ExerciseLister(mock.Mock(), [])"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf8cb3f7_a0e0fdcd","line":126,"range":{"start_line":123,"start_character":11,"end_line":126,"end_character":57},"updated":"2017-12-27 06:28:00.000000000","message":"I think these lines can be out side of the with clause of mock.","commit_id":"47350099eb15e3767dc47885abe65f2e84c453d3"},{"author":{"_account_id":18446,"name":"vkulanov","email":"vitaliy@kulanov.org.ua","username":"vkulanov"},"change_message_id":"3ddb12f35a1380637417d38e7ee05f4ed6764077","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                (\u0027Col1\u0027, \u0027Col2\u0027), [[\u0027a\u0027, \u0027A\u0027], [\u0027b\u0027, \u0027B\u0027], [\u0027c\u0027, \u0027A\u0027]]"},{"line_number":121,"context_line":"            )"},{"line_number":122,"context_line":"            test_lister.run(parsed_args)"},{"line_number":123,"context_line":"            f \u003d test_lister._formatter_plugins[\u0027test\u0027]"},{"line_number":124,"context_line":"            args \u003d f.args[0]"},{"line_number":125,"context_line":"            data \u003d list(args[1])"},{"line_number":126,"context_line":"            self.assertEqual([[\u0027a\u0027], [\u0027c\u0027], [\u0027b\u0027]], data)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def test_sort_by_non_existing_column(self):"},{"line_number":129,"context_line":"        test_lister \u003d ExerciseLister(mock.Mock(), [])"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf8cb3f7_7adb7d1a","line":126,"range":{"start_line":123,"start_character":11,"end_line":126,"end_character":57},"in_reply_to":"bf8cb3f7_a0e0fdcd","updated":"2017-12-27 14:11:01.000000000","message":"Oh, sure","commit_id":"47350099eb15e3767dc47885abe65f2e84c453d3"}]}
