)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"119dd13c9295ff5a11ddd324b5217fe87c1b5d8e","unresolved":false,"context_lines":[{"line_number":27,"context_line":"The patch fixes this by adding schema validation to v2."},{"line_number":28,"context_line":"For now, API schema validation is only on v3."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"This can help improve end user experience."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Closes-Bug: #1455298"},{"line_number":33,"context_line":"Change-Id: I65bfc1b7783e2b2ae938e3c4429f5acf3af9d1af"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9a8ffd7b_b573db7f","line":30,"updated":"2015-11-25 14:27:44.000000000","message":"Is this pattern going to be used with other parts of the v2 api? Maybe in subsequent patch sets?","commit_id":"0b2dd8de0b5d1f35112c32225bd8cbf40d0bd335"}],"keystone/identity/controllers.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3a7cd320e4493985b3291d4141bb4a24bfc6de1d","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    # CRUD extension"},{"line_number":63,"context_line":"    @controller.v2_deprecated"},{"line_number":64,"context_line":"    @validation.validated(schema.user_create_v2, \u0027user\u0027)"},{"line_number":65,"context_line":"    def create_user(self, context, user):"},{"line_number":66,"context_line":"        user \u003d self._normalize_OSKSADM_password_on_request(user)"},{"line_number":67,"context_line":"        user \u003d self.normalize_username_in_request(user)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a8ffd7b_2a36e5b4","line":64,"updated":"2015-11-30 17:40:16.000000000","message":"since we have this here, we should remove calls to clean.py - https://github.com/openstack/keystone/blob/933e118eee3b494401123f3dc23d025b6c4d4803/keystone/identity/core.py#L812\n\n\nThe clean.py module was what validated requests prior to the jsonschema implementation.","commit_id":"0b2dd8de0b5d1f35112c32225bd8cbf40d0bd335"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5c9c338edbf4ed1b5f98cd17539d7d27ef322435","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    # CRUD extension"},{"line_number":63,"context_line":"    @controller.v2_deprecated"},{"line_number":64,"context_line":"    @validation.validated(schema.user_create_v2, \u0027user\u0027)"},{"line_number":65,"context_line":"    def create_user(self, context, user):"},{"line_number":66,"context_line":"        user \u003d self._normalize_OSKSADM_password_on_request(user)"},{"line_number":67,"context_line":"        user \u003d self.normalize_username_in_request(user)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a710552_c7808249","line":64,"in_reply_to":"9a8ffd7b_04e58d36","updated":"2015-12-14 19:16:18.000000000","message":"++","commit_id":"0b2dd8de0b5d1f35112c32225bd8cbf40d0bd335"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"1fbce8350e5b3f73ac97480cb088d1febc207da5","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    # CRUD extension"},{"line_number":63,"context_line":"    @controller.v2_deprecated"},{"line_number":64,"context_line":"    @validation.validated(schema.user_create_v2, \u0027user\u0027)"},{"line_number":65,"context_line":"    def create_user(self, context, user):"},{"line_number":66,"context_line":"        user \u003d self._normalize_OSKSADM_password_on_request(user)"},{"line_number":67,"context_line":"        user \u003d self.normalize_username_in_request(user)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a8ffd7b_04e58d36","line":64,"in_reply_to":"9a8ffd7b_2a36e5b4","updated":"2015-12-02 18:43:19.000000000","message":"++","commit_id":"0b2dd8de0b5d1f35112c32225bd8cbf40d0bd335"}],"keystone/identity/schema.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5c9c338edbf4ed1b5f98cd17539d7d27ef322435","unresolved":false,"context_lines":[{"line_number":35,"context_line":"user_create \u003d {"},{"line_number":36,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":37,"context_line":"    \u0027properties\u0027: _user_properties,"},{"line_number":38,"context_line":"    \u0027required\u0027: [\u0027name\u0027],"},{"line_number":39,"context_line":"    \u0027additionalProperties\u0027: True"},{"line_number":40,"context_line":"}"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5a710552_87483a2f","side":"PARENT","line":38,"updated":"2015-12-14 19:16:18.000000000","message":"^","commit_id":"68e885d0ad0b64e892de891b07137991e103745f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5c9c338edbf4ed1b5f98cd17539d7d27ef322435","unresolved":false,"context_lines":[{"line_number":24,"context_line":"# Schema for Identity v2.0 API"},{"line_number":25,"context_line":"_user_properties_v2 \u003d {"},{"line_number":26,"context_line":"    \u0027email\u0027: {"},{"line_number":27,"context_line":"        \u0027type\u0027: [\u0027string\u0027, \u0027null\u0027]"},{"line_number":28,"context_line":"    },"},{"line_number":29,"context_line":"    \u0027enabled\u0027: parameter_types.boolean,"},{"line_number":30,"context_line":"    \u0027name\u0027: _identity_name,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a710552_4769f28a","line":27,"updated":"2015-12-14 19:16:18.000000000","message":"Doesn\u0027t jsonschema have an email type?","commit_id":"0b2dd8de0b5d1f35112c32225bd8cbf40d0bd335"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5c9c338edbf4ed1b5f98cd17539d7d27ef322435","unresolved":false,"context_lines":[{"line_number":37,"context_line":"user_create_v2 \u003d {"},{"line_number":38,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":39,"context_line":"    \u0027properties\u0027: _user_properties_v2,"},{"line_number":40,"context_line":"    \u0027minProperties\u0027: 1,"},{"line_number":41,"context_line":"    \u0027additionalProperties\u0027: True"},{"line_number":42,"context_line":"}"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5a710552_e75d7eed","line":40,"updated":"2015-12-14 19:16:18.000000000","message":"Just like v3 user create below:\n\n  \u0027required\u0027: [\u0027name\u0027],\n\nWhich makes \u0027minProperties\u0027 redundant.\n\nIt would also be cool if you copied the v3 \u0027user_create\u0027 object and simply mutated it into what v2 expects for validation (for example, v2 expects tenant_id rather than default_project_id), rather than copy/pasting the whole thing. That would make it easier to maintain.","commit_id":"0b2dd8de0b5d1f35112c32225bd8cbf40d0bd335"}],"keystone/tests/unit/test_validation.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"119dd13c9295ff5a11ddd324b5217fe87c1b5d8e","unresolved":false,"context_lines":[{"line_number":1855,"context_line":""},{"line_number":1856,"context_line":"    def test_validate_user_create_fails_with_name_of_wrong_type(self):"},{"line_number":1857,"context_line":"        \"\"\"Exception raised when validating a username of wrong type.\"\"\""},{"line_number":1858,"context_line":"        request_to_validate \u003d {\u0027name\u0027: True}"},{"line_number":1859,"context_line":"        self.assertRaises(exception.SchemaValidationError,"},{"line_number":1860,"context_line":"                          self.create_user_validator.validate,"},{"line_number":1861,"context_line":"                          request_to_validate)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a8ffd7b_756333dd","line":1858,"updated":"2015-11-25 14:27:44.000000000","message":"integers could also be tested here, too.","commit_id":"0b2dd8de0b5d1f35112c32225bd8cbf40d0bd335"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3a7cd320e4493985b3291d4141bb4a24bfc6de1d","unresolved":false,"context_lines":[{"line_number":1855,"context_line":""},{"line_number":1856,"context_line":"    def test_validate_user_create_fails_with_name_of_wrong_type(self):"},{"line_number":1857,"context_line":"        \"\"\"Exception raised when validating a username of wrong type.\"\"\""},{"line_number":1858,"context_line":"        request_to_validate \u003d {\u0027name\u0027: True}"},{"line_number":1859,"context_line":"        self.assertRaises(exception.SchemaValidationError,"},{"line_number":1860,"context_line":"                          self.create_user_validator.validate,"},{"line_number":1861,"context_line":"                          request_to_validate)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a8ffd7b_ea7a1d77","line":1858,"in_reply_to":"9a8ffd7b_756333dd","updated":"2015-11-30 17:40:16.000000000","message":"This could be done in a follow on patch though.","commit_id":"0b2dd8de0b5d1f35112c32225bd8cbf40d0bd335"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"079512e3b461225dcad8127d303a9297934256c4","unresolved":false,"context_lines":[{"line_number":1895,"context_line":"        self.create_user_validator.validate(request_to_validate)"},{"line_number":1896,"context_line":""},{"line_number":1897,"context_line":"    def test_validate_user_create_fails_with_invalid_password_type(self):"},{"line_number":1898,"context_line":"        \"\"\"Exception raised when user password is of the wrong type.\"\"\""},{"line_number":1899,"context_line":"        request_to_validate \u003d {\u0027name\u0027: self.user_name,"},{"line_number":1900,"context_line":"                               \u0027password\u0027: True}"},{"line_number":1901,"context_line":"        self.assertRaises(exception.SchemaValidationError,"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa80f949_912d5697","line":1898,"updated":"2015-11-06 01:31:34.000000000","message":"(nit) IMO, the tests didn\u0027t need docs, as their names are very descriptive already. However, this should not block this patch, it looks good to me as it is.","commit_id":"0b2dd8de0b5d1f35112c32225bd8cbf40d0bd335"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5c9c338edbf4ed1b5f98cd17539d7d27ef322435","unresolved":false,"context_lines":[{"line_number":1895,"context_line":"        self.create_user_validator.validate(request_to_validate)"},{"line_number":1896,"context_line":""},{"line_number":1897,"context_line":"    def test_validate_user_create_fails_with_invalid_password_type(self):"},{"line_number":1898,"context_line":"        \"\"\"Exception raised when user password is of the wrong type.\"\"\""},{"line_number":1899,"context_line":"        request_to_validate \u003d {\u0027name\u0027: self.user_name,"},{"line_number":1900,"context_line":"                               \u0027password\u0027: True}"},{"line_number":1901,"context_line":"        self.assertRaises(exception.SchemaValidationError,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a710552_078d2a31","line":1898,"in_reply_to":"fa80f949_912d5697","updated":"2015-12-14 19:16:18.000000000","message":"The tests below have docstrings, and why on earth would you turn down totally valid docstrings?!","commit_id":"0b2dd8de0b5d1f35112c32225bd8cbf40d0bd335"}]}
