)]}'
{"neutron/db/migration/alembic_migrations/versions/4ddbe01fba06_add_source_port_range_min_max_to_.py":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"3fd3a291a477f74f922c3f5707c196e151cfe1ef","unresolved":false,"context_lines":[{"line_number":27,"context_line":"revision \u003d \u00274ddbe01fba06\u0027"},{"line_number":28,"context_line":"down_revision \u003d \u002749f5e553f61f\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"migration_for_plugins \u003d [\u0027*\u0027]"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"from alembic import op"},{"line_number":33,"context_line":"import sqlalchemy as sa"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2FqoM%3D","line":30,"updated":"2014-01-09 21:57:13.000000000","message":"Are you sure all plugins support security groups?","commit_id":"1757a232689fd8423da4ef15d9f823ebde509880"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"bb77964ace6f616d7ea7f4c6924981b32dc505d5","unresolved":false,"context_lines":[{"line_number":27,"context_line":"revision \u003d \u00274ddbe01fba06\u0027"},{"line_number":28,"context_line":"down_revision \u003d \u002749f5e553f61f\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"migration_for_plugins \u003d [\u0027*\u0027]"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"from alembic import op"},{"line_number":33,"context_line":"import sqlalchemy as sa"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2FWKg%3D","line":30,"in_reply_to":"AAAAUH%2F%2FqoM%3D","updated":"2014-01-14 19:46:44.000000000","message":"Done","commit_id":"1757a232689fd8423da4ef15d9f823ebde509880"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"d8ec34efa496ff33366cb20fdb45ee1d10ae4f4f","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    \u0027neutron.plugins.oneconvergence.plugin.OneConvergencePluginV2\u0027,"},{"line_number":37,"context_line":"    \u0027neutron.plugins.openvswitch.ovs_neutron_plugin.OVSNeutronPluginV2\u0027,"},{"line_number":38,"context_line":"    \u0027neutron.plugins.ryu.ryu_neutron_plugin.RyuNeutronPluginV2\u0027,"},{"line_number":39,"context_line":"    \u0027neutron.plugins.vmware.plugins.base.NsxPluginV2\u0027,"},{"line_number":40,"context_line":"]"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"from alembic import op"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FwRg%3D","line":39,"updated":"2014-04-17 17:32:50.000000000","message":"This should be like here:\n\nhttps://github.com/openstack/neutron/blob/master/neutron/db/migration/alembic_migrations/versions/1341ed32cc1e_nvp_netbinding_update.py","commit_id":"657ff81b6b4906ebde5fb2c9ea5c8316482f4126"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"a719270e2573124ed1e2fa27fd82799baae7a654","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":"#"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\"Add source-port-range-{min,max} to security groups"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Revision ID: 4ddbe01fba06"},{"line_number":19,"context_line":"Revises: 33c3db036fe4"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAXH%2F%2Fd4U%3D","line":16,"updated":"2014-04-21 15:07:55.000000000","message":"This line is too long for the file name and it stops at \"to_\" now.","commit_id":"9f60438f5769563a15aa9e9e17bd5d4efd7e6a59"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"c99d3054736fa5f9fa56e5a56434a455eb7dc946","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":"#"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\"Add source-port-range-{min,max} to security groups"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Revision ID: 4ddbe01fba06"},{"line_number":19,"context_line":"Revises: 33c3db036fe4"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAXH%2F%2Fdjk%3D","line":16,"in_reply_to":"AAAAXH%2F%2Fd4U%3D","updated":"2014-04-21 15:39:53.000000000","message":"Do you have a suggested new name? Is it an issue if the filename is incomplete and ending in an underscore?","commit_id":"9f60438f5769563a15aa9e9e17bd5d4efd7e6a59"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"9978b951e78697bc63b2deef92897c1f32cfbf6b","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":"#"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\"Add source-port-range-{min,max} to security groups"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Revision ID: 4ddbe01fba06"},{"line_number":19,"context_line":"Revises: 33c3db036fe4"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAXH%2F%2FXxI%3D","line":16,"in_reply_to":"AAAAXH%2F%2Fdjk%3D","updated":"2014-04-22 09:07:54.000000000","message":"I don\u0027t if it\u0027s an issue but it looks strange at least. what about \"Add source port range to SG\"?","commit_id":"9f60438f5769563a15aa9e9e17bd5d4efd7e6a59"}],"neutron/db/securitygroups_db.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a28579b563cca4f144569350807e0e9e73c2d462","unresolved":false,"context_lines":[{"line_number":314,"context_line":"                raise ext_sg.SecurityGroupInvalidPortRange("},{"line_number":315,"context_line":"                    key_min\u003dkey_min, key_max\u003dkey_max)"},{"line_number":316,"context_line":"        elif ip_proto \u003d\u003d constants.PROTO_NUM_ICMP:"},{"line_number":317,"context_line":"            for attr, field in [(key_min, \u0027type\u0027), (key_max, \u0027code\u0027)]:"},{"line_number":318,"context_line":"                if rule[attr] \u003e 255:"},{"line_number":319,"context_line":"                    raise ext_sg.SecurityGroupInvalidIcmpValue("},{"line_number":320,"context_line":"                        field\u003dfield, attr\u003dattr, value\u003drule[attr])"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F9gOQ%3D","line":317,"updated":"2014-02-06 13:36:43.000000000","message":"Does it have a meaning to check ICMP type/code for source port range. In my understanding, source port range attributes are only valid for TCP/UDP. If so, it is better to raise BadRequest for ICMP and source port range are both specified.","commit_id":"6976b1a033fda3f291c66fe7501a4a7ba90119ec"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"a719270e2573124ed1e2fa27fd82799baae7a654","unresolved":false,"context_lines":[{"line_number":300,"context_line":"            return"},{"line_number":301,"context_line":"        return IP_PROTOCOL_MAP.get(protocol, protocol)"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    def _validate_port_range(self, rule, key_min, key_max):"},{"line_number":304,"context_line":"        \"\"\"Check that port_range is valid.\"\"\""},{"line_number":305,"context_line":"        if rule.get(key_min) is None and rule.get(key_max) is None:"},{"line_number":306,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAXH%2F%2FeBM%3D","line":303,"updated":"2014-04-21 15:07:55.000000000","message":"Why key_min and key_max need to be added to the params?  Seems line 339 is the only place _validate_port_range is called.","commit_id":"9f60438f5769563a15aa9e9e17bd5d4efd7e6a59"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"9978b951e78697bc63b2deef92897c1f32cfbf6b","unresolved":false,"context_lines":[{"line_number":300,"context_line":"            return"},{"line_number":301,"context_line":"        return IP_PROTOCOL_MAP.get(protocol, protocol)"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    def _validate_port_range(self, rule, key_min, key_max):"},{"line_number":304,"context_line":"        \"\"\"Check that port_range is valid.\"\"\""},{"line_number":305,"context_line":"        if rule.get(key_min) is None and rule.get(key_max) is None:"},{"line_number":306,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAXH%2F%2FXvk%3D","line":303,"in_reply_to":"AAAAXH%2F%2FdiA%3D","updated":"2014-04-22 09:07:54.000000000","message":"Yeah. I see. it makes sense.","commit_id":"9f60438f5769563a15aa9e9e17bd5d4efd7e6a59"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"c99d3054736fa5f9fa56e5a56434a455eb7dc946","unresolved":false,"context_lines":[{"line_number":300,"context_line":"            return"},{"line_number":301,"context_line":"        return IP_PROTOCOL_MAP.get(protocol, protocol)"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    def _validate_port_range(self, rule, key_min, key_max):"},{"line_number":304,"context_line":"        \"\"\"Check that port_range is valid.\"\"\""},{"line_number":305,"context_line":"        if rule.get(key_min) is None and rule.get(key_max) is None:"},{"line_number":306,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAXH%2F%2FdiA%3D","line":303,"in_reply_to":"AAAAXH%2F%2FeBM%3D","updated":"2014-04-21 15:39:53.000000000","message":"It\u0027s called in the subclass.","commit_id":"9f60438f5769563a15aa9e9e17bd5d4efd7e6a59"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"df794a5045184be9194df2fc0117f72dc7245387","unresolved":false,"context_lines":[{"line_number":308,"context_line":"            raise ext_sg.SecurityGroupProtocolRequiredWithPorts()"},{"line_number":309,"context_line":"        ip_proto \u003d self._get_ip_proto_number(rule[\u0027protocol\u0027])"},{"line_number":310,"context_line":"        if ip_proto in [constants.PROTO_NUM_TCP, constants.PROTO_NUM_UDP]:"},{"line_number":311,"context_line":"            if rule[key_min] is not None and rule[key_min] \u003c\u003d rule[key_max]:"},{"line_number":312,"context_line":"                pass"},{"line_number":313,"context_line":"            else:"},{"line_number":314,"context_line":"                raise ext_sg.SecurityGroupInvalidPortRange("}],"source_content_type":"text/x-python","patch_set":7,"id":"7adec928_c1866e13","line":311,"updated":"2014-05-21 09:16:46.000000000","message":"Suggestion only: Since you\u0027re working with this line, maybe:\n\n if rule[key_min] is None or rule[key_min] \u003e rule[key_max]:\n     raise ext_sg.SecurityGroupInvalidPortRange(\n         key_min\u003dkey_min, key_max\u003dkey_max)","commit_id":"d918cef88984fafb05f9b60fac8e11614d0b2beb"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"df794a5045184be9194df2fc0117f72dc7245387","unresolved":false,"context_lines":[{"line_number":314,"context_line":"                raise ext_sg.SecurityGroupInvalidPortRange("},{"line_number":315,"context_line":"                    key_min\u003dkey_min, key_max\u003dkey_max)"},{"line_number":316,"context_line":"        elif ip_proto \u003d\u003d constants.PROTO_NUM_ICMP:"},{"line_number":317,"context_line":"            for attr, field in [(key_min, \u0027type\u0027), (key_max, \u0027code\u0027)]:"},{"line_number":318,"context_line":"                if rule[attr] \u003e 255:"},{"line_number":319,"context_line":"                    raise ext_sg.SecurityGroupInvalidIcmpValue("},{"line_number":320,"context_line":"                        field\u003dfield, attr\u003dattr, value\u003drule[attr])"}],"source_content_type":"text/x-python","patch_set":7,"id":"7adec928_a1c962ae","line":317,"updated":"2014-05-21 09:16:46.000000000","message":"Is source_port_range_min/max valid for ICMP?","commit_id":"d918cef88984fafb05f9b60fac8e11614d0b2beb"}],"neutron/db/securitygroups_source_port_db.py":[{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"a719270e2573124ed1e2fa27fd82799baae7a654","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        for rulebody in sgr:"},{"line_number":35,"context_line":"            rule \u003d rulebody[\u0027security_group_rule\u0027]"},{"line_number":36,"context_line":"            rule[\u0027source_port_range_min\u0027] \u003d rule.get(\u0027source_port_range_min\u0027)"},{"line_number":37,"context_line":"            rule[\u0027source_port_range_max\u0027] \u003d rule.get(\u0027source_port_range_max\u0027)"},{"line_number":38,"context_line":"        return super(SecurityGroupSourcePort, self)._check_for_duplicate_rules("},{"line_number":39,"context_line":"            context, sgr)"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAXH%2F%2FfhA%3D","line":37,"updated":"2014-04-21 15:07:55.000000000","message":"Why it is needed to assign the value of source_port_range_min and source_port_range_max to itself?  Is it for adding None values to the dict? How can it help for duplication checking?","commit_id":"9f60438f5769563a15aa9e9e17bd5d4efd7e6a59"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"d962bbf9ac133428b3cd7d899839747fb57aee2b","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        for rulebody in sgr:"},{"line_number":35,"context_line":"            rule \u003d rulebody[\u0027security_group_rule\u0027]"},{"line_number":36,"context_line":"            rule[\u0027source_port_range_min\u0027] \u003d rule.get(\u0027source_port_range_min\u0027)"},{"line_number":37,"context_line":"            rule[\u0027source_port_range_max\u0027] \u003d rule.get(\u0027source_port_range_max\u0027)"},{"line_number":38,"context_line":"        return super(SecurityGroupSourcePort, self)._check_for_duplicate_rules("},{"line_number":39,"context_line":"            context, sgr)"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAXX%2F%2F%2BRs%3D","line":37,"in_reply_to":"AAAAXH%2F%2FXqE%3D","updated":"2014-04-24 22:48:01.000000000","message":"That\u0027s not the point of _make_security_group_rule_filter_dict. Read arosen\u0027s note in SecurityGroupDbMixin._check_for_duplicate_rules.","commit_id":"9f60438f5769563a15aa9e9e17bd5d4efd7e6a59"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"9978b951e78697bc63b2deef92897c1f32cfbf6b","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        for rulebody in sgr:"},{"line_number":35,"context_line":"            rule \u003d rulebody[\u0027security_group_rule\u0027]"},{"line_number":36,"context_line":"            rule[\u0027source_port_range_min\u0027] \u003d rule.get(\u0027source_port_range_min\u0027)"},{"line_number":37,"context_line":"            rule[\u0027source_port_range_max\u0027] \u003d rule.get(\u0027source_port_range_max\u0027)"},{"line_number":38,"context_line":"        return super(SecurityGroupSourcePort, self)._check_for_duplicate_rules("},{"line_number":39,"context_line":"            context, sgr)"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAXH%2F%2FXqE%3D","line":37,"in_reply_to":"AAAAXH%2F%2Fdio%3D","updated":"2014-04-22 09:07:54.000000000","message":"then can this step be moved to _make_security_group_rule_filter_dict at line 58 which is called before rule comparison in superclass _check_for_duplicate_rules?","commit_id":"9f60438f5769563a15aa9e9e17bd5d4efd7e6a59"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"c99d3054736fa5f9fa56e5a56434a455eb7dc946","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        for rulebody in sgr:"},{"line_number":35,"context_line":"            rule \u003d rulebody[\u0027security_group_rule\u0027]"},{"line_number":36,"context_line":"            rule[\u0027source_port_range_min\u0027] \u003d rule.get(\u0027source_port_range_min\u0027)"},{"line_number":37,"context_line":"            rule[\u0027source_port_range_max\u0027] \u003d rule.get(\u0027source_port_range_max\u0027)"},{"line_number":38,"context_line":"        return super(SecurityGroupSourcePort, self)._check_for_duplicate_rules("},{"line_number":39,"context_line":"            context, sgr)"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAXH%2F%2Fdio%3D","line":37,"in_reply_to":"AAAAXH%2F%2FfhA%3D","updated":"2014-04-21 15:39:53.000000000","message":"Right, if the key is not in the dictionary it will be set to None. This is necessary when the superclass method compares the request rule body to the models in the database.","commit_id":"9f60438f5769563a15aa9e9e17bd5d4efd7e6a59"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"c99d3054736fa5f9fa56e5a56434a455eb7dc946","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        for rules in security_group_rule[\u0027security_group_rules\u0027]:"},{"line_number":44,"context_line":"            rule \u003d rules.get(\u0027security_group_rule\u0027)"},{"line_number":45,"context_line":"            self._validate_port_range("},{"line_number":46,"context_line":"                rule, \u0027source_port_range_min\u0027, \u0027source_port_range_max\u0027)"},{"line_number":47,"context_line":"        return sclass._validate_security_group_rules("},{"line_number":48,"context_line":"            context, security_group_rule)"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAXH%2F%2FdiU%3D","line":46,"updated":"2014-04-21 15:39:53.000000000","message":"Called here.","commit_id":"9f60438f5769563a15aa9e9e17bd5d4efd7e6a59"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"df794a5045184be9194df2fc0117f72dc7245387","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    def _check_for_duplicate_rules(self, context, sgr):"},{"line_number":34,"context_line":"        for rulebody in sgr:"},{"line_number":35,"context_line":"            rule \u003d rulebody[\u0027security_group_rule\u0027]"},{"line_number":36,"context_line":"            rule[\u0027source_port_range_min\u0027] \u003d rule.get(\u0027source_port_range_min\u0027)"},{"line_number":37,"context_line":"            rule[\u0027source_port_range_max\u0027] \u003d rule.get(\u0027source_port_range_max\u0027)"},{"line_number":38,"context_line":"        return super(SecurityGroupSourcePort, self)._check_for_duplicate_rules("},{"line_number":39,"context_line":"            context, sgr)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7adec928_7f1b0073","line":36,"updated":"2014-05-21 09:16:46.000000000","message":"rule.setdefault(\u0027source_port_range_min\u0027)","commit_id":"d918cef88984fafb05f9b60fac8e11614d0b2beb"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"df794a5045184be9194df2fc0117f72dc7245387","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        for rulebody in sgr:"},{"line_number":35,"context_line":"            rule \u003d rulebody[\u0027security_group_rule\u0027]"},{"line_number":36,"context_line":"            rule[\u0027source_port_range_min\u0027] \u003d rule.get(\u0027source_port_range_min\u0027)"},{"line_number":37,"context_line":"            rule[\u0027source_port_range_max\u0027] \u003d rule.get(\u0027source_port_range_max\u0027)"},{"line_number":38,"context_line":"        return super(SecurityGroupSourcePort, self)._check_for_duplicate_rules("},{"line_number":39,"context_line":"            context, sgr)"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7adec928_9f18cc76","line":37,"updated":"2014-05-21 09:16:46.000000000","message":"Ditto","commit_id":"d918cef88984fafb05f9b60fac8e11614d0b2beb"}],"neutron/extensions/securitygroup_source_port.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"df794a5045184be9194df2fc0117f72dc7245387","unresolved":false,"context_lines":[{"line_number":31,"context_line":"}"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class Securitygroup_source_port(extensions.ExtensionDescriptor):"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    @classmethod"},{"line_number":37,"context_line":"    def get_name(cls):"}],"source_content_type":"text/x-python","patch_set":7,"id":"7adec928_6103da76","line":34,"updated":"2014-05-21 09:16:46.000000000","message":"class SecuritygroupSourcePort(","commit_id":"d918cef88984fafb05f9b60fac8e11614d0b2beb"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"df794a5045184be9194df2fc0117f72dc7245387","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def get_extended_resources(self, version):"},{"line_number":62,"context_line":"        if version \u003d\u003d \"2.0\":"},{"line_number":63,"context_line":"            return dict(EXTENDED_ATTRIBUTES_2_0.items())"},{"line_number":64,"context_line":"        else:"},{"line_number":65,"context_line":"            return {}"}],"source_content_type":"text/x-python","patch_set":7,"id":"7adec928_817d46ea","line":63,"updated":"2014-05-21 09:16:46.000000000","message":"I don\u0027t understand this, what is the difference with\n\n return EXTENDED_ATTRIBUTES_2_0\n\n?","commit_id":"d918cef88984fafb05f9b60fac8e11614d0b2beb"}]}
