)]}'
{"neutron/agent/linux/ip_lib.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"5a788cbb9fed218f380548e0dfb8e67a1ed7ab4f","unresolved":false,"context_lines":[{"line_number":339,"context_line":"        settings \u003d {k: v for k, v in zip(parts[1::2], parts[2::2])}"},{"line_number":340,"context_line":"        settings[\u0027priority\u0027] \u003d parts[0][:-1]"},{"line_number":341,"context_line":"        if len(parts) % 2 \u003d\u003d 0:"},{"line_number":342,"context_line":"            settings[\u0027type\u0027] \u003d parts[-1]"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"        return self._make_canonical(ip_version, settings)"},{"line_number":345,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"da20952f_e019bd23","line":342,"updated":"2015-09-02 14:03:50.000000000","message":"I had to read the man page and run some \u0027ip rule add...\u0027 commands to figure this out :) so probably worthy of a comment.  And in the case where there are an odd number of arguments, it looks like it\u0027s type \u0027unicast\u0027, should that be in an else clause or does it mess other things up?\n\n--\u003e ip rule add type unicast\n--\u003e ip rule\n0:\tfrom all lookup local \n32765:\tfrom all lookup 1 \u003c--- that was added\n32766:\tfrom all lookup main \n32767:\tfrom all lookup default","commit_id":"8c5a7be565073cfc907a7d6ac48d958ab67030a6"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"5135fae33262fd41b466c2d779b804073305823e","unresolved":false,"context_lines":[{"line_number":339,"context_line":"        settings \u003d {k: v for k, v in zip(parts[1::2], parts[2::2])}"},{"line_number":340,"context_line":"        settings[\u0027priority\u0027] \u003d parts[0][:-1]"},{"line_number":341,"context_line":"        if len(parts) % 2 \u003d\u003d 0:"},{"line_number":342,"context_line":"            settings[\u0027type\u0027] \u003d parts[-1]"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"        return self._make_canonical(ip_version, settings)"},{"line_number":345,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"da20952f_991dce68","line":342,"in_reply_to":"da20952f_e019bd23","updated":"2015-09-02 20:36:29.000000000","message":"Fair enough.  Honestly, reading this code now even I forget what this is for.  I\u0027ll add a good comment (once I figure it out again).\n\nAlso, good point about the unicast thing.  If a python caller tries to add a rule explicitly passing \u0027type\u0027: \u0027unicast\u0027 then it will fail to compare with any existing rule.  I\u0027ll change this.","commit_id":"8c5a7be565073cfc907a7d6ac48d958ab67030a6"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"5a788cbb9fed218f380548e0dfb8e67a1ed7ab4f","unresolved":false,"context_lines":[{"line_number":342,"context_line":"            settings[\u0027type\u0027] \u003d parts[-1]"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"        return self._make_canonical(ip_version, settings)"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"    def list_rules(self, ip_version):"},{"line_number":347,"context_line":"        lines \u003d self._as_root([ip_version], [\u0027show\u0027]).splitlines()"},{"line_number":348,"context_line":"        return [self._parse_line(ip_version, line) for line in lines]"}],"source_content_type":"text/x-python","patch_set":4,"id":"da20952f_2fcec683","line":345,"updated":"2015-09-02 14:03:50.000000000","message":"nit: should this be _list_rules() if it\u0027s only used locally?","commit_id":"8c5a7be565073cfc907a7d6ac48d958ab67030a6"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"5135fae33262fd41b466c2d779b804073305823e","unresolved":false,"context_lines":[{"line_number":342,"context_line":"            settings[\u0027type\u0027] \u003d parts[-1]"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"        return self._make_canonical(ip_version, settings)"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"    def list_rules(self, ip_version):"},{"line_number":347,"context_line":"        lines \u003d self._as_root([ip_version], [\u0027show\u0027]).splitlines()"},{"line_number":348,"context_line":"        return [self._parse_line(ip_version, line) for line in lines]"}],"source_content_type":"text/x-python","patch_set":4,"id":"da20952f_64061c22","line":345,"in_reply_to":"da20952f_2fcec683","updated":"2015-09-02 20:36:29.000000000","message":"A future address scopes patch will use it.  Plus, I thought it would be good to have a public list to go along with the add and delete.","commit_id":"8c5a7be565073cfc907a7d6ac48d958ab67030a6"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"5faca8c8ed1ec1a4855d40dc868fbef136447eff","unresolved":false,"context_lines":[{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    @staticmethod"},{"line_number":292,"context_line":"    def _make_canonical(ip_version, settings):"},{"line_number":293,"context_line":"        \"\"\"Converts settings to a canonical represention to compare easily\"\"\""},{"line_number":294,"context_line":"        def canonicalize_fwmark_string(thing):"},{"line_number":295,"context_line":"            if isinstance(thing, six.string_types):"},{"line_number":296,"context_line":"                iterable \u003d thing.split(\u0027/\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"da20952f_5ce924b6","line":293,"updated":"2015-09-04 00:58:40.000000000","message":"+1. It looks like it can take a string in which case it\u0027s split on a slash, otherwise it might be an iterable, but if it\u0027s not it\u0027s converted into one...\n\nit doesn\u0027t help that it\u0027s called \u0027thing\u0027 either :)","commit_id":"0cf9e04f6296ddd2606a4e411556dcad93d313ca"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"2bc3cfcb019c46731cd21a93e3befa1319b15c05","unresolved":false,"context_lines":[{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    @staticmethod"},{"line_number":292,"context_line":"    def _make_canonical(ip_version, settings):"},{"line_number":293,"context_line":"        \"\"\"Converts settings to a canonical represention to compare easily\"\"\""},{"line_number":294,"context_line":"        def canonicalize_fwmark_string(thing):"},{"line_number":295,"context_line":"            if isinstance(thing, six.string_types):"},{"line_number":296,"context_line":"                iterable \u003d thing.split(\u0027/\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"da20952f_c3a47a4c","line":293,"updated":"2015-09-03 20:58:02.000000000","message":"A example in _make_canonical/canicalize_fwmark_string/canicalize docstring would be great","commit_id":"0cf9e04f6296ddd2606a4e411556dcad93d313ca"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66eddaa3b4ef12881ae76ec2525103db60f5e43f","unresolved":false,"context_lines":[{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    @staticmethod"},{"line_number":292,"context_line":"    def _make_canonical(ip_version, settings):"},{"line_number":293,"context_line":"        \"\"\"Converts settings to a canonical represention to compare easily\"\"\""},{"line_number":294,"context_line":"        def canonicalize_fwmark_string(thing):"},{"line_number":295,"context_line":"            if isinstance(thing, six.string_types):"},{"line_number":296,"context_line":"                iterable \u003d thing.split(\u0027/\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"da20952f_fb33a760","line":293,"in_reply_to":"da20952f_5ce924b6","updated":"2015-09-09 16:40:13.000000000","message":"Done\n\nI admit that calling it thing was a bit of a cop out because I couldn\u0027t think of a really good name.","commit_id":"0cf9e04f6296ddd2606a4e411556dcad93d313ca"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"2bc3cfcb019c46731cd21a93e3befa1319b15c05","unresolved":false,"context_lines":[{"line_number":302,"context_line":""},{"line_number":303,"context_line":"            def to_i(s):"},{"line_number":304,"context_line":"                if isinstance(s, six.string_types):"},{"line_number":305,"context_line":"                    return int(s, 0)"},{"line_number":306,"context_line":"                return int(s)"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"            integers \u003d list(map(to_i, iterable))"}],"source_content_type":"text/x-python","patch_set":5,"id":"da20952f_03259207","line":305,"updated":"2015-09-03 20:58:02.000000000","message":"is int(x, 0) common? perhaps we could add a comment to explain it deduce the base from s","commit_id":"0cf9e04f6296ddd2606a4e411556dcad93d313ca"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66eddaa3b4ef12881ae76ec2525103db60f5e43f","unresolved":false,"context_lines":[{"line_number":302,"context_line":""},{"line_number":303,"context_line":"            def to_i(s):"},{"line_number":304,"context_line":"                if isinstance(s, six.string_types):"},{"line_number":305,"context_line":"                    return int(s, 0)"},{"line_number":306,"context_line":"                return int(s)"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"            integers \u003d list(map(to_i, iterable))"}],"source_content_type":"text/x-python","patch_set":5,"id":"da20952f_dbf2639b","line":305,"in_reply_to":"da20952f_03259207","updated":"2015-09-09 16:40:13.000000000","message":"Done","commit_id":"0cf9e04f6296ddd2606a4e411556dcad93d313ca"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"5faca8c8ed1ec1a4855d40dc868fbef136447eff","unresolved":false,"context_lines":[{"line_number":305,"context_line":"                    return int(s, 0)"},{"line_number":306,"context_line":"                return int(s)"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"            integers \u003d list(map(to_i, iterable))"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"            if len(integers) \u003d\u003d 1:"},{"line_number":311,"context_line":"                integers.append(0xffffffff)"}],"source_content_type":"text/x-python","patch_set":5,"id":"da20952f_fcd278ff","line":308,"updated":"2015-09-04 00:58:40.000000000","message":"+1. or at least get rid of the extra list call","commit_id":"0cf9e04f6296ddd2606a4e411556dcad93d313ca"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"2bc3cfcb019c46731cd21a93e3befa1319b15c05","unresolved":false,"context_lines":[{"line_number":305,"context_line":"                    return int(s, 0)"},{"line_number":306,"context_line":"                return int(s)"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"            integers \u003d list(map(to_i, iterable))"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"            if len(integers) \u003d\u003d 1:"},{"line_number":311,"context_line":"                integers.append(0xffffffff)"}],"source_content_type":"text/x-python","patch_set":5,"id":"da20952f_433dcadb","line":308,"updated":"2015-09-03 20:58:02.000000000","message":"[to_i(x) for x in iterable] is more common","commit_id":"0cf9e04f6296ddd2606a4e411556dcad93d313ca"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66eddaa3b4ef12881ae76ec2525103db60f5e43f","unresolved":false,"context_lines":[{"line_number":305,"context_line":"                    return int(s, 0)"},{"line_number":306,"context_line":"                return int(s)"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"            integers \u003d list(map(to_i, iterable))"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"            if len(integers) \u003d\u003d 1:"},{"line_number":311,"context_line":"                integers.append(0xffffffff)"}],"source_content_type":"text/x-python","patch_set":5,"id":"da20952f_9bd5cbe6","line":308,"in_reply_to":"da20952f_fcd278ff","updated":"2015-09-09 16:40:13.000000000","message":"I added the extra list call to appease python 3 because the result of map is not a list anymore and len doesn\u0027t work on it.  I added it after the fact and it didn\u0027t occur to me to change it to a list comprehension at that point.  A list comprehension is better.","commit_id":"0cf9e04f6296ddd2606a4e411556dcad93d313ca"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"5faca8c8ed1ec1a4855d40dc868fbef136447eff","unresolved":false,"context_lines":[{"line_number":307,"context_line":""},{"line_number":308,"context_line":"            integers \u003d list(map(to_i, iterable))"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"            if len(integers) \u003d\u003d 1:"},{"line_number":311,"context_line":"                integers.append(0xffffffff)"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"            return \u0027/\u0027.join(map(hex, integers))"}],"source_content_type":"text/x-python","patch_set":5,"id":"da20952f_1cd08cf5","line":310,"updated":"2015-09-04 00:58:40.000000000","message":"comment here about why 1 integer gets a max 32 bit would be nice","commit_id":"0cf9e04f6296ddd2606a4e411556dcad93d313ca"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66eddaa3b4ef12881ae76ec2525103db60f5e43f","unresolved":false,"context_lines":[{"line_number":307,"context_line":""},{"line_number":308,"context_line":"            integers \u003d list(map(to_i, iterable))"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"            if len(integers) \u003d\u003d 1:"},{"line_number":311,"context_line":"                integers.append(0xffffffff)"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"            return \u0027/\u0027.join(map(hex, integers))"}],"source_content_type":"text/x-python","patch_set":5,"id":"da20952f_3b035f78","line":310,"in_reply_to":"da20952f_1cd08cf5","updated":"2015-09-09 16:40:13.000000000","message":"Done","commit_id":"0cf9e04f6296ddd2606a4e411556dcad93d313ca"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"2bc3cfcb019c46731cd21a93e3befa1319b15c05","unresolved":false,"context_lines":[{"line_number":347,"context_line":""},{"line_number":348,"context_line":"        return self._make_canonical(ip_version, settings)"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"    def list_rules(self, ip_version):"},{"line_number":351,"context_line":"        lines \u003d self._as_root([ip_version], [\u0027show\u0027]).splitlines()"},{"line_number":352,"context_line":"        return [self._parse_line(ip_version, line) for line in lines]"},{"line_number":353,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"da20952f_5e75a195","line":350,"updated":"2015-09-03 20:58:02.000000000","message":"iiuc, list_rules is only used by _exists so list_rules should be private?","commit_id":"0cf9e04f6296ddd2606a4e411556dcad93d313ca"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"2bc3cfcb019c46731cd21a93e3befa1319b15c05","unresolved":false,"context_lines":[{"line_number":352,"context_line":"        return [self._parse_line(ip_version, line) for line in lines]"},{"line_number":353,"context_line":""},{"line_number":354,"context_line":"    def _exists(self, ip_version, **kwargs):"},{"line_number":355,"context_line":"        return kwargs in self.list_rules(ip_version)"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"    def _make__flat_args_tuple(self, *args, **kwargs):"},{"line_number":358,"context_line":"        for kwargs_item in sorted(kwargs.items(), key\u003dlambda i: i[0]):"}],"source_content_type":"text/x-python","patch_set":5,"id":"da20952f_1e55e9c0","line":355,"updated":"2015-09-03 20:58:02.000000000","message":"we parse every line before checking if kwargs  is equals to one of them. We can be lazy by returning an iterator in list_rules and:\n\n def _exits(...):\n  return any(kwargs \u003d\u003d rule for rule in self.list_rules)","commit_id":"0cf9e04f6296ddd2606a4e411556dcad93d313ca"}]}
