)]}'
{"heat/engine/cfn/functions.py":[{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"5a4441d5f8d6e08c5576181e90aa1e352943d078","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        except ValueError as ex:"},{"line_number":41,"context_line":"            raise KeyError(str(ex))"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def validate(self):"},{"line_number":44,"context_line":"        pass"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def result(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2BwbI%3D","line":43,"updated":"2014-03-24 15:30:54.000000000","message":"Why not just define this method in function.Function and remove all the repetition?","commit_id":"32e10accd5acd34a821f05651044482686333c10"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"3db04a1bfc5bbcf052430ff946f8cbc763afd7f3","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        except ValueError as ex:"},{"line_number":41,"context_line":"            raise KeyError(str(ex))"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def validate(self):"},{"line_number":44,"context_line":"        pass"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def result(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2BrBQ%3D","line":43,"in_reply_to":"AAAAWH%2F%2BwbI%3D","updated":"2014-03-26 06:32:38.000000000","message":"Done","commit_id":"32e10accd5acd34a821f05651044482686333c10"}],"heat/engine/function.py":[{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"5a4441d5f8d6e08c5576181e90aa1e352943d078","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        self.fn_name \u003d fn_name"},{"line_number":37,"context_line":"        self.args \u003d args"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @abc.abstractmethod"},{"line_number":40,"context_line":"    def validate(self):"},{"line_number":41,"context_line":"        \"\"\""},{"line_number":42,"context_line":"        Validate arguments without resolving the function."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2Bwaw%3D","line":39,"updated":"2014-03-24 15:30:54.000000000","message":"IMO, this should just be a default implementation (remove the decorator) since it looks like most functions will simply pass here?","commit_id":"32e10accd5acd34a821f05651044482686333c10"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"3db04a1bfc5bbcf052430ff946f8cbc763afd7f3","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        self.fn_name \u003d fn_name"},{"line_number":37,"context_line":"        self.args \u003d args"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @abc.abstractmethod"},{"line_number":40,"context_line":"    def validate(self):"},{"line_number":41,"context_line":"        \"\"\""},{"line_number":42,"context_line":"        Validate arguments without resolving the function."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2BrBI%3D","line":39,"in_reply_to":"AAAAWH%2F%2Bwaw%3D","updated":"2014-03-26 06:32:38.000000000","message":"Done","commit_id":"32e10accd5acd34a821f05651044482686333c10"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"a03db77b339dc5024e195313a9e1e1dbef0f64ec","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        Function subclasses must override this method to validate their"},{"line_number":45,"context_line":"        args."},{"line_number":46,"context_line":"        \"\"\""},{"line_number":47,"context_line":"        pass"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    @abc.abstractmethod"},{"line_number":50,"context_line":"    def result(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2BvsQ%3D","line":47,"updated":"2014-03-24 17:08:55.000000000","message":"Yup, this needs to not be abstract. It also needs to call:\n\n  validate(self.args)","commit_id":"32e10accd5acd34a821f05651044482686333c10"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"3db04a1bfc5bbcf052430ff946f8cbc763afd7f3","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        Function subclasses must override this method to validate their"},{"line_number":45,"context_line":"        args."},{"line_number":46,"context_line":"        \"\"\""},{"line_number":47,"context_line":"        pass"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    @abc.abstractmethod"},{"line_number":50,"context_line":"    def result(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2BhqE%3D","line":47,"in_reply_to":"AAAAWH%2F%2BvsQ%3D","updated":"2014-03-26 06:32:38.000000000","message":"Done","commit_id":"32e10accd5acd34a821f05651044482686333c10"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"a03db77b339dc5024e195313a9e1e1dbef0f64ec","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    if isinstance(snippet, Function):"},{"line_number":127,"context_line":"        snippet.validate()"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    if isinstance(snippet, collections.Mapping):"},{"line_number":130,"context_line":"        for v in snippet.values():"},{"line_number":131,"context_line":"            validate(v)"},{"line_number":132,"context_line":"    elif (not isinstance(snippet, basestring) and"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2Bvrw%3D","line":129,"updated":"2014-03-24 17:08:55.000000000","message":"Might as well make this \"elif\" instead of just \"if\"","commit_id":"32e10accd5acd34a821f05651044482686333c10"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"3db04a1bfc5bbcf052430ff946f8cbc763afd7f3","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    if isinstance(snippet, Function):"},{"line_number":127,"context_line":"        snippet.validate()"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    if isinstance(snippet, collections.Mapping):"},{"line_number":130,"context_line":"        for v in snippet.values():"},{"line_number":131,"context_line":"            validate(v)"},{"line_number":132,"context_line":"    elif (not isinstance(snippet, basestring) and"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2BrA4%3D","line":129,"in_reply_to":"AAAAWH%2F%2Bvrw%3D","updated":"2014-03-26 06:32:38.000000000","message":"Done","commit_id":"32e10accd5acd34a821f05651044482686333c10"},{"author":{"_account_id":8399,"name":"Jay Dobies","email":"jason.dobies@redhat.com","username":"jdob"},"change_message_id":"5bed6b5757fac26c418b490ccb791dc37d26850f","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        Validate arguments without resolving the function."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        Function subclasses must override this method to validate their"},{"line_number":44,"context_line":"        args."},{"line_number":45,"context_line":"        \"\"\""},{"line_number":46,"context_line":"        validate(self.args)"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F%2BJIs%3D","line":44,"updated":"2014-03-28 20:27:20.000000000","message":"This could use a bit more elaboration on what the subclass should do when overriding it. Is there a specific Exception subclass to be raised when validation fails, or is anything under Exception valid?","commit_id":"b770402c1c12081ad3061c42523008fc7e5dd57b"}],"heat/tests/test_function.py":[{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"5a4441d5f8d6e08c5576181e90aa1e352943d078","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        self.assertIsNot(result, snippet)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"class ValidateTest(HeatTestCase):"},{"line_number":90,"context_line":"    def setUp(self):"},{"line_number":91,"context_line":"        super(ValidateTest, self).setUp()"},{"line_number":92,"context_line":"        self.func \u003d TestFunction(None, \u0027foo\u0027, [\u0027bar\u0027, \u0027baz\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2BwaI%3D","line":89,"updated":"2014-03-24 15:30:54.000000000","message":"These tests seem a little thin sense it would be nice to see verify how it behaves with some trivial validation method.","commit_id":"32e10accd5acd34a821f05651044482686333c10"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"3db04a1bfc5bbcf052430ff946f8cbc763afd7f3","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        self.assertIsNot(result, snippet)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"class ValidateTest(HeatTestCase):"},{"line_number":90,"context_line":"    def setUp(self):"},{"line_number":91,"context_line":"        super(ValidateTest, self).setUp()"},{"line_number":92,"context_line":"        self.func \u003d TestFunction(None, \u0027foo\u0027, [\u0027bar\u0027, \u0027baz\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2BhqA%3D","line":89,"in_reply_to":"AAAAWH%2F%2BwaI%3D","updated":"2014-03-26 06:32:38.000000000","message":"Done","commit_id":"32e10accd5acd34a821f05651044482686333c10"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"4738e164c7935567fbd85d466fa8931d25b31abc","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            if len(self.args) \u003c 2:"},{"line_number":92,"context_line":"                raise Exception(_(\u0027Need more arguments\u0027))"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        TestFunction.validate \u003d fake_validation"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def test_validate_func(self):"},{"line_number":97,"context_line":"        self.assertIsNone(function.validate(self.func))"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F%2BeQg%3D","line":94,"updated":"2014-03-26 15:15:22.000000000","message":"This seems a bit dodgy, because it modifies the TestFunction class that is used by all the tests in this file.\n\nIf that\u0027s not a problem, then just define the validate() method in TestFunction, so everyone can see it.\n\nIf it is then you want something more like:\n\n  self.func.validate \u003d types.MethodType(fake_validation, self.func, TestFunction)","commit_id":"82fef03ee25068e8ad5c7a05328b9957ca07963d"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"7fc01c512f76dc6b18cf47976180699e81fa9788","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            if len(self.args) \u003c 2:"},{"line_number":92,"context_line":"                raise Exception(_(\u0027Need more arguments\u0027))"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        TestFunction.validate \u003d fake_validation"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def test_validate_func(self):"},{"line_number":97,"context_line":"        self.assertIsNone(function.validate(self.func))"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F%2BcJ8%3D","line":94,"in_reply_to":"AAAAWH%2F%2BeQg%3D","updated":"2014-03-26 19:11:51.000000000","message":"Done","commit_id":"82fef03ee25068e8ad5c7a05328b9957ca07963d"},{"author":{"_account_id":8399,"name":"Jay Dobies","email":"jason.dobies@redhat.com","username":"jdob"},"change_message_id":"5bed6b5757fac26c418b490ccb791dc37d26850f","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        snippet \u003d {\u0027foo\u0027: \u0027bar\u0027, \u0027blarg\u0027: self.func}"},{"line_number":115,"context_line":"        ex \u003d self.assertRaises(Exception, function.validate, snippet)"},{"line_number":116,"context_line":"        self.assertEqual(\u0027Need more arguments\u0027, str(ex))"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def test_validate_all(self):"},{"line_number":119,"context_line":"        snippet \u003d [\u0027foo\u0027, {\u0027bar\u0027: [\u0027baz\u0027, {\u0027blarg\u0027: self.func}]}]"},{"line_number":120,"context_line":"        function.validate(snippet)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F%2BJI0%3D","line":117,"updated":"2014-03-28 20:27:20.000000000","message":"The only thing potentially missing is a test that passes in a string which would skip the last elif\u0027s basestring check, but that might be overkill.","commit_id":"b770402c1c12081ad3061c42523008fc7e5dd57b"}]}
