)]}'
{"keystone/common/sql/expand_repo/versions/032_expand_add_application_credential_table.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"9a886e870591d7ccafd3e7a8f084d81cdd3aff09","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        sql.Column(\u0027user_id\u0027, sql.String(length\u003d64), nullable\u003dFalse),"},{"line_number":28,"context_line":"        sql.Column(\u0027project_id\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":29,"context_line":"        sql.Column(\u0027trust_id\u0027, sql.String(length\u003d64)),"},{"line_number":30,"context_line":"        sql.Column(\u0027deleted_at\u0027, sql.DateTime),"},{"line_number":31,"context_line":"        sql.UniqueConstraint(\u0027user_id\u0027, \u0027name\u0027,"},{"line_number":32,"context_line":"                             name\u003d\u0027duplicate_app_cred_constraint\u0027),"},{"line_number":33,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf8cb3f7_09b78df8","line":30,"range":{"start_line":30,"start_character":37,"end_line":30,"end_character":45},"updated":"2017-12-27 23:10:41.000000000","message":"We might want this to be a keystone.common.sql.core.DateTimeInt to avoid the issues with datetime we\u0027ve had in the past.","commit_id":"b627271d21d9bac0823f00b595ddedd9b7ba3300"}],"keystone/common/sql/expand_repo/versions/033_expand_add_application_credential_table.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"8deff0b2b022f30f645feb811bad81bb59a6e356","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        mysql_charset\u003d\u0027utf8\u0027"},{"line_number":36,"context_line":"    )"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    application_credential_roles_table \u003d sql.Table("},{"line_number":39,"context_line":"        \u0027application_credential_role\u0027, meta,"},{"line_number":40,"context_line":"        sql.Column(\u0027application_credential_id\u0027, sql.String(length\u003d64),"},{"line_number":41,"context_line":"                   primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":42,"context_line":"        sql.Column(\u0027role_id\u0027, sql.String(length\u003d64), primary_key\u003dTrue,"},{"line_number":43,"context_line":"                   nullable\u003dFalse),"},{"line_number":44,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027, mysql_charset\u003d\u0027utf8\u0027)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    application_credentials_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":47,"context_line":"    application_credential_roles_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9f91af0f_62af3de3","line":44,"range":{"start_line":38,"start_character":4,"end_line":44,"end_character":52},"updated":"2018-01-05 21:34:36.000000000","message":"Any reason to have this as a separate table? Is it to make the association of multiple roles to a single application credential simpler?","commit_id":"6ff950d5173f7caed193cd8fc9d2f40fa56e861c"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"a1b7dcbef8a2252b02611de51d20dab588312787","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        mysql_charset\u003d\u0027utf8\u0027"},{"line_number":36,"context_line":"    )"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    application_credential_roles_table \u003d sql.Table("},{"line_number":39,"context_line":"        \u0027application_credential_role\u0027, meta,"},{"line_number":40,"context_line":"        sql.Column(\u0027application_credential_id\u0027, sql.String(length\u003d64),"},{"line_number":41,"context_line":"                   primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":42,"context_line":"        sql.Column(\u0027role_id\u0027, sql.String(length\u003d64), primary_key\u003dTrue,"},{"line_number":43,"context_line":"                   nullable\u003dFalse),"},{"line_number":44,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027, mysql_charset\u003d\u0027utf8\u0027)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    application_credentials_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":47,"context_line":"    application_credential_roles_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9f91af0f_e206ed86","line":44,"range":{"start_line":38,"start_character":4,"end_line":44,"end_character":52},"in_reply_to":"9f91af0f_62af3de3","updated":"2018-01-05 21:49:44.000000000","message":"I\u0027m copying how it\u0027s done with trusts, yes I think that\u0027s the reason. If there\u0027s a preferred way to handle it I\u0027m all ears.","commit_id":"6ff950d5173f7caed193cd8fc9d2f40fa56e861c"}],"keystone/common/sql/expand_repo/versions/034_expand_add_application_credential_table.py":[{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"96e2c6fc1d40e44a5930b9c85067cfa1faff0175","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    application_credential_roles_table \u003d sql.Table("},{"line_number":40,"context_line":"        \u0027application_credential_role\u0027, meta,"},{"line_number":41,"context_line":"        sql.Column(\u0027application_credential_id\u0027, sql.String(length\u003d64),"},{"line_number":42,"context_line":"                   primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":43,"context_line":"        sql.Column(\u0027role_id\u0027, sql.String(length\u003d64), primary_key\u003dTrue,"},{"line_number":44,"context_line":"                   nullable\u003dFalse),"},{"line_number":45,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027, mysql_charset\u003d\u0027utf8\u0027)"}],"source_content_type":"text/x-python","patch_set":18,"id":"7f96bb07_98a9f4e0","line":42,"range":{"start_line":41,"start_character":8,"end_line":42,"end_character":52},"updated":"2018-01-11 16:03:04.000000000","message":"This should be a foreign key to application_credential.id","commit_id":"34af457dfb1480d29854e88fc105b5c7b4735bf6"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"ef9b16489d980682840cb6efb87ed4b23be34378","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    application_credential_roles_table \u003d sql.Table("},{"line_number":40,"context_line":"        \u0027application_credential_role\u0027, meta,"},{"line_number":41,"context_line":"        sql.Column(\u0027application_credential_id\u0027, sql.String(length\u003d64),"},{"line_number":42,"context_line":"                   primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":43,"context_line":"        sql.Column(\u0027role_id\u0027, sql.String(length\u003d64), primary_key\u003dTrue,"},{"line_number":44,"context_line":"                   nullable\u003dFalse),"},{"line_number":45,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027, mysql_charset\u003d\u0027utf8\u0027)"}],"source_content_type":"text/x-python","patch_set":18,"id":"7f96bb07_5780128c","line":42,"range":{"start_line":41,"start_character":8,"end_line":42,"end_character":52},"in_reply_to":"7f96bb07_1614d09f","updated":"2018-01-11 21:43:05.000000000","message":"I added the foreign key","commit_id":"34af457dfb1480d29854e88fc105b5c7b4735bf6"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e68379166fe4bb6b011edfd8cac59b85728cf496","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    application_credential_roles_table \u003d sql.Table("},{"line_number":40,"context_line":"        \u0027application_credential_role\u0027, meta,"},{"line_number":41,"context_line":"        sql.Column(\u0027application_credential_id\u0027, sql.String(length\u003d64),"},{"line_number":42,"context_line":"                   primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":43,"context_line":"        sql.Column(\u0027role_id\u0027, sql.String(length\u003d64), primary_key\u003dTrue,"},{"line_number":44,"context_line":"                   nullable\u003dFalse),"},{"line_number":45,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027, mysql_charset\u003d\u0027utf8\u0027)"}],"source_content_type":"text/x-python","patch_set":18,"id":"7f96bb07_8bdaf9e6","line":42,"range":{"start_line":41,"start_character":8,"end_line":42,"end_character":52},"in_reply_to":"7f96bb07_6251d2d8","updated":"2018-01-11 19:15:04.000000000","message":"I just double checked the schema for the trust and trust role table, but I don\u0027t see any FKs there, so I don\u0027t think they were added later.\n\nI know we\u0027ve moved away from foreign keys in the past to make it easier to decouple backends, but I\u0027m not sure how realistic it is in this case.\n\nI think keeping things consistent is fine, unless it simplifies the implementation to use a FK instead.","commit_id":"34af457dfb1480d29854e88fc105b5c7b4735bf6"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"957220efe13d9e1cb34f8998586b7eacadac5b04","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    application_credential_roles_table \u003d sql.Table("},{"line_number":40,"context_line":"        \u0027application_credential_role\u0027, meta,"},{"line_number":41,"context_line":"        sql.Column(\u0027application_credential_id\u0027, sql.String(length\u003d64),"},{"line_number":42,"context_line":"                   primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":43,"context_line":"        sql.Column(\u0027role_id\u0027, sql.String(length\u003d64), primary_key\u003dTrue,"},{"line_number":44,"context_line":"                   nullable\u003dFalse),"},{"line_number":45,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027, mysql_charset\u003d\u0027utf8\u0027)"}],"source_content_type":"text/x-python","patch_set":18,"id":"7f96bb07_1614d09f","line":42,"range":{"start_line":41,"start_character":8,"end_line":42,"end_character":52},"in_reply_to":"7f96bb07_8bdaf9e6","updated":"2018-01-11 19:37:37.000000000","message":"\u003e I know we\u0027ve moved away from foreign keys in the past to make it\n \u003e easier to decouple backends, but I\u0027m not sure how realistic it is\n \u003e in this case.\n\nIn this case it\u0027s part of the same backend so I think it would be fine. We wouldn\u0027t have a foreign key with the role table.","commit_id":"34af457dfb1480d29854e88fc105b5c7b4735bf6"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"8650ff298af20324cf10f70f429627050f0b2784","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    application_credential_roles_table \u003d sql.Table("},{"line_number":40,"context_line":"        \u0027application_credential_role\u0027, meta,"},{"line_number":41,"context_line":"        sql.Column(\u0027application_credential_id\u0027, sql.String(length\u003d64),"},{"line_number":42,"context_line":"                   primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":43,"context_line":"        sql.Column(\u0027role_id\u0027, sql.String(length\u003d64), primary_key\u003dTrue,"},{"line_number":44,"context_line":"                   nullable\u003dFalse),"},{"line_number":45,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027, mysql_charset\u003d\u0027utf8\u0027)"}],"source_content_type":"text/x-python","patch_set":18,"id":"7f96bb07_6251d2d8","line":42,"range":{"start_line":41,"start_character":8,"end_line":42,"end_character":52},"in_reply_to":"7f96bb07_98a9f4e0","updated":"2018-01-11 16:46:07.000000000","message":"I don\u0027t disagree but I was following what we have for trusts http://git.openstack.org/cgit/openstack/keystone/tree/keystone/common/sql/migrate_repo/versions/067_kilo.py#n147\n\nDo you think trusts is wrong or did I miss where it used a foreign key?","commit_id":"34af457dfb1480d29854e88fc105b5c7b4735bf6"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"dfb3e0dd5c53be53bd6f7daf39e09363997c8e33","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        \u0027application_credential_role\u0027, meta,"},{"line_number":41,"context_line":"        sql.Column(\u0027application_credential_id\u0027, sql.String(length\u003d64),"},{"line_number":42,"context_line":"                   sql.ForeignKey(application_credential.c.id,"},{"line_number":43,"context_line":"                                  ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":44,"context_line":"                   primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":45,"context_line":"        sql.Column(\u0027role_id\u0027, sql.String(length\u003d64), primary_key\u003dTrue,"},{"line_number":46,"context_line":"                   nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":20,"id":"7f96bb07_96a8b9db","line":43,"range":{"start_line":43,"start_character":44,"end_line":43,"end_character":51},"updated":"2018-01-12 22:33:28.000000000","message":"Aha - nice.","commit_id":"821b13fbea519578bab351ddac54428821a49a25"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"5e2cdbb4a63086368c8a6b31b3689d028f0fb623","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    application_credential \u003d sql.Table("},{"line_number":24,"context_line":"        \u0027application_credential\u0027, meta,"},{"line_number":25,"context_line":"        sql.Column(\u0027id\u0027, sql.String(length\u003d64), primary_key\u003dTrue),"},{"line_number":26,"context_line":"        sql.Column(\u0027name\u0027, sql.String(length\u003d255), nullable\u003dFalse),"},{"line_number":27,"context_line":"        sql.Column(\u0027secret_hash\u0027, sql.String(length\u003d255), nullable\u003dFalse),"},{"line_number":28,"context_line":"        sql.Column(\u0027description\u0027, sql.Text),"}],"source_content_type":"text/x-python","patch_set":21,"id":"7f96bb07_322ddffd","line":25,"updated":"2018-01-16 18:08:39.000000000","message":"Please make the PK internal SQL Int. This is for optimizations within the RDBMS system. This should still be a unique key and use for external work however, the INT allows for better FK and other such handling (and limits some of the internal storage/efficency issues that come up with large STR PKs)\n\nThis means we also should reference the INT pk where possible. IT should always be stripped before sending to the user.","commit_id":"a7ceb358f7adc7823a2e1c33836bdad09f5f11c6"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"81fa3a43dc2e3a018a2fd68636797b068232e9f6","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    application_credential \u003d sql.Table("},{"line_number":24,"context_line":"        \u0027application_credential\u0027, meta,"},{"line_number":25,"context_line":"        sql.Column(\u0027id\u0027, sql.String(length\u003d64), primary_key\u003dTrue),"},{"line_number":26,"context_line":"        sql.Column(\u0027name\u0027, sql.String(length\u003d255), nullable\u003dFalse),"},{"line_number":27,"context_line":"        sql.Column(\u0027secret_hash\u0027, sql.String(length\u003d255), nullable\u003dFalse),"},{"line_number":28,"context_line":"        sql.Column(\u0027description\u0027, sql.Text),"}],"source_content_type":"text/x-python","patch_set":21,"id":"7f96bb07_b5c23633","line":25,"in_reply_to":"7f96bb07_322ddffd","updated":"2018-01-16 20:45:34.000000000","message":"Do we document this knowledge anywhere? If we don\u0027t, should we?","commit_id":"a7ceb358f7adc7823a2e1c33836bdad09f5f11c6"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"c80ba30f6060bcc39590db0d8251311de517f591","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    application_credential \u003d sql.Table("},{"line_number":24,"context_line":"        \u0027application_credential\u0027, meta,"},{"line_number":25,"context_line":"        sql.Column(\u0027id\u0027, sql.String(length\u003d64), primary_key\u003dTrue),"},{"line_number":26,"context_line":"        sql.Column(\u0027name\u0027, sql.String(length\u003d255), nullable\u003dFalse),"},{"line_number":27,"context_line":"        sql.Column(\u0027secret_hash\u0027, sql.String(length\u003d255), nullable\u003dFalse),"},{"line_number":28,"context_line":"        sql.Column(\u0027description\u0027, sql.Text),"}],"source_content_type":"text/x-python","patch_set":21,"id":"7f96bb07_7564ae22","line":25,"in_reply_to":"7f96bb07_b5c23633","updated":"2018-01-16 20:57:38.000000000","message":"If it provides good optimization to make the PK an internal SQL INT, then it would be beneficial to document this somewhere imo.","commit_id":"a7ceb358f7adc7823a2e1c33836bdad09f5f11c6"}],"keystone/tests/unit/test_sql_upgrade.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"80f72cc19f579b4587a49371aeb6565824239c36","unresolved":false,"context_lines":[{"line_number":2567,"context_line":"            \u0027trust_id\u0027: uuid.uuid4().hex,"},{"line_number":2568,"context_line":"            \u0027expires_at\u0027: expires_at_int,"},{"line_number":2569,"context_line":"        }"},{"line_number":2570,"context_line":"        app_cred_table.insert().values(app_cred).execute()"},{"line_number":2571,"context_line":""},{"line_number":2572,"context_line":""},{"line_number":2573,"context_line":"class MySQLOpportunisticFullMigration(FullMigration):"}],"source_content_type":"text/x-python","patch_set":10,"id":"9f91af0f_fa9537e5","line":2570,"updated":"2018-01-05 18:26:37.000000000","message":"I suppose we could exercise the unique constraint in this test too","commit_id":"6fe09a6426a316022e443127c5cb0ffac736be48"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"8deff0b2b022f30f645feb811bad81bb59a6e356","unresolved":false,"context_lines":[{"line_number":2536,"context_line":"        self.migrate(32)"},{"line_number":2537,"context_line":"        self.contract(32)"},{"line_number":2538,"context_line":""},{"line_number":2539,"context_line":"        application_credential_table_name \u003d \u0027application_credential\u0027"},{"line_number":2540,"context_line":"        self.assertTableDoesNotExist(application_credential_table_name)"},{"line_number":2541,"context_line":""},{"line_number":2542,"context_line":"        self.expand(33)"},{"line_number":2543,"context_line":"        self.migrate(33)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9f91af0f_62989dbf","line":2540,"range":{"start_line":2539,"start_character":8,"end_line":2540,"end_character":71},"updated":"2018-01-05 21:34:36.000000000","message":"We\u0027ll need another assertion for the application_credential_role table if we decide to keep that separate.","commit_id":"6ff950d5173f7caed193cd8fc9d2f40fa56e861c"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"0c5ba4bc6601c72faca51bcbf9c9cfc3c617c341","unresolved":false,"context_lines":[{"line_number":2648,"context_line":"            \u0027role_id\u0027: uuid.uuid4().hex"},{"line_number":2649,"context_line":"        }"},{"line_number":2650,"context_line":"        app_cred_role_table.insert().values(role_rel).execute()"},{"line_number":2651,"context_line":"        # Excercise unique constraint"},{"line_number":2652,"context_line":"        dup_app_cred \u003d {"},{"line_number":2653,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":2654,"context_line":"            \u0027name\u0027: app_cred[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":14,"id":"9f91af0f_3f960340","line":2651,"range":{"start_line":2651,"start_character":10,"end_line":2651,"end_character":19},"updated":"2018-01-08 22:36:26.000000000","message":"Exercise* (unless we\u0027re shooting for the exotic pronunciation, in which case +2)","commit_id":"49f9142711ae59455983296f8878f72a559831a0"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e68379166fe4bb6b011edfd8cac59b85728cf496","unresolved":false,"context_lines":[{"line_number":2765,"context_line":"        role_rel \u003d {"},{"line_number":2766,"context_line":"            \u0027application_credential_id\u0027: uuid.uuid4().hex,"},{"line_number":2767,"context_line":"            \u0027role_id\u0027: uuid.uuid4().hex"},{"line_number":2768,"context_line":"        }"},{"line_number":2769,"context_line":"        app_cred_role_table.insert().values(role_rel).execute()"},{"line_number":2770,"context_line":"        # Exercise unique constraint"},{"line_number":2771,"context_line":"        dup_app_cred \u003d {"}],"source_content_type":"text/x-python","patch_set":18,"id":"7f96bb07_6ba8cd1e","line":2768,"updated":"2018-01-11 19:15:04.000000000","message":"We could exercise this primary constraint as well.","commit_id":"34af457dfb1480d29854e88fc105b5c7b4735bf6"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"ef9b16489d980682840cb6efb87ed4b23be34378","unresolved":false,"context_lines":[{"line_number":2765,"context_line":"        role_rel \u003d {"},{"line_number":2766,"context_line":"            \u0027application_credential_id\u0027: uuid.uuid4().hex,"},{"line_number":2767,"context_line":"            \u0027role_id\u0027: uuid.uuid4().hex"},{"line_number":2768,"context_line":"        }"},{"line_number":2769,"context_line":"        app_cred_role_table.insert().values(role_rel).execute()"},{"line_number":2770,"context_line":"        # Exercise unique constraint"},{"line_number":2771,"context_line":"        dup_app_cred \u003d {"}],"source_content_type":"text/x-python","patch_set":18,"id":"7f96bb07_97769ad8","line":2768,"in_reply_to":"7f96bb07_6ba8cd1e","updated":"2018-01-11 21:43:05.000000000","message":"Done","commit_id":"34af457dfb1480d29854e88fc105b5c7b4735bf6"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"2a8da059ba8c893858eef57100939ef18e159ed7","unresolved":false,"context_lines":[{"line_number":2785,"context_line":"        # Exercise role table primary keys"},{"line_number":2786,"context_line":"        insert \u003d app_cred_role_table.insert().values(role_rel)"},{"line_number":2787,"context_line":"        self.assertRaises(db_exception.DBDuplicateEntry, insert.execute)"},{"line_number":2788,"context_line":""},{"line_number":2789,"context_line":""},{"line_number":2790,"context_line":"class MySQLOpportunisticFullMigration(FullMigration):"},{"line_number":2791,"context_line":"    FIXTURE \u003d test_base.MySQLOpportunisticFixture"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_183cf691","line":2788,"updated":"2018-01-12 01:50:23.000000000","message":"and a test for FK error is better.","commit_id":"a9b0c85ad303d6a518ba83ae600298d841feb8e4"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"3a3cf89dd6276d6be9eae0d4d7947e69d98b4bd1","unresolved":false,"context_lines":[{"line_number":2785,"context_line":"        # Exercise role table primary keys"},{"line_number":2786,"context_line":"        insert \u003d app_cred_role_table.insert().values(role_rel)"},{"line_number":2787,"context_line":"        self.assertRaises(db_exception.DBDuplicateEntry, insert.execute)"},{"line_number":2788,"context_line":""},{"line_number":2789,"context_line":""},{"line_number":2790,"context_line":"class MySQLOpportunisticFullMigration(FullMigration):"},{"line_number":2791,"context_line":"    FIXTURE \u003d test_base.MySQLOpportunisticFixture"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_77bf3dfb","line":2788,"in_reply_to":"7f96bb07_183cf691","updated":"2018-01-12 09:27:36.000000000","message":"There\u0027s a test on line 2749. Unfortunately there\u0027s some weirdness between mysql and sqlite that make trying to validate a bad insert kind of tricky.","commit_id":"a9b0c85ad303d6a518ba83ae600298d841feb8e4"}]}
