)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"0dd745c863fe30924a3f22d05f46b1e201c7123b","unresolved":false,"context_lines":[{"line_number":11,"context_line":"making possible to check XOR of any parameters"},{"line_number":12,"context_line":"at any Controller."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Closes-Bug: 1406938"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: I074f65c23212df9b66c7dfc65d9ad71ea0de9ed8"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3a961159_d8665a55","line":14,"updated":"2015-01-09 23:31:22.000000000","message":"as per the commit states, this is a refactor which doesn\u0027t look like a legitimate bug. Think it fits the case of spec-less blueprints, though.","commit_id":"9fdf8e8f1f572a09940a8630bb86beb2512da466"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"02d86a628bcdb458b64557b0e52b9a1d1deec472","unresolved":false,"context_lines":[{"line_number":11,"context_line":"making possible to check XOR of any parameters"},{"line_number":12,"context_line":"at any Controller."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Closes-Bug: 1406938"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: I074f65c23212df9b66c7dfc65d9ad71ea0de9ed8"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3a961159_1792484b","line":14,"in_reply_to":"3a961159_d8665a55","updated":"2015-01-12 21:26:37.000000000","message":"Well, I think both bug (marked as wishlist) or bp should work.\nMaybe bp is more appropriated, but this is patch is too simple to change this now.\nI\u0027ll keep this as a bug and maybe create a bp next time.\n\nThanks for pointing this out.","commit_id":"9fdf8e8f1f572a09940a8630bb86beb2512da466"}],"keystone/common/controller.py":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"0dd745c863fe30924a3f22d05f46b1e201c7123b","unresolved":false,"context_lines":[{"line_number":561,"context_line":"        provided_params \u003d [name for name, value in kwargs.iteritems() if value]"},{"line_number":562,"context_line":""},{"line_number":563,"context_line":"        if len(provided_params) !\u003d 1:"},{"line_number":564,"context_line":"            msg \u003d _(\u0027Specify %s\u0027) % \u0027 xor \u0027.join(provided_params)"},{"line_number":565,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":566,"context_line":""},{"line_number":567,"context_line":"    def _require_matching_id(self, value, ref):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_587b4af4","line":564,"updated":"2015-01-09 23:31:22.000000000","message":"this is not a useful message, should be something like the messages in the methods you are removing.\n\nalso, this would print something like \"Specify A xor B xor C xor D ...\" for the cases where you provide more than 2 params.","commit_id":"9fdf8e8f1f572a09940a8630bb86beb2512da466"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"02d86a628bcdb458b64557b0e52b9a1d1deec472","unresolved":false,"context_lines":[{"line_number":561,"context_line":"        provided_params \u003d [name for name, value in kwargs.iteritems() if value]"},{"line_number":562,"context_line":""},{"line_number":563,"context_line":"        if len(provided_params) !\u003d 1:"},{"line_number":564,"context_line":"            msg \u003d _(\u0027Specify %s\u0027) % \u0027 xor \u0027.join(provided_params)"},{"line_number":565,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":566,"context_line":""},{"line_number":567,"context_line":"    def _require_matching_id(self, value, ref):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_dd0ffe89","line":564,"in_reply_to":"3a961159_587b4af4","updated":"2015-01-12 21:26:37.000000000","message":"Changed this method. Message was also improved.","commit_id":"9fdf8e8f1f572a09940a8630bb86beb2512da466"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4cf31f791219403b317e2dd38aa594585cad9a4a","unresolved":false,"context_lines":[{"line_number":565,"context_line":"        elif len(provided_args) !\u003d 1:"},{"line_number":566,"context_line":"            msg \u003d _(\u0027Specify only one of %s\u0027) % \u0027 or \u0027.join(provided_args)"},{"line_number":567,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":568,"context_line":""},{"line_number":569,"context_line":"    def _require_matching_id(self, value, ref):"},{"line_number":570,"context_line":"        \"\"\"Ensures the value matches the reference\u0027s ID, if any.\"\"\""},{"line_number":571,"context_line":"        if \u0027id\u0027 in ref and ref[\u0027id\u0027] !\u003d value:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_60e32834","line":568,"updated":"2015-01-16 13:07:39.000000000","message":"neat!!","commit_id":"31c797bb613124e382755f892e8a9a27db109e83"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"51ed87b51295e80a00c0f34d134e83fc73a55073","unresolved":false,"context_lines":[{"line_number":565,"context_line":"        elif len(provided_args) !\u003d 1:"},{"line_number":566,"context_line":"            msg \u003d _(\u0027Specify only one of %s\u0027) % \u0027 or \u0027.join(provided_args)"},{"line_number":567,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":568,"context_line":""},{"line_number":569,"context_line":"    def _require_matching_id(self, value, ref):"},{"line_number":570,"context_line":"        \"\"\"Ensures the value matches the reference\u0027s ID, if any.\"\"\""},{"line_number":571,"context_line":"        if \u0027id\u0027 in ref and ref[\u0027id\u0027] !\u003d value:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_608fa8cd","line":568,"in_reply_to":"3a961159_206da032","updated":"2015-01-16 13:39:29.000000000","message":"Agreed","commit_id":"31c797bb613124e382755f892e8a9a27db109e83"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e9b8a026000e2167cbe3401cd492ee9570f9574b","unresolved":false,"context_lines":[{"line_number":565,"context_line":"        elif len(provided_args) !\u003d 1:"},{"line_number":566,"context_line":"            msg \u003d _(\u0027Specify only one of %s\u0027) % \u0027 or \u0027.join(provided_args)"},{"line_number":567,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":568,"context_line":""},{"line_number":569,"context_line":"    def _require_matching_id(self, value, ref):"},{"line_number":570,"context_line":"        \"\"\"Ensures the value matches the reference\u0027s ID, if any.\"\"\""},{"line_number":571,"context_line":"        if \u0027id\u0027 in ref and ref[\u0027id\u0027] !\u003d value:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_206da032","line":568,"in_reply_to":"3a961159_60e32834","updated":"2015-01-16 13:26:34.000000000","message":"...although perhaps an alternative name might be:\n\nassert_single_arg()","commit_id":"31c797bb613124e382755f892e8a9a27db109e83"},{"author":{"_account_id":8533,"name":"Marcos Fermín Lobo","email":"lobo@lukos.org","username":"mlobo"},"change_message_id":"f492816723bfffa13c757744c31fc6e9c7c70191","unresolved":false,"context_lines":[{"line_number":557,"context_line":"        # the hints list."},{"line_number":558,"context_line":"        return hints"},{"line_number":559,"context_line":""},{"line_number":560,"context_line":"    def _assert_single_arg(self, **kwargs):"},{"line_number":561,"context_line":"        provided_args \u003d [name for name, value in kwargs.iteritems() if value]"},{"line_number":562,"context_line":"        if not provided_args:"},{"line_number":563,"context_line":"            msg \u003d _(\u0027Specify one of %s\u0027) % \u0027 or \u0027.join(provided_args)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa81d914_545c9825","line":560,"updated":"2015-01-29 12:42:28.000000000","message":"I would like some documentation about this new function","commit_id":"828bb2776c0b451f741cb3ff5aeae21080239062"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"8f7e250cb5661f55d1a5f5bc541137d4e5b98c1d","unresolved":false,"context_lines":[{"line_number":557,"context_line":"        # the hints list."},{"line_number":558,"context_line":"        return hints"},{"line_number":559,"context_line":""},{"line_number":560,"context_line":"    def _assert_single_arg(self, **kwargs):"},{"line_number":561,"context_line":"        provided_args \u003d [name for name, value in kwargs.iteritems() if value]"},{"line_number":562,"context_line":"        if not provided_args:"},{"line_number":563,"context_line":"            msg \u003d _(\u0027Specify one of %s\u0027) % \u0027 or \u0027.join(provided_args)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa81d914_446f5f2b","line":560,"in_reply_to":"fa81d914_545c9825","updated":"2015-01-30 06:10:34.000000000","message":"++ definitely needs some docstrings","commit_id":"828bb2776c0b451f741cb3ff5aeae21080239062"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"6bd9ed72dc6496e9a6d5e28da0a08606d8e07663","unresolved":false,"context_lines":[{"line_number":560,"context_line":"    def _assert_single_arg(self, **kwargs):"},{"line_number":561,"context_line":"        \"\"\"Assert that only one pair of (key, value) has a not none value.\"\"\""},{"line_number":562,"context_line":""},{"line_number":563,"context_line":"        provided_args \u003d [name for name, value in kwargs.iteritems() if value]"},{"line_number":564,"context_line":"        if not provided_args:"},{"line_number":565,"context_line":"            msg \u003d _(\u0027Specify one of %s\u0027) % \u0027 or \u0027.join(provided_args)"},{"line_number":566,"context_line":"            raise exception.ValidationError(msg)"}],"source_content_type":"text/x-python","patch_set":15,"id":"da86d52c_56a49e56","line":563,"updated":"2015-02-03 11:57:36.000000000","message":"_assert_single_arg(a\u003d0, b\u003dNone) will fail while valid single arg is present\n\nkwargs.iteritems -\u003e six.iteritems(kwargs) and as we don\u0027t need keys it\u0027d rather be like this:\n\nnonempty_values_count \u003d len([v for v in six.itervalues(kwargs) if v is not None])","commit_id":"4f08822ef790c285e64e0a07f953f7a72cac6d68"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"5abaa18cf4d26b71a8ffac3945655931ae420a6a","unresolved":false,"context_lines":[{"line_number":560,"context_line":"    def _assert_single_arg(self, **kwargs):"},{"line_number":561,"context_line":"        \"\"\"Assert that only one pair of (key, value) has a not none value.\"\"\""},{"line_number":562,"context_line":""},{"line_number":563,"context_line":"        provided_args \u003d [name for name, value in kwargs.iteritems() if value]"},{"line_number":564,"context_line":"        if not provided_args:"},{"line_number":565,"context_line":"            msg \u003d _(\u0027Specify one of %s\u0027) % \u0027 or \u0027.join(provided_args)"},{"line_number":566,"context_line":"            raise exception.ValidationError(msg)"}],"source_content_type":"text/x-python","patch_set":15,"id":"da86d52c_dc47cd49","line":563,"in_reply_to":"da86d52c_21c1a2e4","updated":"2015-02-03 12:26:27.000000000","message":"Done","commit_id":"4f08822ef790c285e64e0a07f953f7a72cac6d68"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"b674c00199c408f62aca32a40cd6bf6771f74be5","unresolved":false,"context_lines":[{"line_number":560,"context_line":"    def _assert_single_arg(self, **kwargs):"},{"line_number":561,"context_line":"        \"\"\"Assert that only one pair of (key, value) has a not none value.\"\"\""},{"line_number":562,"context_line":""},{"line_number":563,"context_line":"        provided_args \u003d [name for name, value in kwargs.iteritems() if value]"},{"line_number":564,"context_line":"        if not provided_args:"},{"line_number":565,"context_line":"            msg \u003d _(\u0027Specify one of %s\u0027) % \u0027 or \u0027.join(provided_args)"},{"line_number":566,"context_line":"            raise exception.ValidationError(msg)"}],"source_content_type":"text/x-python","patch_set":15,"id":"da86d52c_81c5ee8f","line":563,"in_reply_to":"da86d52c_56a49e56","updated":"2015-02-03 12:06:07.000000000","message":"Nice catch! I think replacing \u0027if value\u0027 by \u0027if value is not None\u0027 should be enough.\n\nYes, we do need the keys for formatting the error message.","commit_id":"4f08822ef790c285e64e0a07f953f7a72cac6d68"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"0a70096a951ced5a07695ee67217c61345d764b5","unresolved":false,"context_lines":[{"line_number":560,"context_line":"    def _assert_single_arg(self, **kwargs):"},{"line_number":561,"context_line":"        \"\"\"Assert that only one pair of (key, value) has a not none value.\"\"\""},{"line_number":562,"context_line":""},{"line_number":563,"context_line":"        provided_args \u003d [name for name, value in kwargs.iteritems() if value]"},{"line_number":564,"context_line":"        if not provided_args:"},{"line_number":565,"context_line":"            msg \u003d _(\u0027Specify one of %s\u0027) % \u0027 or \u0027.join(provided_args)"},{"line_number":566,"context_line":"            raise exception.ValidationError(msg)"}],"source_content_type":"text/x-python","patch_set":15,"id":"da86d52c_21c1a2e4","line":563,"in_reply_to":"da86d52c_81c5ee8f","updated":"2015-02-03 12:19:33.000000000","message":"I\u0027d recommend to use six.iteritems too - python3 will be grateful :)","commit_id":"4f08822ef790c285e64e0a07f953f7a72cac6d68"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"ed2003d81255e87683069a724b94287ba5e64ace","unresolved":false,"context_lines":[{"line_number":562,"context_line":""},{"line_number":563,"context_line":"        provided_args \u003d [k for k, v in six.iteritems(kwargs) if v is not None]"},{"line_number":564,"context_line":"        if not provided_args:"},{"line_number":565,"context_line":"            msg \u003d _(\u0027Specify one of %s\u0027) % \u0027 or \u0027.join(provided_args)"},{"line_number":566,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":567,"context_line":"        elif len(provided_args) !\u003d 1:"},{"line_number":568,"context_line":"            msg \u003d _(\u0027Specify only one of %s\u0027) % \u0027 or \u0027.join(provided_args)"}],"source_content_type":"text/x-python","patch_set":16,"id":"da86d52c_9a5e22e8","line":565,"updated":"2015-02-10 17:52:30.000000000","message":"does msg even make sense? \u0027Specify one of %s\u0027 One of what?","commit_id":"eee219abf4398f47c577d0beb9cd150dfe693286"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"ef19efe56dd3bfad5a5a312f4a368f61d1b35df9","unresolved":false,"context_lines":[{"line_number":562,"context_line":""},{"line_number":563,"context_line":"        provided_args \u003d [k for k, v in six.iteritems(kwargs) if v is not None]"},{"line_number":564,"context_line":"        if not provided_args:"},{"line_number":565,"context_line":"            msg \u003d _(\u0027Specify one of %s\u0027) % \u0027 or \u0027.join(provided_args)"},{"line_number":566,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":567,"context_line":"        elif len(provided_args) !\u003d 1:"},{"line_number":568,"context_line":"            msg \u003d _(\u0027Specify only one of %s\u0027) % \u0027 or \u0027.join(provided_args)"}],"source_content_type":"text/x-python","patch_set":16,"id":"da86d52c_9318cd85","line":565,"in_reply_to":"da86d52c_9a5e22e8","updated":"2015-02-10 19:13:32.000000000","message":"well.... it should be keys from kwargs, thanks!","commit_id":"eee219abf4398f47c577d0beb9cd150dfe693286"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"9943830af539c13009ae1b8f2526b0b0d822738f","unresolved":false,"context_lines":[{"line_number":562,"context_line":""},{"line_number":563,"context_line":"        provided_args \u003d [k for k, v in six.iteritems(kwargs) if v is not None]"},{"line_number":564,"context_line":"        if not provided_args:"},{"line_number":565,"context_line":"            msg \u003d _(\u0027Specify one of %s\u0027) % \u0027 or \u0027.join(six.viewkeys(kwargs))"},{"line_number":566,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":567,"context_line":"        elif len(provided_args) !\u003d 1:"},{"line_number":568,"context_line":"            msg \u003d _(\u0027Specify only one of %s\u0027) % \u0027 or \u0027.join(provided_args)"}],"source_content_type":"text/x-python","patch_set":17,"id":"da86d52c_7b5242df","line":565,"updated":"2015-02-11 02:22:55.000000000","message":"this won\u0027t work right? unless you provide default keyword args like\n\ndef _assert_single_arg(self, domain_id\u003dNone, project_id\u003dNone)","commit_id":"5ac1b378d2451842475d5a6d8c620550b085dcba"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"5c43b74e090b1b669c6e75bb501b93492b1e3451","unresolved":false,"context_lines":[{"line_number":562,"context_line":""},{"line_number":563,"context_line":"        provided_args \u003d [k for k, v in six.iteritems(kwargs) if v is not None]"},{"line_number":564,"context_line":"        if not provided_args:"},{"line_number":565,"context_line":"            msg \u003d _(\u0027Specify one of %s\u0027) % \u0027 or \u0027.join(six.viewkeys(kwargs))"},{"line_number":566,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":567,"context_line":"        elif len(provided_args) !\u003d 1:"},{"line_number":568,"context_line":"            msg \u003d _(\u0027Specify only one of %s\u0027) % \u0027 or \u0027.join(provided_args)"}],"source_content_type":"text/x-python","patch_set":17,"id":"da86d52c_da14f6ea","line":565,"in_reply_to":"da86d52c_7b5242df","updated":"2015-02-11 13:26:31.000000000","message":"Agreed.","commit_id":"5ac1b378d2451842475d5a6d8c620550b085dcba"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e0906e000489ce00c4a468323aa90c261f5ab72c","unresolved":false,"context_lines":[{"line_number":563,"context_line":"        provided_args \u003d [k for k, v in six.iteritems(kwargs) if v is not None]"},{"line_number":564,"context_line":"        if not provided_args:"},{"line_number":565,"context_line":"            msg \u003d _(\u0027Specify one of %s\u0027) % \u0027 or \u0027.join(six.viewkeys(kwargs))"},{"line_number":566,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":567,"context_line":"        elif len(provided_args) !\u003d 1:"},{"line_number":568,"context_line":"            msg \u003d _(\u0027Specify only one of %s\u0027) % \u0027 or \u0027.join(provided_args)"},{"line_number":569,"context_line":"            raise exception.ValidationError(msg)"}],"source_content_type":"text/x-python","patch_set":17,"id":"da86d52c_2e6df499","line":566,"updated":"2015-02-10 19:21:42.000000000","message":"so this is tricky, because we\u0027ve already got somewhat of a validation framework in place. The interesting part would be if we could get a schema for validating this. It\u0027s possible to tell jsonschema that we want to a require a certain property, but I wonder if we could write an extension to our own jsonschema validation layer that would check for this case. \n\nThinking out loud here because it would be nice to have *all* validation done in one place.\n\nWe could do something like the following: http://stackoverflow.com/questions/19436589/how-to-make-json-schema-to-allow-one-but-not-another-field","commit_id":"5ac1b378d2451842475d5a6d8c620550b085dcba"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6d4ac2be54cc7af3f8da1bd0a8388c77abaea18e","unresolved":false,"context_lines":[{"line_number":563,"context_line":"        provided_args \u003d [k for k, v in six.iteritems(kwargs) if v is not None]"},{"line_number":564,"context_line":"        if not provided_args:"},{"line_number":565,"context_line":"            msg \u003d _(\u0027Specify one of %s\u0027) % \u0027 or \u0027.join(six.viewkeys(kwargs))"},{"line_number":566,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":567,"context_line":"        elif len(provided_args) !\u003d 1:"},{"line_number":568,"context_line":"            msg \u003d _(\u0027Specify only one of %s\u0027) % \u0027 or \u0027.join(provided_args)"},{"line_number":569,"context_line":"            raise exception.ValidationError(msg)"}],"source_content_type":"text/x-python","patch_set":17,"id":"da86d52c_6eec4cf4","line":566,"in_reply_to":"da86d52c_2e6df499","updated":"2015-02-10 19:24:34.000000000","message":"so the schema might look something like: \n\n    \"oneOf\": [\n        {\"required\": [\"user_id\"]},\n        {\"required\": [\"group_id\"]}\n    ],\n    \"oneOf\": [\n        {\"required\": [\"project_id\"]},\n        {\"required\": [\"domain_id\"]}\n    ]","commit_id":"5ac1b378d2451842475d5a6d8c620550b085dcba"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"9943830af539c13009ae1b8f2526b0b0d822738f","unresolved":false,"context_lines":[{"line_number":563,"context_line":"        provided_args \u003d [k for k, v in six.iteritems(kwargs) if v is not None]"},{"line_number":564,"context_line":"        if not provided_args:"},{"line_number":565,"context_line":"            msg \u003d _(\u0027Specify one of %s\u0027) % \u0027 or \u0027.join(six.viewkeys(kwargs))"},{"line_number":566,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":567,"context_line":"        elif len(provided_args) !\u003d 1:"},{"line_number":568,"context_line":"            msg \u003d _(\u0027Specify only one of %s\u0027) % \u0027 or \u0027.join(provided_args)"},{"line_number":569,"context_line":"            raise exception.ValidationError(msg)"}],"source_content_type":"text/x-python","patch_set":17,"id":"da86d52c_fbc71296","line":566,"in_reply_to":"da86d52c_6eec4cf4","updated":"2015-02-11 02:22:55.000000000","message":"Lance, so more more dependency?!!! :)\nHow about lets get this chain merged and then enhance schema validation?","commit_id":"5ac1b378d2451842475d5a6d8c620550b085dcba"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"5c43b74e090b1b669c6e75bb501b93492b1e3451","unresolved":false,"context_lines":[{"line_number":563,"context_line":"        provided_args \u003d [k for k, v in six.iteritems(kwargs) if v is not None]"},{"line_number":564,"context_line":"        if not provided_args:"},{"line_number":565,"context_line":"            msg \u003d _(\u0027Specify one of %s\u0027) % \u0027 or \u0027.join(six.viewkeys(kwargs))"},{"line_number":566,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":567,"context_line":"        elif len(provided_args) !\u003d 1:"},{"line_number":568,"context_line":"            msg \u003d _(\u0027Specify only one of %s\u0027) % \u0027 or \u0027.join(provided_args)"},{"line_number":569,"context_line":"            raise exception.ValidationError(msg)"}],"source_content_type":"text/x-python","patch_set":17,"id":"da86d52c_fad45a21","line":566,"in_reply_to":"da86d52c_fbc71296","updated":"2015-02-11 13:26:31.000000000","message":"++","commit_id":"5ac1b378d2451842475d5a6d8c620550b085dcba"}]}
