)]}'
{"oslo_versionedobjects/base.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"ffbf5133f5c0bc0375c18ab56c18eb9add590fca","unresolved":false,"context_lines":[{"line_number":327,"context_line":"        field_schemas \u003d {key: field.get_schema()"},{"line_number":328,"context_line":"                         for key, field in cls.fields.items()}"},{"line_number":329,"context_line":"        required_fields \u003d [name for name, schema in field_schemas.items()"},{"line_number":330,"context_line":"                           if not schema[\u0027nullable\u0027]]"},{"line_number":331,"context_line":"        namespace_key \u003d cls._obj_primitive_key(\u0027namespace\u0027)"},{"line_number":332,"context_line":"        name_key \u003d cls._obj_primitive_key(\u0027name\u0027)"},{"line_number":333,"context_line":"        version_key \u003d cls._obj_primitive_key(\u0027version\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_f87e05ad","line":330,"range":{"start_line":330,"start_character":34,"end_line":330,"end_character":52},"updated":"2016-06-06 09:08:04.000000000","message":"So you expect that the schema returned from the fields always has a \u0027nullable\u0027 field. But in the other hand you copy that schema into the resulting jsonschema as well. I guess (but maybe I\u0027m wrong) the {\u0027type\u0027: {..., \u0027nullable\u0027: true}} is not the way to express a nullable field in jsonschema.","commit_id":"4d8232e9515e61ae6dda49bef590b856964cbc2d"},{"author":{"_account_id":20411,"name":"Julian","email":"julian.sy@att.com","username":"syjulian"},"change_message_id":"ed5ab8c88f31ee39fa0eac16683c999c144f5b65","unresolved":false,"context_lines":[{"line_number":327,"context_line":"        field_schemas \u003d {key: field.get_schema()"},{"line_number":328,"context_line":"                         for key, field in cls.fields.items()}"},{"line_number":329,"context_line":"        required_fields \u003d [name for name, schema in field_schemas.items()"},{"line_number":330,"context_line":"                           if not schema[\u0027nullable\u0027]]"},{"line_number":331,"context_line":"        namespace_key \u003d cls._obj_primitive_key(\u0027namespace\u0027)"},{"line_number":332,"context_line":"        name_key \u003d cls._obj_primitive_key(\u0027name\u0027)"},{"line_number":333,"context_line":"        version_key \u003d cls._obj_primitive_key(\u0027version\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_60524115","line":330,"range":{"start_line":330,"start_character":34,"end_line":330,"end_character":52},"in_reply_to":"7aa08908_f87e05ad","updated":"2016-06-06 15:08:32.000000000","message":"will fix","commit_id":"4d8232e9515e61ae6dda49bef590b856964cbc2d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"ffbf5133f5c0bc0375c18ab56c18eb9add590fca","unresolved":false,"context_lines":[{"line_number":332,"context_line":"        name_key \u003d cls._obj_primitive_key(\u0027name\u0027)"},{"line_number":333,"context_line":"        version_key \u003d cls._obj_primitive_key(\u0027version\u0027)"},{"line_number":334,"context_line":"        data_key \u003d cls._obj_primitive_key(\u0027data\u0027)"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"        schema \u003d {"},{"line_number":337,"context_line":"            \u0027$schema\u0027: \u0027http://json-schema.org/draft-04/schema#\u0027,"},{"line_number":338,"context_line":"            \u0027title\u0027: obj_name,"}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_1be82b10","line":335,"updated":"2016-06-06 09:08:04.000000000","message":"there can be one more optional metadata field \u0027changes\u0027. https://github.com/openstack/oslo.versionedobjects/blob/master/oslo_versionedobjects/base.py#L555\n\nI forget about it previously because in notifications we never use it. (We reset the object before send it, so no changes)","commit_id":"4d8232e9515e61ae6dda49bef590b856964cbc2d"},{"author":{"_account_id":20411,"name":"Julian","email":"julian.sy@att.com","username":"syjulian"},"change_message_id":"ed5ab8c88f31ee39fa0eac16683c999c144f5b65","unresolved":false,"context_lines":[{"line_number":332,"context_line":"        name_key \u003d cls._obj_primitive_key(\u0027name\u0027)"},{"line_number":333,"context_line":"        version_key \u003d cls._obj_primitive_key(\u0027version\u0027)"},{"line_number":334,"context_line":"        data_key \u003d cls._obj_primitive_key(\u0027data\u0027)"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"        schema \u003d {"},{"line_number":337,"context_line":"            \u0027$schema\u0027: \u0027http://json-schema.org/draft-04/schema#\u0027,"},{"line_number":338,"context_line":"            \u0027title\u0027: obj_name,"}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_2032f9f1","line":335,"in_reply_to":"7aa08908_1be82b10","updated":"2016-06-06 15:08:32.000000000","message":"gotcha. i\u0027ll add that to the schema","commit_id":"4d8232e9515e61ae6dda49bef590b856964cbc2d"}],"oslo_versionedobjects/fields.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"40569576c52a37f0dcfbdfd43b2cc7345832004a","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        return self.__class__.__name__"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def get_schema(self):"},{"line_number":128,"context_line":"        return {}"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def stringify(self, value):"},{"line_number":131,"context_line":"        return str(value)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_52a9777a","line":128,"updated":"2016-05-20 12:00:13.000000000","message":"I\u0027m not sure we can give a meaningful default implementation to get_schema.\n\nFirst I thought that an abstract method in the AbstractFieldType would be the solution as that would express that every field needs to add implement this in a meaningful field type specific way, however that can break library users  quite heavily as that would prevent the intatiation of the FieldType even if they are not using the get_schema calls later. Maybe we shall raise an NotImplemented exception here instead. That will force to implement get_schema for user defined fields only if the user of the lib wants to call to_json_schema on their objects.","commit_id":"2b3d18ac74e23e1cf34a2e9778efd2df768f7578"},{"author":{"_account_id":20411,"name":"Julian","email":"julian.sy@att.com","username":"syjulian"},"change_message_id":"2080a5af9b72b99cd6d60e033b405c3d1e2cfcde","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        return self.__class__.__name__"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def get_schema(self):"},{"line_number":128,"context_line":"        return {}"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def stringify(self, value):"},{"line_number":131,"context_line":"        return str(value)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_234e273b","line":128,"in_reply_to":"bab6814e_52a9777a","updated":"2016-05-20 12:53:18.000000000","message":"good idea","commit_id":"2b3d18ac74e23e1cf34a2e9778efd2df768f7578"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"40569576c52a37f0dcfbdfd43b2cc7345832004a","unresolved":false,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def get_schema(self):"},{"line_number":128,"context_line":"        return {}"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def stringify(self, value):"},{"line_number":131,"context_line":"        return str(value)"},{"line_number":132,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_b2df030c","line":129,"updated":"2016-05-20 12:00:13.000000000","message":"I think as a next step we have to start implementing get_schema for every field type in ovo.","commit_id":"2b3d18ac74e23e1cf34a2e9778efd2df768f7578"},{"author":{"_account_id":20411,"name":"Julian","email":"julian.sy@att.com","username":"syjulian"},"change_message_id":"2080a5af9b72b99cd6d60e033b405c3d1e2cfcde","unresolved":false,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def get_schema(self):"},{"line_number":128,"context_line":"        return {}"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def stringify(self, value):"},{"line_number":131,"context_line":"        return str(value)"},{"line_number":132,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_4351abd7","line":129,"in_reply_to":"bab6814e_b2df030c","updated":"2016-05-20 12:53:18.000000000","message":"agreed","commit_id":"2b3d18ac74e23e1cf34a2e9778efd2df768f7578"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a308e617608cf92fffff78ece0f9e046530926f0","unresolved":false,"context_lines":[{"line_number":241,"context_line":"            return self._type.stringify(value)"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"    def get_schema(self):"},{"line_number":244,"context_line":"        if self._type is None:"},{"line_number":245,"context_line":"            print(self._type)"},{"line_number":246,"context_line":"            raise NotImplementedError()"},{"line_number":247,"context_line":"        schema \u003d self._type.get_schema()"}],"source_content_type":"text/x-python","patch_set":13,"id":"7aa08908_62d2e201","line":244,"updated":"2016-06-13 14:51:21.000000000","message":"I have no idea if it is this a possible scenario or not. But seem weird to have a field without type. I hope Ryan can comment.","commit_id":"ac712f459f5c117e0095997b9c3567a9fad56f77"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"0115c5dd8aaccf54f325b55bafa5fc9d7fbefe8c","unresolved":false,"context_lines":[{"line_number":241,"context_line":"            return self._type.stringify(value)"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"    def get_schema(self):"},{"line_number":244,"context_line":"        if self._type is None:"},{"line_number":245,"context_line":"            print(self._type)"},{"line_number":246,"context_line":"            raise NotImplementedError()"},{"line_number":247,"context_line":"        schema \u003d self._type.get_schema()"}],"source_content_type":"text/x-python","patch_set":13,"id":"7aa08908_1c2e5efa","line":244,"in_reply_to":"7aa08908_1f769e05","updated":"2016-06-15 20:06:05.000000000","message":"looking above, _type is being set my a mandatory arg. Granted, you could pass in None for it, but if it is, that breaks a lot of the field. If you take a look at __repr__ it assumes self._type isn\u0027t null, so I\u0027d say we\u0027re pretty darn safe in assuming it\u0027s always set.","commit_id":"ac712f459f5c117e0095997b9c3567a9fad56f77"},{"author":{"_account_id":20411,"name":"Julian","email":"julian.sy@att.com","username":"syjulian"},"change_message_id":"39290cccd4fbb471310be4e7205a77ee26141d9a","unresolved":false,"context_lines":[{"line_number":241,"context_line":"            return self._type.stringify(value)"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"    def get_schema(self):"},{"line_number":244,"context_line":"        if self._type is None:"},{"line_number":245,"context_line":"            print(self._type)"},{"line_number":246,"context_line":"            raise NotImplementedError()"},{"line_number":247,"context_line":"        schema \u003d self._type.get_schema()"}],"source_content_type":"text/x-python","patch_set":13,"id":"7aa08908_1f769e05","line":244,"in_reply_to":"7aa08908_62d2e201","updated":"2016-06-14 15:04:30.000000000","message":"would this check be fine to remove?","commit_id":"ac712f459f5c117e0095997b9c3567a9fad56f77"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a308e617608cf92fffff78ece0f9e046530926f0","unresolved":false,"context_lines":[{"line_number":242,"context_line":""},{"line_number":243,"context_line":"    def get_schema(self):"},{"line_number":244,"context_line":"        if self._type is None:"},{"line_number":245,"context_line":"            print(self._type)"},{"line_number":246,"context_line":"            raise NotImplementedError()"},{"line_number":247,"context_line":"        schema \u003d self._type.get_schema()"},{"line_number":248,"context_line":"        schema.update({\u0027readonly\u0027: self.read_only})"}],"source_content_type":"text/x-python","patch_set":13,"id":"7aa08908_82a70ea6","line":245,"updated":"2016-06-13 14:51:21.000000000","message":"seems like some debug code sneaked in.","commit_id":"ac712f459f5c117e0095997b9c3567a9fad56f77"},{"author":{"_account_id":20411,"name":"Julian","email":"julian.sy@att.com","username":"syjulian"},"change_message_id":"39290cccd4fbb471310be4e7205a77ee26141d9a","unresolved":false,"context_lines":[{"line_number":242,"context_line":""},{"line_number":243,"context_line":"    def get_schema(self):"},{"line_number":244,"context_line":"        if self._type is None:"},{"line_number":245,"context_line":"            print(self._type)"},{"line_number":246,"context_line":"            raise NotImplementedError()"},{"line_number":247,"context_line":"        schema \u003d self._type.get_schema()"},{"line_number":248,"context_line":"        schema.update({\u0027readonly\u0027: self.read_only})"}],"source_content_type":"text/x-python","patch_set":13,"id":"7aa08908_1f4dfec3","line":245,"in_reply_to":"7aa08908_82a70ea6","updated":"2016-06-14 15:04:30.000000000","message":"oops. will remove :)","commit_id":"ac712f459f5c117e0095997b9c3567a9fad56f77"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"98c1924ba9e70660142e5656077dfb9bd2fc7d3c","unresolved":false,"context_lines":[{"line_number":241,"context_line":"            return self._type.stringify(value)"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"    def get_schema(self):"},{"line_number":244,"context_line":"        schema \u003d self._type.get_schema()"},{"line_number":245,"context_line":"        schema.update({\u0027readonly\u0027: self.read_only})"},{"line_number":246,"context_line":"        if self.nullable:"},{"line_number":247,"context_line":"            schema[\u0027type\u0027].append(\u0027null\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_3c619a12","line":244,"updated":"2016-06-15 20:29:40.000000000","message":"well, I commented on the previous patch, and you already changed it, but yeah, don\u0027t worry about _type being None here.","commit_id":"647d38cdfdfe6cf095e8ab6e096088bbaa259361"}],"oslo_versionedobjects/tests/test_fields.py":[{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"98c1924ba9e70660142e5656077dfb9bd2fc7d3c","unresolved":false,"context_lines":[{"line_number":102,"context_line":"class TestFieldType(test.TestCase):"},{"line_number":103,"context_line":"    def setUp(self):"},{"line_number":104,"context_line":"        super(TestFieldType, self).setUp()"},{"line_number":105,"context_line":"        self.field_type \u003d FakeFieldType()"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def test_get_schema(self):"},{"line_number":108,"context_line":"        self.assertRaises(NotImplementedError, fields.FieldType().get_schema)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_8fe20e00","line":105,"updated":"2016-06-15 20:29:40.000000000","message":"This isn\u0027t needed for this test right?","commit_id":"647d38cdfdfe6cf095e8ab6e096088bbaa259361"},{"author":{"_account_id":20411,"name":"Julian","email":"julian.sy@att.com","username":"syjulian"},"change_message_id":"ae2979f92c3aaa298fea5f1784b29dde4f9b7f75","unresolved":false,"context_lines":[{"line_number":102,"context_line":"class TestFieldType(test.TestCase):"},{"line_number":103,"context_line":"    def setUp(self):"},{"line_number":104,"context_line":"        super(TestFieldType, self).setUp()"},{"line_number":105,"context_line":"        self.field_type \u003d FakeFieldType()"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def test_get_schema(self):"},{"line_number":108,"context_line":"        self.assertRaises(NotImplementedError, fields.FieldType().get_schema)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_12ec8528","line":105,"in_reply_to":"7aa08908_8fe20e00","updated":"2016-06-15 20:39:48.000000000","message":"nope. will remove","commit_id":"647d38cdfdfe6cf095e8ab6e096088bbaa259361"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"69741fbbe064edd62d9c6c96a4a0827d4699c29c","unresolved":false,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":"class TestFieldType(test.TestCase):"},{"line_number":103,"context_line":"    def setUp(self):"},{"line_number":104,"context_line":"        super(TestFieldType, self).setUp()"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def test_get_schema(self):"},{"line_number":107,"context_line":"        self.assertRaises(NotImplementedError, fields.FieldType().get_schema)"}],"source_content_type":"text/x-python","patch_set":16,"id":"7aa08908_b20ad125","line":104,"updated":"2016-06-15 20:57:08.000000000","message":"You didn\u0027t delete enough :). Since setup isn\u0027t doing anything other than super().setUp(), you can just get rid of the entire setUp function.","commit_id":"4dc9c90502a8638ab8da717f5aca868c6773bd34"}],"oslo_versionedobjects/tests/test_objects.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"40569576c52a37f0dcfbdfd43b2cc7345832004a","unresolved":false,"context_lines":[{"line_number":2007,"context_line":""},{"line_number":2008,"context_line":"        self.test_class \u003d TestObject"},{"line_number":2009,"context_line":""},{"line_number":2010,"context_line":"        self.integerField.get_schema \u003d mock.Mock(return_value\u003d{\"baz\": 42})"},{"line_number":2011,"context_line":"        self.stringField.get_schema \u003d mock.Mock(return_value\u003d{\"fizz\": 43})"},{"line_number":2012,"context_line":"        self.test_class.obj_name \u003d mock.Mock(return_value\u003d\u0027TestObject\u0027)"},{"line_number":2013,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_d25ba7f4","line":2010,"updated":"2016-05-20 12:00:13.000000000","message":"I suggest to use valid schema pieces in the test code. So for an IntegerField use something like \u0027\"type\": \"integer\"\u0027\n\nI think this test can be written without mock as soon as we start implementing the get_shema call on every field","commit_id":"2b3d18ac74e23e1cf34a2e9778efd2df768f7578"},{"author":{"_account_id":20411,"name":"Julian","email":"julian.sy@att.com","username":"syjulian"},"change_message_id":"d4638aa94935ed45fc455866623a4070dc0af741","unresolved":false,"context_lines":[{"line_number":2007,"context_line":""},{"line_number":2008,"context_line":"        self.test_class \u003d TestObject"},{"line_number":2009,"context_line":""},{"line_number":2010,"context_line":"        self.integerField.get_schema \u003d mock.Mock(return_value\u003d{\"baz\": 42})"},{"line_number":2011,"context_line":"        self.stringField.get_schema \u003d mock.Mock(return_value\u003d{\"fizz\": 43})"},{"line_number":2012,"context_line":"        self.test_class.obj_name \u003d mock.Mock(return_value\u003d\u0027TestObject\u0027)"},{"line_number":2013,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_12db0b7d","line":2010,"in_reply_to":"bab6814e_1ca16494","updated":"2016-05-23 18:50:48.000000000","message":"sounds good. the more general the better. I can probably create a FakeFieldType similar to the one in line 30 at  https://review.openstack.org/#/c/318950/4/oslo_versionedobjects/tests/test_fields.py","commit_id":"2b3d18ac74e23e1cf34a2e9778efd2df768f7578"},{"author":{"_account_id":20873,"name":"Laszlo Hegedus","email":"hegedues.laszlo@gmail.com","username":"laszloh"},"change_message_id":"409d2a5c78c400168412a36a8b5f1802d6d1a755","unresolved":false,"context_lines":[{"line_number":2007,"context_line":""},{"line_number":2008,"context_line":"        self.test_class \u003d TestObject"},{"line_number":2009,"context_line":""},{"line_number":2010,"context_line":"        self.integerField.get_schema \u003d mock.Mock(return_value\u003d{\"baz\": 42})"},{"line_number":2011,"context_line":"        self.stringField.get_schema \u003d mock.Mock(return_value\u003d{\"fizz\": 43})"},{"line_number":2012,"context_line":"        self.test_class.obj_name \u003d mock.Mock(return_value\u003d\u0027TestObject\u0027)"},{"line_number":2013,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_1ca16494","line":2010,"in_reply_to":"bab6814e_c3cd9bb8","updated":"2016-05-23 18:31:05.000000000","message":"I agree that the get_schema methods must be tested individually.\n\nMaybe it is nit-picking, but I would start mocking on a lower level, though. I mean, i would try to avoid overwriting the get_schema method of self.integerField and self.stringField that are proper field objects. Instead, I would use two mock objects:\n\nself.nullable_field \u003d mock.Mock(nullable\u003dTrue)\nself.non_nullable_field \u003d mock.Mock(nullable\u003dFalse)\n\n...\n\nself.nullable_field.get_schema.return_value \u003d ...\nself.non_nullable_field.get_schema.return_value \u003d ...\n\nI\u0027m not sure if this will work out of the box. It depends on wether the fields of a VersionedObject can only be Field objects or anything in this case.","commit_id":"2b3d18ac74e23e1cf34a2e9778efd2df768f7578"},{"author":{"_account_id":20411,"name":"Julian","email":"julian.sy@att.com","username":"syjulian"},"change_message_id":"2080a5af9b72b99cd6d60e033b405c3d1e2cfcde","unresolved":false,"context_lines":[{"line_number":2007,"context_line":""},{"line_number":2008,"context_line":"        self.test_class \u003d TestObject"},{"line_number":2009,"context_line":""},{"line_number":2010,"context_line":"        self.integerField.get_schema \u003d mock.Mock(return_value\u003d{\"baz\": 42})"},{"line_number":2011,"context_line":"        self.stringField.get_schema \u003d mock.Mock(return_value\u003d{\"fizz\": 43})"},{"line_number":2012,"context_line":"        self.test_class.obj_name \u003d mock.Mock(return_value\u003d\u0027TestObject\u0027)"},{"line_number":2013,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_c3cd9bb8","line":2010,"in_reply_to":"bab6814e_d25ba7f4","updated":"2016-05-20 12:53:18.000000000","message":"Sure thing. I\u0027ll go and change the return value similar to the real thing, but I think we should still leave mocks even after the implementation. That way, this test\u0027s scope doesn\u0027t go outside testing just the ovo method. The field\u0027s get_schema method can be tested individually.","commit_id":"2b3d18ac74e23e1cf34a2e9778efd2df768f7578"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b89867cceb76b6e87bdb6677462b39f375f86a9e","unresolved":false,"context_lines":[{"line_number":2022,"context_line":"            \u0027title\u0027: \u0027TestObject\u0027,"},{"line_number":2023,"context_line":"            \u0027description\u0027: \u0027fields of TestObject\u0027,"},{"line_number":2024,"context_line":"            \u0027type\u0027: \u0027object\u0027,"},{"line_number":2025,"context_line":"            \u0027properties\u0027: {\u0027foo\u0027: {\u0027type\u0027: \u0027integer\u0027, \u0027nullable\u0027: False},"},{"line_number":2026,"context_line":"                           \u0027bar\u0027: {\u0027type\u0027: \u0027string\u0027, \u0027nullable\u0027: True}},"},{"line_number":2027,"context_line":"            \u0027required\u0027: [\u0027foo\u0027]"},{"line_number":2028,"context_line":"        }, schema)"}],"source_content_type":"text/x-python","patch_set":4,"id":"bab6814e_443572d8","line":2025,"updated":"2016-05-25 10:45:37.000000000","message":"Now I realized why I didn\u0027t liked this originally. (Sorry to take much time to notice it). This is not the schema the serialized object will have. See an example in https://git.openstack.org/cgit/openstack/nova/plain/doc/notification_samples/service-update.json Here the \"payload\" field holds a serialized format of versioned object. There is couple of metadata field nova_object.namespace, nova_object.name, nova_object.version and the nova_object.data field holds the data fields of the versioned object. This means two things\n1) the generate schema shall match the metadata field as well\n2) the current test only tests half of the story (the schema is generated) and that causes it doesn\u0027t detect the false assumtions. While I agree to have unit test with small scope I think we need additional test where:\n* we have some test objects with various fields\n* we generate a schema from the object\n* we serialize the object\n* we assert that the serialized from of the object matches the schema","commit_id":"3887ec92254ae7dd6c99c8a5881095edb437a363"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3ce3b1ec4600cd689f2d92b3020951ddac0bfe1e","unresolved":false,"context_lines":[{"line_number":2022,"context_line":"            \u0027title\u0027: \u0027TestObject\u0027,"},{"line_number":2023,"context_line":"            \u0027description\u0027: \u0027fields of TestObject\u0027,"},{"line_number":2024,"context_line":"            \u0027type\u0027: \u0027object\u0027,"},{"line_number":2025,"context_line":"            \u0027properties\u0027: {\u0027foo\u0027: {\u0027type\u0027: \u0027integer\u0027, \u0027nullable\u0027: False},"},{"line_number":2026,"context_line":"                           \u0027bar\u0027: {\u0027type\u0027: \u0027string\u0027, \u0027nullable\u0027: True}},"},{"line_number":2027,"context_line":"            \u0027required\u0027: [\u0027foo\u0027]"},{"line_number":2028,"context_line":"        }, schema)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9abb7d3a_e93d5dbc","line":2025,"in_reply_to":"9abb7d3a_254ce66f","updated":"2016-05-30 15:34:50.000000000","message":"The current test_to_json_schema test case does not really assert that the schema of the json serialized object are the same as the schema we get from the object itself. The false assumption here is that you assumed that the json serialized object is a simple dict without metadata.","commit_id":"3887ec92254ae7dd6c99c8a5881095edb437a363"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"ad6a20fe11ad97f9641a868e5fd8d55b05a39fa9","unresolved":false,"context_lines":[{"line_number":2022,"context_line":"            \u0027title\u0027: \u0027TestObject\u0027,"},{"line_number":2023,"context_line":"            \u0027description\u0027: \u0027fields of TestObject\u0027,"},{"line_number":2024,"context_line":"            \u0027type\u0027: \u0027object\u0027,"},{"line_number":2025,"context_line":"            \u0027properties\u0027: {\u0027foo\u0027: {\u0027type\u0027: \u0027integer\u0027, \u0027nullable\u0027: False},"},{"line_number":2026,"context_line":"                           \u0027bar\u0027: {\u0027type\u0027: \u0027string\u0027, \u0027nullable\u0027: True}},"},{"line_number":2027,"context_line":"            \u0027required\u0027: [\u0027foo\u0027]"},{"line_number":2028,"context_line":"        }, schema)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9abb7d3a_c4cda5b8","line":2025,"in_reply_to":"9abb7d3a_d19d720b","updated":"2016-05-31 16:17:24.000000000","message":"That test would be a good addition to the test set of this feature. \n\nThe current test still can be kept but it needs to be fixed to assert the right schema, which matches to the serialized form of the TestObject, which is something like:\n\n        \"osloversionedobjects.namespace\": \"osloversionedobjects\",\n        \"nova_object.name\": \"TestObject\",\n        \"nova_object.version\": \"1.0\",\n        \"nova_object.data\": {\n            \"foo\": 13,\n            \"bar\": \u0027something\u0027\n        }","commit_id":"3887ec92254ae7dd6c99c8a5881095edb437a363"},{"author":{"_account_id":20411,"name":"Julian","email":"julian.sy@att.com","username":"syjulian"},"change_message_id":"20df6173d40701d2be8feca1926fc4f379c26c65","unresolved":false,"context_lines":[{"line_number":2022,"context_line":"            \u0027title\u0027: \u0027TestObject\u0027,"},{"line_number":2023,"context_line":"            \u0027description\u0027: \u0027fields of TestObject\u0027,"},{"line_number":2024,"context_line":"            \u0027type\u0027: \u0027object\u0027,"},{"line_number":2025,"context_line":"            \u0027properties\u0027: {\u0027foo\u0027: {\u0027type\u0027: \u0027integer\u0027, \u0027nullable\u0027: False},"},{"line_number":2026,"context_line":"                           \u0027bar\u0027: {\u0027type\u0027: \u0027string\u0027, \u0027nullable\u0027: True}},"},{"line_number":2027,"context_line":"            \u0027required\u0027: [\u0027foo\u0027]"},{"line_number":2028,"context_line":"        }, schema)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9abb7d3a_d19d720b","line":2025,"in_reply_to":"9abb7d3a_e93d5dbc","updated":"2016-05-31 13:42:58.000000000","message":"so I would need to have a tests that would serialize an object and compare its schema to the one generated?","commit_id":"3887ec92254ae7dd6c99c8a5881095edb437a363"},{"author":{"_account_id":20411,"name":"Julian","email":"julian.sy@att.com","username":"syjulian"},"change_message_id":"545b917dd8bb80a226704e6cce88d16ff3bdb2d4","unresolved":false,"context_lines":[{"line_number":2022,"context_line":"            \u0027title\u0027: \u0027TestObject\u0027,"},{"line_number":2023,"context_line":"            \u0027description\u0027: \u0027fields of TestObject\u0027,"},{"line_number":2024,"context_line":"            \u0027type\u0027: \u0027object\u0027,"},{"line_number":2025,"context_line":"            \u0027properties\u0027: {\u0027foo\u0027: {\u0027type\u0027: \u0027integer\u0027, \u0027nullable\u0027: False},"},{"line_number":2026,"context_line":"                           \u0027bar\u0027: {\u0027type\u0027: \u0027string\u0027, \u0027nullable\u0027: True}},"},{"line_number":2027,"context_line":"            \u0027required\u0027: [\u0027foo\u0027]"},{"line_number":2028,"context_line":"        }, schema)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9abb7d3a_254ce66f","line":2025,"in_reply_to":"bab6814e_443572d8","updated":"2016-05-27 19:18:08.000000000","message":"what type of test do you mean by not detecting false assumptions?","commit_id":"3887ec92254ae7dd6c99c8a5881095edb437a363"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"88617a5b93d51a5b1a417405bc35a679b426fc2c","unresolved":false,"context_lines":[{"line_number":2015,"context_line":"        self.nonNullableField \u003d fields.Field(self.FakeFieldType,"},{"line_number":2016,"context_line":"                                             nullable\u003dFalse)"},{"line_number":2017,"context_line":"        self.nullableField \u003d fields.Field(self.FakeFieldType,"},{"line_number":2018,"context_line":"                                          nullable\u003dFalse)"},{"line_number":2019,"context_line":""},{"line_number":2020,"context_line":"        class TestObject(base.VersionedObject):"},{"line_number":2021,"context_line":"            fields \u003d {\u0027foo\u0027: self.nonNullableField,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9abb7d3a_fd77d338","line":2018,"updated":"2016-06-03 16:12:23.000000000","message":"uhh... I think you want nullable to be True here?","commit_id":"b869687cafeef7a8ae72a61ff6085c74a1f6453b"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"88617a5b93d51a5b1a417405bc35a679b426fc2c","unresolved":false,"context_lines":[{"line_number":2026,"context_line":"        self.nonNullableField.get_schema \u003d \\"},{"line_number":2027,"context_line":"            mock.Mock(return_value\u003d{\u0027type\u0027: \u0027fake\u0027, \u0027nullable\u0027: False})"},{"line_number":2028,"context_line":"        self.nullableField.get_schema \u003d \\"},{"line_number":2029,"context_line":"            mock.Mock(return_value\u003d{\u0027type\u0027: \u0027fake\u0027, \u0027nullable\u0027: True})"},{"line_number":2030,"context_line":"        self.test_class.obj_name \u003d mock.Mock(return_value\u003d\u0027TestObject\u0027)"},{"line_number":2031,"context_line":""},{"line_number":2032,"context_line":"    @mock.patch("}],"source_content_type":"text/x-python","patch_set":6,"id":"9abb7d3a_bdea6baa","line":2029,"updated":"2016-06-03 16:12:23.000000000","message":"but then again you\u0027re overriding get_schema to return nullable: True, so the nullable above doesn\u0027t really matter.","commit_id":"b869687cafeef7a8ae72a61ff6085c74a1f6453b"},{"author":{"_account_id":20411,"name":"Julian","email":"julian.sy@att.com","username":"syjulian"},"change_message_id":"134a46dbf409fb43dd83b863925ece20b696bd8e","unresolved":false,"context_lines":[{"line_number":2026,"context_line":"        self.nonNullableField.get_schema \u003d \\"},{"line_number":2027,"context_line":"            mock.Mock(return_value\u003d{\u0027type\u0027: \u0027fake\u0027, \u0027nullable\u0027: False})"},{"line_number":2028,"context_line":"        self.nullableField.get_schema \u003d \\"},{"line_number":2029,"context_line":"            mock.Mock(return_value\u003d{\u0027type\u0027: \u0027fake\u0027, \u0027nullable\u0027: True})"},{"line_number":2030,"context_line":"        self.test_class.obj_name \u003d mock.Mock(return_value\u003d\u0027TestObject\u0027)"},{"line_number":2031,"context_line":""},{"line_number":2032,"context_line":"    @mock.patch("}],"source_content_type":"text/x-python","patch_set":6,"id":"9abb7d3a_4561e5a7","line":2029,"in_reply_to":"9abb7d3a_bdea6baa","updated":"2016-06-03 17:39:47.000000000","message":"yeah. i should just remove the setting of the nullable in the object declaration","commit_id":"b869687cafeef7a8ae72a61ff6085c74a1f6453b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"ffbf5133f5c0bc0375c18ab56c18eb9add590fca","unresolved":false,"context_lines":[{"line_number":2022,"context_line":"        self.test_class \u003d TestObject"},{"line_number":2023,"context_line":""},{"line_number":2024,"context_line":"        self.nonNullableField.get_schema \u003d \\"},{"line_number":2025,"context_line":"            mock.Mock(return_value\u003d{\u0027type\u0027: \u0027fake\u0027, \u0027nullable\u0027: False})"},{"line_number":2026,"context_line":"        self.nullableField.get_schema \u003d \\"},{"line_number":2027,"context_line":"            mock.Mock(return_value\u003d{\u0027type\u0027: \u0027fake\u0027, \u0027nullable\u0027: True})"},{"line_number":2028,"context_line":"        self.test_class.obj_name \u003d mock.Mock(return_value\u003d\u0027TestObject\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_db6d0334","line":2025,"range":{"start_line":2025,"start_character":35,"end_line":2025,"end_character":70},"updated":"2016-06-06 09:08:04.000000000","message":"is it a valid jsonschema type declaration for nullable types? I know that {\u0027type\u0027: [\u0027string\u0027, \u0027null\u0027]} is one way to say that the give property can have a string value or can be null.","commit_id":"4d8232e9515e61ae6dda49bef590b856964cbc2d"},{"author":{"_account_id":20411,"name":"Julian","email":"julian.sy@att.com","username":"syjulian"},"change_message_id":"ed5ab8c88f31ee39fa0eac16683c999c144f5b65","unresolved":false,"context_lines":[{"line_number":2022,"context_line":"        self.test_class \u003d TestObject"},{"line_number":2023,"context_line":""},{"line_number":2024,"context_line":"        self.nonNullableField.get_schema \u003d \\"},{"line_number":2025,"context_line":"            mock.Mock(return_value\u003d{\u0027type\u0027: \u0027fake\u0027, \u0027nullable\u0027: False})"},{"line_number":2026,"context_line":"        self.nullableField.get_schema \u003d \\"},{"line_number":2027,"context_line":"            mock.Mock(return_value\u003d{\u0027type\u0027: \u0027fake\u0027, \u0027nullable\u0027: True})"},{"line_number":2028,"context_line":"        self.test_class.obj_name \u003d mock.Mock(return_value\u003d\u0027TestObject\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_40f0f090","line":2025,"range":{"start_line":2025,"start_character":35,"end_line":2025,"end_character":70},"in_reply_to":"7aa08908_db6d0334","updated":"2016-06-06 15:08:32.000000000","message":"you\u0027re right. will fix","commit_id":"4d8232e9515e61ae6dda49bef590b856964cbc2d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"ffbf5133f5c0bc0375c18ab56c18eb9add590fca","unresolved":false,"context_lines":[{"line_number":2027,"context_line":"            mock.Mock(return_value\u003d{\u0027type\u0027: \u0027fake\u0027, \u0027nullable\u0027: True})"},{"line_number":2028,"context_line":"        self.test_class.obj_name \u003d mock.Mock(return_value\u003d\u0027TestObject\u0027)"},{"line_number":2029,"context_line":""},{"line_number":2030,"context_line":"    @mock.patch("},{"line_number":2031,"context_line":"        \u0027oslo_versionedobjects.base.VersionedObject._obj_primitive_key\u0027,"},{"line_number":2032,"context_line":"        side_effect\u003dmock_obj_primitive_key)"},{"line_number":2033,"context_line":"    @mock.patch("},{"line_number":2034,"context_line":"        \u0027oslo_versionedobjects.base.VersionedObject.obj_name\u0027,"},{"line_number":2035,"context_line":"        return_value\u003d\u0027Fake Object\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_7ba4cf56","line":2032,"range":{"start_line":2030,"start_character":0,"end_line":2032,"end_character":43},"updated":"2016-06-06 09:08:04.000000000","message":"It seems wrong that we need to mock this. Shouldn\u0027t be the original implementation of the this function does similar thing?","commit_id":"4d8232e9515e61ae6dda49bef590b856964cbc2d"},{"author":{"_account_id":20411,"name":"Julian","email":"julian.sy@att.com","username":"syjulian"},"change_message_id":"ed5ab8c88f31ee39fa0eac16683c999c144f5b65","unresolved":false,"context_lines":[{"line_number":2027,"context_line":"            mock.Mock(return_value\u003d{\u0027type\u0027: \u0027fake\u0027, \u0027nullable\u0027: True})"},{"line_number":2028,"context_line":"        self.test_class.obj_name \u003d mock.Mock(return_value\u003d\u0027TestObject\u0027)"},{"line_number":2029,"context_line":""},{"line_number":2030,"context_line":"    @mock.patch("},{"line_number":2031,"context_line":"        \u0027oslo_versionedobjects.base.VersionedObject._obj_primitive_key\u0027,"},{"line_number":2032,"context_line":"        side_effect\u003dmock_obj_primitive_key)"},{"line_number":2033,"context_line":"    @mock.patch("},{"line_number":2034,"context_line":"        \u0027oslo_versionedobjects.base.VersionedObject.obj_name\u0027,"},{"line_number":2035,"context_line":"        return_value\u003d\u0027Fake Object\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_40e59035","line":2032,"range":{"start_line":2030,"start_character":0,"end_line":2032,"end_character":43},"in_reply_to":"7aa08908_7ba4cf56","updated":"2016-06-06 15:08:32.000000000","message":"I added these just to assert that these methods are called. That way, if the implementation goes bad, this test won\u0027t get affected that much.","commit_id":"4d8232e9515e61ae6dda49bef590b856964cbc2d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"ffbf5133f5c0bc0375c18ab56c18eb9add590fca","unresolved":false,"context_lines":[{"line_number":2030,"context_line":"    @mock.patch("},{"line_number":2031,"context_line":"        \u0027oslo_versionedobjects.base.VersionedObject._obj_primitive_key\u0027,"},{"line_number":2032,"context_line":"        side_effect\u003dmock_obj_primitive_key)"},{"line_number":2033,"context_line":"    @mock.patch("},{"line_number":2034,"context_line":"        \u0027oslo_versionedobjects.base.VersionedObject.obj_name\u0027,"},{"line_number":2035,"context_line":"        return_value\u003d\u0027Fake Object\u0027)"},{"line_number":2036,"context_line":"    def test_to_json_schema(self, mock_oname, mock_opk):"},{"line_number":2037,"context_line":"        schema \u003d self.test_class.to_json_schema()"},{"line_number":2038,"context_line":"        self.nonNullableField.get_schema.assert_called_once_with()"}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_dbb0638e","line":2035,"range":{"start_line":2033,"start_character":0,"end_line":2035,"end_character":35},"updated":"2016-06-06 09:08:04.000000000","message":"ditto","commit_id":"4d8232e9515e61ae6dda49bef590b856964cbc2d"},{"author":{"_account_id":20411,"name":"Julian","email":"julian.sy@att.com","username":"syjulian"},"change_message_id":"ed5ab8c88f31ee39fa0eac16683c999c144f5b65","unresolved":false,"context_lines":[{"line_number":2030,"context_line":"    @mock.patch("},{"line_number":2031,"context_line":"        \u0027oslo_versionedobjects.base.VersionedObject._obj_primitive_key\u0027,"},{"line_number":2032,"context_line":"        side_effect\u003dmock_obj_primitive_key)"},{"line_number":2033,"context_line":"    @mock.patch("},{"line_number":2034,"context_line":"        \u0027oslo_versionedobjects.base.VersionedObject.obj_name\u0027,"},{"line_number":2035,"context_line":"        return_value\u003d\u0027Fake Object\u0027)"},{"line_number":2036,"context_line":"    def test_to_json_schema(self, mock_oname, mock_opk):"},{"line_number":2037,"context_line":"        schema \u003d self.test_class.to_json_schema()"},{"line_number":2038,"context_line":"        self.nonNullableField.get_schema.assert_called_once_with()"}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_e0cabca0","line":2035,"range":{"start_line":2033,"start_character":0,"end_line":2035,"end_character":35},"in_reply_to":"7aa08908_dbb0638e","updated":"2016-06-06 15:08:32.000000000","message":"same reasoning as above","commit_id":"4d8232e9515e61ae6dda49bef590b856964cbc2d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"ffbf5133f5c0bc0375c18ab56c18eb9add590fca","unresolved":false,"context_lines":[{"line_number":2055,"context_line":"                    \u0027type\u0027: \u0027object\u0027,"},{"line_number":2056,"context_line":"                    \u0027description\u0027: \u0027fields of TestObject\u0027,"},{"line_number":2057,"context_line":"                    \u0027properties\u0027: {"},{"line_number":2058,"context_line":"                        \u0027foo\u0027: {\u0027type\u0027: \u0027fake\u0027, \u0027nullable\u0027: False},"},{"line_number":2059,"context_line":"                        \u0027bar\u0027: {\u0027type\u0027: \u0027fake\u0027, \u0027nullable\u0027: True}"},{"line_number":2060,"context_line":"                    },"},{"line_number":2061,"context_line":"                },"}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_5bc75312","line":2058,"range":{"start_line":2058,"start_character":48,"end_line":2058,"end_character":65},"updated":"2016-06-06 09:08:04.000000000","message":"I think this is not a valid jsonschema piece","commit_id":"4d8232e9515e61ae6dda49bef590b856964cbc2d"},{"author":{"_account_id":20411,"name":"Julian","email":"julian.sy@att.com","username":"syjulian"},"change_message_id":"ed5ab8c88f31ee39fa0eac16683c999c144f5b65","unresolved":false,"context_lines":[{"line_number":2055,"context_line":"                    \u0027type\u0027: \u0027object\u0027,"},{"line_number":2056,"context_line":"                    \u0027description\u0027: \u0027fields of TestObject\u0027,"},{"line_number":2057,"context_line":"                    \u0027properties\u0027: {"},{"line_number":2058,"context_line":"                        \u0027foo\u0027: {\u0027type\u0027: \u0027fake\u0027, \u0027nullable\u0027: False},"},{"line_number":2059,"context_line":"                        \u0027bar\u0027: {\u0027type\u0027: \u0027fake\u0027, \u0027nullable\u0027: True}"},{"line_number":2060,"context_line":"                    },"},{"line_number":2061,"context_line":"                },"}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_007a6824","line":2058,"range":{"start_line":2058,"start_character":48,"end_line":2058,"end_character":65},"in_reply_to":"7aa08908_5bc75312","updated":"2016-06-06 15:08:32.000000000","message":"agreed. will fix","commit_id":"4d8232e9515e61ae6dda49bef590b856964cbc2d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"ffbf5133f5c0bc0375c18ab56c18eb9add590fca","unresolved":false,"context_lines":[{"line_number":2056,"context_line":"                    \u0027description\u0027: \u0027fields of TestObject\u0027,"},{"line_number":2057,"context_line":"                    \u0027properties\u0027: {"},{"line_number":2058,"context_line":"                        \u0027foo\u0027: {\u0027type\u0027: \u0027fake\u0027, \u0027nullable\u0027: False},"},{"line_number":2059,"context_line":"                        \u0027bar\u0027: {\u0027type\u0027: \u0027fake\u0027, \u0027nullable\u0027: True}"},{"line_number":2060,"context_line":"                    },"},{"line_number":2061,"context_line":"                },"},{"line_number":2062,"context_line":"                \u0027required\u0027: [\u0027foo\u0027]"}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_3bcc0735","line":2059,"range":{"start_line":2059,"start_character":48,"end_line":2059,"end_character":64},"updated":"2016-06-06 09:08:04.000000000","message":"ditto","commit_id":"4d8232e9515e61ae6dda49bef590b856964cbc2d"},{"author":{"_account_id":20411,"name":"Julian","email":"julian.sy@att.com","username":"syjulian"},"change_message_id":"ed5ab8c88f31ee39fa0eac16683c999c144f5b65","unresolved":false,"context_lines":[{"line_number":2056,"context_line":"                    \u0027description\u0027: \u0027fields of TestObject\u0027,"},{"line_number":2057,"context_line":"                    \u0027properties\u0027: {"},{"line_number":2058,"context_line":"                        \u0027foo\u0027: {\u0027type\u0027: \u0027fake\u0027, \u0027nullable\u0027: False},"},{"line_number":2059,"context_line":"                        \u0027bar\u0027: {\u0027type\u0027: \u0027fake\u0027, \u0027nullable\u0027: True}"},{"line_number":2060,"context_line":"                    },"},{"line_number":2061,"context_line":"                },"},{"line_number":2062,"context_line":"                \u0027required\u0027: [\u0027foo\u0027]"}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_40abd074","line":2059,"range":{"start_line":2059,"start_character":48,"end_line":2059,"end_character":64},"in_reply_to":"7aa08908_3bcc0735","updated":"2016-06-06 15:08:32.000000000","message":"agreed. will fix","commit_id":"4d8232e9515e61ae6dda49bef590b856964cbc2d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f6ad41a499983ab4448acb95e424110f3c25462a","unresolved":false,"context_lines":[{"line_number":2048,"context_line":"                        \u0027bar\u0027: {\u0027type\u0027: [\u0027fake\u0027, \u0027null\u0027]}"},{"line_number":2049,"context_line":"                    },"},{"line_number":2050,"context_line":"                },"},{"line_number":2051,"context_line":"                \u0027required\u0027: [\u0027bar\u0027, \u0027foo\u0027]"},{"line_number":2052,"context_line":"            },"},{"line_number":2053,"context_line":"            \u0027required\u0027: [\u0027versioned_object.namespace\u0027, \u0027versioned_object.name\u0027,"},{"line_number":2054,"context_line":"                         \u0027versioned_object.version\u0027, \u0027versioned_object.data\u0027]"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_8b971047","line":2051,"updated":"2016-06-08 10:42:50.000000000","message":"This means that we require that \u0027bar\u0027 is present, even if it has null value. That seem OK to me.","commit_id":"c65bce49d4f7b4d8e8d178616aa734e75fe44fe1"},{"author":{"_account_id":20411,"name":"Julian","email":"julian.sy@att.com","username":"syjulian"},"change_message_id":"99082170728ed5bc6f8e5b4f8f3bb79ed909bbdc","unresolved":false,"context_lines":[{"line_number":2048,"context_line":"                        \u0027bar\u0027: {\u0027type\u0027: [\u0027fake\u0027, \u0027null\u0027]}"},{"line_number":2049,"context_line":"                    },"},{"line_number":2050,"context_line":"                },"},{"line_number":2051,"context_line":"                \u0027required\u0027: [\u0027bar\u0027, \u0027foo\u0027]"},{"line_number":2052,"context_line":"            },"},{"line_number":2053,"context_line":"            \u0027required\u0027: [\u0027versioned_object.namespace\u0027, \u0027versioned_object.name\u0027,"},{"line_number":2054,"context_line":"                         \u0027versioned_object.version\u0027, \u0027versioned_object.data\u0027]"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_3f6293d8","line":2051,"in_reply_to":"7aa08908_8b971047","updated":"2016-06-08 12:25:22.000000000","message":"yes. I assumed before that being nullable means that it\u0027s not a required field, but I\u0027m not sure if that\u0027s the case","commit_id":"c65bce49d4f7b4d8e8d178616aa734e75fe44fe1"}]}
