)]}'
{"neutronclient/common/validators.py":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"86ab34acdf3781b4ad42d7f598d8ac8aff15b80c","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    raise exceptions.CommandError(msg)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"def validate_ip_subnet(parsed_args, attr_name):"},{"line_number":61,"context_line":"    val \u003d getattr(parsed_args, attr_name)"},{"line_number":62,"context_line":"    if not val:"},{"line_number":63,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAW3%2F%2FfPU%3D","line":60,"updated":"2014-04-14 09:26:34.000000000","message":"_validate_subnet in Neutron code base (neutron/api/v2/attrubutes.py) is a bit more advanced than this one. Can you please briefly describe the need for validators on the client side?","commit_id":"639a5487635cd8ded28ce47c01bf8fdd597d01ec"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"cf7d606738995e2be0ebd16a101d1cdd09d6ca29","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    raise exceptions.CommandError(msg)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"def validate_ip_subnet(parsed_args, attr_name):"},{"line_number":61,"context_line":"    val \u003d getattr(parsed_args, attr_name)"},{"line_number":62,"context_line":"    if not val:"},{"line_number":63,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAXH%2F%2FvqI%3D","line":60,"in_reply_to":"AAAAW3%2F%2FfPU%3D","updated":"2014-04-18 09:03:13.000000000","message":"I think the role of client-side validation is to check basic format validation before calling API to avoid unnecessary API calls. It is preliminary check and it is better to be more loose than server-side validation (server side validation checks more strictly and may change). We can avoid to change client-side validation every time there is a change in server side and still do preliminary format check. \n\nAnother reason is that I can provide more descriptive error message (e.g. option name). When using CLI, I sometimes type wrong parameters and pre-check helps me.\n\n\nOf cource an counter idea is to do all validations on the server side. we can avoid code duplication by doing so.\n\nHorizon does the similar preliminary validation in web server side from the same background. VPN-related CLI have the similar one.\n\nThis is what I think. Not a strong opinion.\nIs it better to remove it and defer the validation to the server side?","commit_id":"639a5487635cd8ded28ce47c01bf8fdd597d01ec"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"ef63f21aee78284f76a96a628450769ab56ccc3a","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    raise exceptions.CommandError(msg)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"def validate_ip_subnet(parsed_args, attr_name):"},{"line_number":61,"context_line":"    val \u003d getattr(parsed_args, attr_name)"},{"line_number":62,"context_line":"    if not val:"},{"line_number":63,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAXH%2F%2FrdY%3D","line":60,"in_reply_to":"AAAAXH%2F%2FvqI%3D","updated":"2014-04-18 09:46:16.000000000","message":"Thanks for the detailed clarification on this Akihiro! I think preliminary check basic format on the client side before calling API to avoid unnecessary API calls makes sence","commit_id":"639a5487635cd8ded28ce47c01bf8fdd597d01ec"}],"neutronclient/neutron/v2_0/nec/packetfilter.py":[{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"ed3e7b0b58b7f2de1cb1352e779736959d0e0645","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            if d.get(\u0027protocol\u0027):"},{"line_number":38,"context_line":"                proto_eth_type.append(\u0027protocol: %s\u0027 % d[\u0027protocol\u0027].upper())"},{"line_number":39,"context_line":"            if d.get(\u0027eth_type\u0027):"},{"line_number":40,"context_line":"                proto_eth_type.append(\u0027eth_type: %s\u0027 % d[\u0027eth_type\u0027])"},{"line_number":41,"context_line":"            if proto_eth_type:"},{"line_number":42,"context_line":"                val.append(\u0027, \u0027.join(proto_eth_type))"},{"line_number":43,"context_line":"            val.append(\u0027network: \u0027 + d[\u0027network_id\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAWH%2F%2FZpU%3D","line":40,"updated":"2014-03-18 05:13:34.000000000","message":"no upper here?","commit_id":"125aa1db49324d5deb673e9497bf5f4a7306be0b"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"b874c56e0a698b9bd1306c17f875de44772dac1a","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            if d.get(\u0027protocol\u0027):"},{"line_number":38,"context_line":"                proto_eth_type.append(\u0027protocol: %s\u0027 % d[\u0027protocol\u0027].upper())"},{"line_number":39,"context_line":"            if d.get(\u0027eth_type\u0027):"},{"line_number":40,"context_line":"                proto_eth_type.append(\u0027eth_type: %s\u0027 % d[\u0027eth_type\u0027])"},{"line_number":41,"context_line":"            if proto_eth_type:"},{"line_number":42,"context_line":"                val.append(\u0027, \u0027.join(proto_eth_type))"},{"line_number":43,"context_line":"            val.append(\u0027network: \u0027 + d[\u0027network_id\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAWH%2F%2FRq0%3D","line":40,"in_reply_to":"AAAAWH%2F%2FZpU%3D","updated":"2014-03-19 05:20:58.000000000","message":"This is an integer field unlike security-group.... It accepts decimal and hex integers and upper is unnecessary.","commit_id":"125aa1db49324d5deb673e9497bf5f4a7306be0b"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"ed3e7b0b58b7f2de1cb1352e779736959d0e0645","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                \u0027min\u0027: min, \u0027max\u0027: max})"},{"line_number":188,"context_line":"        raise exceptions.CommandError(msg)"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def _validate_ip_address(self, parsed_args, name):"},{"line_number":191,"context_line":"        val \u003d getattr(parsed_args, name)"},{"line_number":192,"context_line":"        if not val:"},{"line_number":193,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAWH%2F%2FZow%3D","line":190,"updated":"2014-03-18 05:13:34.000000000","message":"I wonder if we should pull this method out of here to common and leverage it else where as well to do verification on the client side.","commit_id":"125aa1db49324d5deb673e9497bf5f4a7306be0b"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"b874c56e0a698b9bd1306c17f875de44772dac1a","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                \u0027min\u0027: min, \u0027max\u0027: max})"},{"line_number":188,"context_line":"        raise exceptions.CommandError(msg)"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def _validate_ip_address(self, parsed_args, name):"},{"line_number":191,"context_line":"        val \u003d getattr(parsed_args, name)"},{"line_number":192,"context_line":"        if not val:"},{"line_number":193,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAWH%2F%2FRpY%3D","line":190,"in_reply_to":"AAAAWH%2F%2FZow%3D","updated":"2014-03-19 05:20:58.000000000","message":"Thanks for the suggestion. VPNaaS client introduces client side validation and this is the second. validate_ip_address and validate_int_range are good candidates of common validators.\n\nI need to rebase the patch. It is a good chance to move them to more common place.","commit_id":"125aa1db49324d5deb673e9497bf5f4a7306be0b"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"86ab34acdf3781b4ad42d7f598d8ac8aff15b80c","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class ListPacketFilter(neutronV20.ListCommand):"},{"line_number":25,"context_line":"    \"\"\"List networks that belong to a given tenant.\"\"\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    resource \u003d \u0027packet_filter\u0027"},{"line_number":28,"context_line":"    log \u003d logging.getLogger(__name__ + \u0027.ListPacketFilter\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAW3%2F%2FfNk%3D","line":25,"updated":"2014-04-14 09:26:34.000000000","message":"docstring needs to be updated","commit_id":"639a5487635cd8ded28ce47c01bf8fdd597d01ec"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"cf7d606738995e2be0ebd16a101d1cdd09d6ca29","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class ListPacketFilter(neutronV20.ListCommand):"},{"line_number":25,"context_line":"    \"\"\"List networks that belong to a given tenant.\"\"\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    resource \u003d \u0027packet_filter\u0027"},{"line_number":28,"context_line":"    log \u003d logging.getLogger(__name__ + \u0027.ListPacketFilter\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAXH%2F%2Fv2I%3D","line":25,"in_reply_to":"AAAAW3%2F%2FfNk%3D","updated":"2014-04-18 09:03:13.000000000","message":"Thanks. Done.","commit_id":"639a5487635cd8ded28ce47c01bf8fdd597d01ec"}],"neutronclient/neutron/v2_0/packetfilter.py":[{"author":{"_account_id":6676,"name":"zqfan","email":"aji.zqfan@gmail.com","username":"aji-zqfan"},"change_message_id":"24f90094e3300b29af8fe050280abd616bdc4275","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2012 OpenStack LLC."},{"line_number":2,"context_line":"# All Rights Reserved"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATH%2F%2F7o4%3D","line":1,"updated":"2013-10-07 21:17:57.000000000","message":"and should be OpenStack Foundation","commit_id":"a693ea54267b108fe4a283f097ce8c9bd507dd86"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"d413742ce4e6f73e9134996c78e02363e97da97f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2012 OpenStack LLC."},{"line_number":2,"context_line":"# All Rights Reserved"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATH%2F%2F8bY%3D","line":1,"updated":"2013-10-07 17:43:41.000000000","message":"should this be 2013?","commit_id":"a693ea54267b108fe4a283f097ce8c9bd507dd86"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"5aebcdcc025fa4f88d1f13dea063b6900a2a5a03","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2012 OpenStack LLC."},{"line_number":2,"context_line":"# All Rights Reserved"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATH%2F%2Ftuw%3D","line":1,"in_reply_to":"AAAATH%2F%2F7o4%3D","updated":"2013-10-11 00:19:57.000000000","message":"Done","commit_id":"a693ea54267b108fe4a283f097ce8c9bd507dd86"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"61dcba8bb3338a68362bff64946fd28378b4834e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2013 OpenStack Foundation."},{"line_number":2,"context_line":"# All Rights Reserved"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAU3%2F%2F38g%3D","line":1,"updated":"2014-02-24 11:17:24.000000000","message":"should be changed to 2014","commit_id":"78c7b49958d50de268f4513b4097f4d089a15515"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"9fe96258a01846fa3a95be9e636471c00fd5dddc","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2013 OpenStack Foundation."},{"line_number":2,"context_line":"# All Rights Reserved"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAU3%2F%2Fsks%3D","line":1,"in_reply_to":"AAAAU3%2F%2F38g%3D","updated":"2014-02-25 10:13:13.000000000","message":"Done","commit_id":"78c7b49958d50de268f4513b4097f4d089a15515"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"61dcba8bb3338a68362bff64946fd28378b4834e","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":"#"},{"line_number":16,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import logging"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAU3%2F%2F35s%3D","line":16,"updated":"2014-02-24 11:17:24.000000000","message":"following similar comment on other patch, vim modelines should not be included in new files.","commit_id":"78c7b49958d50de268f4513b4097f4d089a15515"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"9fe96258a01846fa3a95be9e636471c00fd5dddc","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":"#"},{"line_number":16,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import logging"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAU3%2F%2Fskk%3D","line":16,"in_reply_to":"AAAAU3%2F%2F35s%3D","updated":"2014-02-25 10:13:13.000000000","message":"Done. Thanks for pointing it. I totally forgot to remove it.","commit_id":"78c7b49958d50de268f4513b4097f4d089a15515"}],"neutronclient/tests/unit/test_cli20_packetfilter.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"d413742ce4e6f73e9134996c78e02363e97da97f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2012 Nicira, Inc"},{"line_number":2,"context_line":"# All Rights Reserved"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATH%2F%2F8VY%3D","line":1,"updated":"2013-10-07 17:43:41.000000000","message":"this does not look right","commit_id":"a693ea54267b108fe4a283f097ce8c9bd507dd86"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"5aebcdcc025fa4f88d1f13dea063b6900a2a5a03","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2012 Nicira, Inc"},{"line_number":2,"context_line":"# All Rights Reserved"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATH%2F%2FtuM%3D","line":1,"in_reply_to":"AAAATH%2F%2F8VY%3D","updated":"2013-10-11 00:19:57.000000000","message":"Done. Completely bad example of copy-and-paste.","commit_id":"a693ea54267b108fe4a283f097ce8c9bd507dd86"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"61dcba8bb3338a68362bff64946fd28378b4834e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2013 OpenStack Foundation."},{"line_number":2,"context_line":"# All Rights Reserved"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAU3%2F%2F32w%3D","line":1,"updated":"2014-02-24 11:17:24.000000000","message":"2014","commit_id":"78c7b49958d50de268f4513b4097f4d089a15515"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"9fe96258a01846fa3a95be9e636471c00fd5dddc","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2013 OpenStack Foundation."},{"line_number":2,"context_line":"# All Rights Reserved"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAU3%2F%2Fsk4%3D","line":1,"in_reply_to":"AAAAU3%2F%2F32w%3D","updated":"2014-02-25 10:13:13.000000000","message":"Done","commit_id":"78c7b49958d50de268f4513b4097f4d089a15515"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"61dcba8bb3338a68362bff64946fd28378b4834e","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":"#"},{"line_number":16,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import sys"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAU3%2F%2F32g%3D","line":16,"updated":"2014-02-24 11:17:24.000000000","message":"line 16 should be removed","commit_id":"78c7b49958d50de268f4513b4097f4d089a15515"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"9fe96258a01846fa3a95be9e636471c00fd5dddc","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":"#"},{"line_number":16,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import sys"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAU3%2F%2Fsk0%3D","line":16,"in_reply_to":"AAAAU3%2F%2F32g%3D","updated":"2014-02-25 10:13:13.000000000","message":"Done","commit_id":"78c7b49958d50de268f4513b4097f4d089a15515"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"86ab34acdf3781b4ad42d7f598d8ac8aff15b80c","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import sys"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import mox"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from neutronclient.common import exceptions"},{"line_number":21,"context_line":"from neutronclient.neutron.v2_0.nec import packetfilter as pf"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAW3%2F%2FfOE%3D","line":18,"updated":"2014-04-14 09:26:34.000000000","message":"not sure if there is an actual policy to use mock instead of mox for all new tests..","commit_id":"639a5487635cd8ded28ce47c01bf8fdd597d01ec"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"cf7d606738995e2be0ebd16a101d1cdd09d6ca29","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import sys"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import mox"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from neutronclient.common import exceptions"},{"line_number":21,"context_line":"from neutronclient.neutron.v2_0.nec import packetfilter as pf"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAXH%2F%2Fv2Q%3D","line":18,"in_reply_to":"AAAAW3%2F%2FfOE%3D","updated":"2014-04-18 09:03:13.000000000","message":"all tests in neutronclient command lines depend on test_cli20/__init__.py and it is used mox. It is not recommended to use both mock and mox [1]. I think this is the case and use mox in this class.\n\nI think we need to discuss whether/when neutronclient tests migrate to mock. It requires us to reimplement the base class and it should be done as a separate patch even if we decide to migrate to mock.\n\n[1] https://wiki.openstack.org/wiki/ReviewChecklist#Common_Review_Checklist","commit_id":"639a5487635cd8ded28ce47c01bf8fdd597d01ec"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"ef63f21aee78284f76a96a628450769ab56ccc3a","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import sys"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import mox"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from neutronclient.common import exceptions"},{"line_number":21,"context_line":"from neutronclient.neutron.v2_0.nec import packetfilter as pf"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAXH%2F%2FrdU%3D","line":18,"in_reply_to":"AAAAXH%2F%2Fv2Q%3D","updated":"2014-04-18 09:46:16.000000000","message":"Agree, thanks for the explanation","commit_id":"639a5487635cd8ded28ce47c01bf8fdd597d01ec"}],"neutronclient/v2_0/client.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"d413742ce4e6f73e9134996c78e02363e97da97f","unresolved":false,"context_lines":[{"line_number":1117,"context_line":""},{"line_number":1118,"context_line":"    @APIParamsCall"},{"line_number":1119,"context_line":"    def create_packet_filter(self, body\u003dNone):"},{"line_number":1120,"context_line":"        \"\"\"Creates a new packet filter.\"\"\""},{"line_number":1121,"context_line":"        return self.post(self.packet_filters_path, body\u003dbody)"},{"line_number":1122,"context_line":""},{"line_number":1123,"context_line":"    @APIParamsCall"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATH%2F%2F8U8%3D","line":1120,"updated":"2013-10-07 17:43:41.000000000","message":"usually docstrings\u0027 verbs are not conjugated, so consider \u0027create\u0027 instead of \u0027creates\u0027.","commit_id":"a693ea54267b108fe4a283f097ce8c9bd507dd86"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"5aebcdcc025fa4f88d1f13dea063b6900a2a5a03","unresolved":false,"context_lines":[{"line_number":1117,"context_line":""},{"line_number":1118,"context_line":"    @APIParamsCall"},{"line_number":1119,"context_line":"    def create_packet_filter(self, body\u003dNone):"},{"line_number":1120,"context_line":"        \"\"\"Creates a new packet filter.\"\"\""},{"line_number":1121,"context_line":"        return self.post(self.packet_filters_path, body\u003dbody)"},{"line_number":1122,"context_line":""},{"line_number":1123,"context_line":"    @APIParamsCall"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATH%2F%2FtuE%3D","line":1120,"in_reply_to":"AAAATH%2F%2F8U8%3D","updated":"2013-10-11 00:19:57.000000000","message":"Agree. I fixed docstrings added by this patch.\n\nThere are many similar docstrings in this module. It can be fixed in a separate patch, but I am not sure it should be clean up or not.","commit_id":"a693ea54267b108fe4a283f097ce8c9bd507dd86"}]}
