)]}'
{"keystone/common/models.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e08d7809c1579f571185d31e81de716fb3fd4b87","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    Optional Keys:"},{"line_number":110,"context_line":"        description"},{"line_number":111,"context_line":"        enabled (bool, default True)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    \"\"\""},{"line_number":114,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F3bw%3D","line":111,"updated":"2012-11-19 17:08:29.000000000","message":"doc string needs to be updated, but i\u0027m wondering why description and enabled need to be required? (i have no idea what required_keys / optional_keys actually affects?)","commit_id":"769620dc82e2b60c2ec0267fbf17d022aeca303f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"10956d3f98d812ea804fc3e24d4b503224cf7363","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    Optional Keys:"},{"line_number":110,"context_line":"        description"},{"line_number":111,"context_line":"        enabled (bool, default True)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    \"\"\""},{"line_number":114,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F2cA%3D","line":111,"in_reply_to":"AAAAMH%2F%2F3R8%3D","updated":"2012-11-20 02:12:01.000000000","message":"OK,  that should work.  I can revert this whole file.","commit_id":"769620dc82e2b60c2ec0267fbf17d022aeca303f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"299fbaa51745d1a6dbf24fe7cae4cd2efa75d6b9","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    Optional Keys:"},{"line_number":110,"context_line":"        description"},{"line_number":111,"context_line":"        enabled (bool, default True)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    \"\"\""},{"line_number":114,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F3R8%3D","line":111,"in_reply_to":"AAAAMH%2F%2F3U4%3D","updated":"2012-11-19 18:23:32.000000000","message":"in that case, i\u0027d prefer description and enabled stay in the optional_keys, for a few reasons: 1) consistency with User.description, which is optional above 2) description is optional at the API level, assuming it\u0027s even defined, and 3) enabled can be assumed to be True if it\u0027s excluded","commit_id":"769620dc82e2b60c2ec0267fbf17d022aeca303f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"36a6947b29075f53be031672f32d7e85e088377c","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    Optional Keys:"},{"line_number":110,"context_line":"        description"},{"line_number":111,"context_line":"        enabled (bool, default True)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    \"\"\""},{"line_number":114,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F3U4%3D","line":111,"in_reply_to":"AAAAMH%2F%2F3bw%3D","updated":"2012-11-19 18:10:35.000000000","message":"Nothing.  This is code that we carried over as part of the LDAP port, and it documents the fields required by any backend object.  The SQL code should incorporate this in the future.","commit_id":"769620dc82e2b60c2ec0267fbf17d022aeca303f"}],"keystone/common/sql/migrate_repo/versions/006_normalize_identity.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"72150ab28dfd845de686b5a465c67a4aa9bcedba","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from sqlalchemy import Column, MetaData, String, Table, types"},{"line_number":21,"context_line":"from sqlalchemy.orm import sessionmaker"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"disabled_values \u003d [\u0027false\u0027, \u0027disabled\u0027, \u0027no\u0027]"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def is_enabled(enabled):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F49g%3D","line":23,"updated":"2012-11-16 21:14:49.000000000","message":"This is going to be a pain point if we don\u0027t think of 99.9% of the values people will put in here... I\u0027d suggest adding:\n\n    \u00270\u0027","commit_id":"c3733c09a11296a52bab1f1d75f9a7376146925c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f97e5c96c69516e8c182e999ef97a42204e14c3e","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"def downgrade(migrate_engine):"},{"line_number":72,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F5Pc%3D","line":72,"updated":"2012-11-16 18:41:38.000000000","message":"OK, this is reason for a NACK here.  Please continue on with the review, as this is minor.","commit_id":"c3733c09a11296a52bab1f1d75f9a7376146925c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"194bb15448ec73c345af6dcf2bd02f97c2bfa858","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"def downgrade(migrate_engine):"},{"line_number":72,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F48E%3D","line":72,"in_reply_to":"AAAAMH%2F%2F5Pc%3D","updated":"2012-11-16 21:26:38.000000000","message":"i assume you\u0027re going to write a downgrade though?","commit_id":"c3733c09a11296a52bab1f1d75f9a7376146925c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"a73ee5d0ee52f872e61bfd5c86db2e81b9e1d5c4","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"def downgrade(migrate_engine):"},{"line_number":150,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F4l0%3D","line":150,"updated":"2012-11-17 04:09:11.000000000","message":"Need to wire this up.  Should also test against mysql and postgres, a-la the Live LDAP tests.","commit_id":"aa9225f8f2f03b65e78873acb2c23037723681cd"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e08d7809c1579f571185d31e81de716fb3fd4b87","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    if enabled is str:"},{"line_number":31,"context_line":"        if string.lower(enabled) in disabled_values:"},{"line_number":32,"context_line":"            return 0"},{"line_number":33,"context_line":"    if enabled:"},{"line_number":34,"context_line":"        return 1"},{"line_number":35,"context_line":"    else:"},{"line_number":36,"context_line":"        return 0"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F3bY%3D","line":33,"updated":"2012-11-19 17:08:29.000000000","message":"nice improvement","commit_id":"769620dc82e2b60c2ec0267fbf17d022aeca303f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e08d7809c1579f571185d31e81de716fb3fd4b87","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    user_table.columns[\"password\"].drop()"},{"line_number":61,"context_line":"    #ayoung:  I suspect this fails due to an issue with sqlite"},{"line_number":62,"context_line":"    #TODO: fix once SQLite supports drop columns"},{"line_number":63,"context_line":"#    user_table.columns[\"enabled\"].drop()"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"def downgrade_tenant_table(meta, migrate_engine):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F3a8%3D","line":63,"updated":"2012-11-19 17:08:29.000000000","message":"as a workaround, i\u0027d prefer data migrations to be performed separately from schema migrations... so:\n\n  006: schema migration to create new columns\n  007: data migration to move stuff over\n  008: schema migration to drop columns (can be an empty migration for sqlite?)","commit_id":"769620dc82e2b60c2ec0267fbf17d022aeca303f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"10956d3f98d812ea804fc3e24d4b503224cf7363","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    user_table.columns[\"password\"].drop()"},{"line_number":61,"context_line":"    #ayoung:  I suspect this fails due to an issue with sqlite"},{"line_number":62,"context_line":"    #TODO: fix once SQLite supports drop columns"},{"line_number":63,"context_line":"#    user_table.columns[\"enabled\"].drop()"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"def downgrade_tenant_table(meta, migrate_engine):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F2cM%3D","line":63,"in_reply_to":"AAAAMH%2F%2F3Ro%3D","updated":"2012-11-20 02:12:01.000000000","message":"OK,  I can accept that.  I\u0027ll split it up.","commit_id":"769620dc82e2b60c2ec0267fbf17d022aeca303f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"299fbaa51745d1a6dbf24fe7cae4cd2efa75d6b9","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    user_table.columns[\"password\"].drop()"},{"line_number":61,"context_line":"    #ayoung:  I suspect this fails due to an issue with sqlite"},{"line_number":62,"context_line":"    #TODO: fix once SQLite supports drop columns"},{"line_number":63,"context_line":"#    user_table.columns[\"enabled\"].drop()"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"def downgrade_tenant_table(meta, migrate_engine):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F3Ro%3D","line":63,"in_reply_to":"AAAAMH%2F%2F3Uc%3D","updated":"2012-11-19 18:23:32.000000000","message":"Sure there is: given that the data migration is the most likely to unexpectedly fail... if it does, not only do you fail in the middle of a data migration but you\u0027re also left with an inconsistent database state: one that exists \"between\" schema migrations. You also won\u0027t be able to successfully downgrade, as the last half of the schema migration hasn\u0027t been performed, so the downgrade will be attempting to downgrade something that hasn\u0027t been upgraded yet.\n\nProduction environments may also want to skip our data migrations in favor of doing something custom (such as re-implementing is_enabled and tailoring it to their own data), while accepting schema migrations as written. Splitting it up makes it much easier for them to do that.","commit_id":"769620dc82e2b60c2ec0267fbf17d022aeca303f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"36a6947b29075f53be031672f32d7e85e088377c","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    user_table.columns[\"password\"].drop()"},{"line_number":61,"context_line":"    #ayoung:  I suspect this fails due to an issue with sqlite"},{"line_number":62,"context_line":"    #TODO: fix once SQLite supports drop columns"},{"line_number":63,"context_line":"#    user_table.columns[\"enabled\"].drop()"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"def downgrade_tenant_table(meta, migrate_engine):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F3Uc%3D","line":63,"in_reply_to":"AAAAMH%2F%2F3a8%3D","updated":"2012-11-19 18:10:35.000000000","message":"This could all be done inline, it just would require more code.  There is nothing gained by doing it as multiple steps.","commit_id":"769620dc82e2b60c2ec0267fbf17d022aeca303f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e08d7809c1579f571185d31e81de716fb3fd4b87","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    new_user_data \u003d []"},{"line_number":100,"context_line":"    for a_user in session.query(user_table):"},{"line_number":101,"context_line":"        id, name, extra, password, enabled \u003d a_user"},{"line_number":102,"context_line":"        extra_parsed \u003d json.loads(extra)"},{"line_number":103,"context_line":"        if \u0027password\u0027 in extra_parsed:"},{"line_number":104,"context_line":"            password \u003d extra_parsed[\u0027password\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F3aY%3D","line":101,"updated":"2012-11-19 17:08:29.000000000","message":"i\u0027ve never seen this used, is that order guaranteed somehow?","commit_id":"769620dc82e2b60c2ec0267fbf17d022aeca303f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"299fbaa51745d1a6dbf24fe7cae4cd2efa75d6b9","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    new_user_data \u003d []"},{"line_number":100,"context_line":"    for a_user in session.query(user_table):"},{"line_number":101,"context_line":"        id, name, extra, password, enabled \u003d a_user"},{"line_number":102,"context_line":"        extra_parsed \u003d json.loads(extra)"},{"line_number":103,"context_line":"        if \u0027password\u0027 in extra_parsed:"},{"line_number":104,"context_line":"            password \u003d extra_parsed[\u0027password\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F3RU%3D","line":101,"in_reply_to":"AAAAMH%2F%2F3UU%3D","updated":"2012-11-19 18:23:32.000000000","message":"eek, how is the order of the table definition guaranteed?","commit_id":"769620dc82e2b60c2ec0267fbf17d022aeca303f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"36a6947b29075f53be031672f32d7e85e088377c","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    new_user_data \u003d []"},{"line_number":100,"context_line":"    for a_user in session.query(user_table):"},{"line_number":101,"context_line":"        id, name, extra, password, enabled \u003d a_user"},{"line_number":102,"context_line":"        extra_parsed \u003d json.loads(extra)"},{"line_number":103,"context_line":"        if \u0027password\u0027 in extra_parsed:"},{"line_number":104,"context_line":"            password \u003d extra_parsed[\u0027password\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F3UU%3D","line":101,"in_reply_to":"AAAAMH%2F%2F3aY%3D","updated":"2012-11-19 18:10:35.000000000","message":"The response is returned in the order of the columns from the table definition, so, while this is fragile, the order would only change if we were to change the schema.","commit_id":"769620dc82e2b60c2ec0267fbf17d022aeca303f"}],"keystone/common/sql/migrate_repo/versions/008_normalize_identity.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"3ad153a5a11e39d442187a439279fe4a4edffe3d","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    user_table.columns[\"password\"].drop()"},{"line_number":28,"context_line":"    #ayoung:  I suspect this fails due to an issue with sqlite"},{"line_number":29,"context_line":"    #TODO: fix once SQLite supports drop columns"},{"line_number":30,"context_line":"#    user_table.columns[\"enabled\"].drop()"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def downgrade_tenant_table(meta, migrate_engine):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAMH%2F%2F1No%3D","line":30,"updated":"2012-11-20 22:06:16.000000000","message":"try uncommenting this and creating an *empty* sqlite downgrade file, e.g.\n\n  008_sqlite_downgrade.sql\n\nI\u0027m pretty sure sqlalchemy-migrate will run that instead of the python migration, but only for sqlite","commit_id":"19da3b02eb325c5876c443cfdf52e6ecd43a9190"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7430b0a6c397b04a1fbc7906781f106a75cb1079","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    user_table.columns[\"password\"].drop()"},{"line_number":28,"context_line":"    #ayoung:  I suspect this fails due to an issue with sqlite"},{"line_number":29,"context_line":"    #TODO: fix once SQLite supports drop columns"},{"line_number":30,"context_line":"#    user_table.columns[\"enabled\"].drop()"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def downgrade_tenant_table(meta, migrate_engine):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAMH%2F%2F1Gc%3D","line":30,"in_reply_to":"AAAAMH%2F%2F1No%3D","updated":"2012-11-20 23:16:45.000000000","message":"Done","commit_id":"19da3b02eb325c5876c443cfdf52e6ecd43a9190"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"f9c70461ebfec76078dfb59a7c05ed0457c4696e","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"def upgrade_user_table(meta, migrate_engine):"},{"line_number":38,"context_line":"    user_table \u003d Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":39,"context_line":"    user_table.create_column(Column(\"password\", String(128)))"},{"line_number":40,"context_line":"    user_table.create_column(Column(\"enabled\", types.Boolean,"},{"line_number":41,"context_line":"                                    default\u003dTrue))"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAMH%2F%2FxOU%3D","line":39,"updated":"2012-11-26 17:53:49.000000000","message":"AFAIK, our passwords are always 119 chars after being hashed","commit_id":"26839c2af47294b8130c0da86ce7800dc19a0254"}],"keystone/common/sql/migrate_repo/versions/008_sqlite_downgrade.sql":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"f9c70461ebfec76078dfb59a7c05ed0457c4696e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"-- not supported by sqlite, but should be:"},{"line_number":2,"context_line":"-- alter TABLE tenant drop column description;"},{"line_number":3,"context_line":"-- alter TABLE tenant drop column enabled;"},{"line_number":4,"context_line":"select count(*) from tenant; "}],"source_content_type":"text/x-sql","patch_set":8,"id":"AAAAMH%2F%2FxNE%3D","line":4,"updated":"2012-11-26 17:53:49.000000000","message":"whitespace; also, is it necessary to have something in this file? add a comment if so.","commit_id":"26839c2af47294b8130c0da86ce7800dc19a0254"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"1101c15187272b56086f47a2ce66925a47d6ed03","unresolved":false,"context_lines":[{"line_number":1,"context_line":"-- not supported by sqlite, but should be:"},{"line_number":2,"context_line":"-- alter TABLE tenant drop column description;"},{"line_number":3,"context_line":"-- alter TABLE tenant drop column enabled;"},{"line_number":4,"context_line":"select count(*) from tenant; "}],"source_content_type":"text/x-sql","patch_set":8,"id":"AAAAMH%2F%2Fw2g%3D","line":4,"in_reply_to":"AAAAMH%2F%2FxNE%3D","updated":"2012-11-26 20:59:21.000000000","message":"Done\n  It needs to be valid SQL","commit_id":"26839c2af47294b8130c0da86ce7800dc19a0254"}],"keystone/common/sql/migrate_repo/versions/009_normalize_identity_migration.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"83c3150c6c65fc973528e12da336f3c373d3a5c6","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    if enabled is None:"},{"line_number":29,"context_line":"        return 1"},{"line_number":30,"context_line":"    if enabled is str:"},{"line_number":31,"context_line":"        if string.lower(enabled) in disabled_values:"},{"line_number":32,"context_line":"            return 0"},{"line_number":33,"context_line":"    if enabled:"},{"line_number":34,"context_line":"        return 1"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAMH%2F%2F1Nc%3D","line":31,"updated":"2012-11-20 22:10:39.000000000","message":"new style:\n\n    str(enabled).lower()","commit_id":"19da3b02eb325c5876c443cfdf52e6ecd43a9190"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7430b0a6c397b04a1fbc7906781f106a75cb1079","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    if enabled is None:"},{"line_number":29,"context_line":"        return 1"},{"line_number":30,"context_line":"    if enabled is str:"},{"line_number":31,"context_line":"        if string.lower(enabled) in disabled_values:"},{"line_number":32,"context_line":"            return 0"},{"line_number":33,"context_line":"    if enabled:"},{"line_number":34,"context_line":"        return 1"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAMH%2F%2F1Go%3D","line":31,"in_reply_to":"AAAAMH%2F%2F1Nc%3D","updated":"2012-11-20 23:16:45.000000000","message":"Done","commit_id":"19da3b02eb325c5876c443cfdf52e6ecd43a9190"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"83c3150c6c65fc973528e12da336f3c373d3a5c6","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        return 0"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"#this won\u0027t work on sqlite.  It doesn\u0027t support dropping columns"},{"line_number":40,"context_line":"def downgrade_user_table(meta, migrate_engine):"},{"line_number":41,"context_line":"    user_table \u003d Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":42,"context_line":"    maker \u003d sessionmaker(bind\u003dmigrate_engine)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAMH%2F%2F1Ng%3D","line":39,"updated":"2012-11-20 22:10:39.000000000","message":"comment not relevant anymore","commit_id":"19da3b02eb325c5876c443cfdf52e6ecd43a9190"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7430b0a6c397b04a1fbc7906781f106a75cb1079","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        return 0"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"#this won\u0027t work on sqlite.  It doesn\u0027t support dropping columns"},{"line_number":40,"context_line":"def downgrade_user_table(meta, migrate_engine):"},{"line_number":41,"context_line":"    user_table \u003d Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":42,"context_line":"    maker \u003d sessionmaker(bind\u003dmigrate_engine)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAMH%2F%2F1Gk%3D","line":39,"in_reply_to":"AAAAMH%2F%2F1Ng%3D","updated":"2012-11-20 23:16:45.000000000","message":"Done","commit_id":"19da3b02eb325c5876c443cfdf52e6ecd43a9190"}],"keystone/identity/backends/sql.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f97e5c96c69516e8c182e999ef97a42204e14c3e","unresolved":false,"context_lines":[{"line_number":313,"context_line":"    @handle_conflicts(type\u003d\u0027user\u0027)"},{"line_number":314,"context_line":"    def create_user(self, user_id, user):"},{"line_number":315,"context_line":"        user[\u0027name\u0027] \u003d clean.user_name(user[\u0027name\u0027])"},{"line_number":316,"context_line":"        user[\u0027enabled\u0027] \u003d True"},{"line_number":317,"context_line":"        user \u003d utils.hash_user_password(user)"},{"line_number":318,"context_line":"        session \u003d self.get_session()"},{"line_number":319,"context_line":"        with session.begin():"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F5O8%3D","line":316,"updated":"2012-11-16 18:41:38.000000000","message":"In theory, people could create disabled users.  Should I make this only default if not set on the way in?","commit_id":"c3733c09a11296a52bab1f1d75f9a7376146925c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"194bb15448ec73c345af6dcf2bd02f97c2bfa858","unresolved":false,"context_lines":[{"line_number":313,"context_line":"    @handle_conflicts(type\u003d\u0027user\u0027)"},{"line_number":314,"context_line":"    def create_user(self, user_id, user):"},{"line_number":315,"context_line":"        user[\u0027name\u0027] \u003d clean.user_name(user[\u0027name\u0027])"},{"line_number":316,"context_line":"        user[\u0027enabled\u0027] \u003d True"},{"line_number":317,"context_line":"        user \u003d utils.hash_user_password(user)"},{"line_number":318,"context_line":"        session \u003d self.get_session()"},{"line_number":319,"context_line":"        with session.begin():"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F480%3D","line":316,"in_reply_to":"AAAAMH%2F%2F5NA%3D","updated":"2012-11-16 21:26:38.000000000","message":"allowing enabled\u003dFalse *","commit_id":"c3733c09a11296a52bab1f1d75f9a7376146925c"},{"author":{"_account_id":6,"name":"Joe Heck","email":"heckj@mac.com","username":"heckj"},"change_message_id":"89d8d9a81450a50bcd69ab482555ef5d20926f74","unresolved":false,"context_lines":[{"line_number":313,"context_line":"    @handle_conflicts(type\u003d\u0027user\u0027)"},{"line_number":314,"context_line":"    def create_user(self, user_id, user):"},{"line_number":315,"context_line":"        user[\u0027name\u0027] \u003d clean.user_name(user[\u0027name\u0027])"},{"line_number":316,"context_line":"        user[\u0027enabled\u0027] \u003d True"},{"line_number":317,"context_line":"        user \u003d utils.hash_user_password(user)"},{"line_number":318,"context_line":"        session \u003d self.get_session()"},{"line_number":319,"context_line":"        with session.begin():"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F5NA%3D","line":316,"in_reply_to":"AAAAMH%2F%2F5O8%3D","updated":"2012-11-16 18:55:11.000000000","message":"agreed - allowing the user to be created with enabled\u003dTrue would be very worthwhile. I expect that means updating identity.core create_user() and the other backends to support setting that up front.","commit_id":"c3733c09a11296a52bab1f1d75f9a7376146925c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f97e5c96c69516e8c182e999ef97a42204e14c3e","unresolved":false,"context_lines":[{"line_number":339,"context_line":"                old_user_dict[k] \u003d user[k]"},{"line_number":340,"context_line":"            new_user \u003d User.from_dict(old_user_dict)"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"            user_ref.name \u003d new_user.name"},{"line_number":343,"context_line":"            user_ref.enabled \u003d new_user.enabled"},{"line_number":344,"context_line":"            user_ref.password \u003d new_user.password"},{"line_number":345,"context_line":"            user_ref.extra \u003d new_user.extra"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F5O4%3D","line":342,"updated":"2012-11-16 18:41:38.000000000","message":"Why do we set each of these values directly?  It seems like the from_dict code above should be extended to modify a pre-existing object, instead of creating a new one.","commit_id":"c3733c09a11296a52bab1f1d75f9a7376146925c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"194bb15448ec73c345af6dcf2bd02f97c2bfa858","unresolved":false,"context_lines":[{"line_number":339,"context_line":"                old_user_dict[k] \u003d user[k]"},{"line_number":340,"context_line":"            new_user \u003d User.from_dict(old_user_dict)"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"            user_ref.name \u003d new_user.name"},{"line_number":343,"context_line":"            user_ref.enabled \u003d new_user.enabled"},{"line_number":344,"context_line":"            user_ref.password \u003d new_user.password"},{"line_number":345,"context_line":"            user_ref.extra \u003d new_user.extra"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F48Q%3D","line":342,"in_reply_to":"AAAAMH%2F%2F5M0%3D","updated":"2012-11-16 21:26:38.000000000","message":"user_ref is the session object that gets flushed, so ultimately it\u0027s the only object that needs to be updated. the rest of the data shuffling dance ensures that *only* the attributes the api user requested to update *actually* change. there\u0027s probably a lot of room for improvement here now, especially now that self.attributes is available to provide some metadata to the process.","commit_id":"c3733c09a11296a52bab1f1d75f9a7376146925c"},{"author":{"_account_id":6,"name":"Joe Heck","email":"heckj@mac.com","username":"heckj"},"change_message_id":"89d8d9a81450a50bcd69ab482555ef5d20926f74","unresolved":false,"context_lines":[{"line_number":339,"context_line":"                old_user_dict[k] \u003d user[k]"},{"line_number":340,"context_line":"            new_user \u003d User.from_dict(old_user_dict)"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"            user_ref.name \u003d new_user.name"},{"line_number":343,"context_line":"            user_ref.enabled \u003d new_user.enabled"},{"line_number":344,"context_line":"            user_ref.password \u003d new_user.password"},{"line_number":345,"context_line":"            user_ref.extra \u003d new_user.extra"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F5M0%3D","line":342,"in_reply_to":"AAAAMH%2F%2F5O4%3D","updated":"2012-11-16 18:55:11.000000000","message":"I\u0027m not entirely sure on this code - Dolph will hopefully have a better answer. Maybe because previously they weren\u0027t guaranteed to be in that dict? (these changes would obviate that...)","commit_id":"c3733c09a11296a52bab1f1d75f9a7376146925c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"a73ee5d0ee52f872e61bfd5c86db2e81b9e1d5c4","unresolved":false,"context_lines":[{"line_number":313,"context_line":"    @handle_conflicts(type\u003d\u0027user\u0027)"},{"line_number":314,"context_line":"    def create_user(self, user_id, user):"},{"line_number":315,"context_line":"        user[\u0027name\u0027] \u003d clean.user_name(user[\u0027name\u0027])"},{"line_number":316,"context_line":"        if not \u0027enabled\u0027 in user:"},{"line_number":317,"context_line":"            user[\u0027enabled\u0027] \u003d True"},{"line_number":318,"context_line":"        user \u003d utils.hash_user_password(user)"},{"line_number":319,"context_line":"        session \u003d self.get_session()"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F4mA%3D","line":316,"updated":"2012-11-17 04:09:11.000000000","message":"This should provide for overloading.  It does not check that the value is a proper Boolean, but the SQL will fail if it is not convertable. Python is pretty forgivining when it comes to \"truthy\" values.","commit_id":"aa9225f8f2f03b65e78873acb2c23037723681cd"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"83c3150c6c65fc973528e12da336f3c373d3a5c6","unresolved":false,"context_lines":[{"line_number":566,"context_line":"    @handle_conflicts(type\u003d\u0027user\u0027)"},{"line_number":567,"context_line":"    def create_user(self, user_id, user):"},{"line_number":568,"context_line":"        user[\u0027name\u0027] \u003d clean.user_name(user[\u0027name\u0027])"},{"line_number":569,"context_line":"        if not \u0027enabled\u0027 in user:"},{"line_number":570,"context_line":"            user[\u0027enabled\u0027] \u003d True"},{"line_number":571,"context_line":"        user \u003d utils.hash_user_password(user)"},{"line_number":572,"context_line":"        session \u003d self.get_session()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAMH%2F%2F1NY%3D","line":569,"updated":"2012-11-20 22:10:39.000000000","message":"wondering if this should go in the manager instead?","commit_id":"19da3b02eb325c5876c443cfdf52e6ecd43a9190"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7430b0a6c397b04a1fbc7906781f106a75cb1079","unresolved":false,"context_lines":[{"line_number":566,"context_line":"    @handle_conflicts(type\u003d\u0027user\u0027)"},{"line_number":567,"context_line":"    def create_user(self, user_id, user):"},{"line_number":568,"context_line":"        user[\u0027name\u0027] \u003d clean.user_name(user[\u0027name\u0027])"},{"line_number":569,"context_line":"        if not \u0027enabled\u0027 in user:"},{"line_number":570,"context_line":"            user[\u0027enabled\u0027] \u003d True"},{"line_number":571,"context_line":"        user \u003d utils.hash_user_password(user)"},{"line_number":572,"context_line":"        session \u003d self.get_session()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAMH%2F%2F1Gg%3D","line":569,"in_reply_to":"AAAAMH%2F%2F1NY%3D","updated":"2012-11-20 23:16:45.000000000","message":"It should go in an abstract base class that calls this function.  But not in this patch","commit_id":"19da3b02eb325c5876c443cfdf52e6ecd43a9190"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"f9c70461ebfec76078dfb59a7c05ed0457c4696e","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027name\u0027, \u0027password\u0027, \u0027enabled\u0027]"},{"line_number":43,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":44,"context_line":"    name \u003d sql.Column(sql.String(64), unique\u003dTrue, nullable\u003dFalse)"},{"line_number":45,"context_line":"    password \u003d sql.Column(sql.String(64))"},{"line_number":46,"context_line":"    enabled \u003d sql.Column(sql.Boolean)"},{"line_number":47,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAMH%2F%2FxNA%3D","line":45,"updated":"2012-11-26 17:53:49.000000000","message":"This conflicts with your migration; it should probably be sql.String(119)","commit_id":"26839c2af47294b8130c0da86ce7800dc19a0254"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"1101c15187272b56086f47a2ce66925a47d6ed03","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027name\u0027, \u0027password\u0027, \u0027enabled\u0027]"},{"line_number":43,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":44,"context_line":"    name \u003d sql.Column(sql.String(64), unique\u003dTrue, nullable\u003dFalse)"},{"line_number":45,"context_line":"    password \u003d sql.Column(sql.String(64))"},{"line_number":46,"context_line":"    enabled \u003d sql.Column(sql.Boolean)"},{"line_number":47,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAMH%2F%2Fw1w%3D","line":45,"in_reply_to":"AAAAMH%2F%2FxNA%3D","updated":"2012-11-26 20:59:21.000000000","message":"Going to leave it at 128.  There is, I think, a little bit of jitter in the algorithm, and I want to give a buffer.","commit_id":"26839c2af47294b8130c0da86ce7800dc19a0254"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"f9c70461ebfec76078dfb59a7c05ed0457c4696e","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027name\u0027]"},{"line_number":76,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":77,"context_line":"    name \u003d sql.Column(sql.String(64), unique\u003dTrue, nullable\u003dFalse)"},{"line_number":78,"context_line":"    description \u003d sql.Column(sql.String(64))"},{"line_number":79,"context_line":"    enabled \u003d sql.Column(sql.Boolean)"},{"line_number":80,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAMH%2F%2FxM8%3D","line":78,"updated":"2012-11-26 17:53:49.000000000","message":"This conflicts with your migration, String(128)","commit_id":"26839c2af47294b8130c0da86ce7800dc19a0254"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"1101c15187272b56086f47a2ce66925a47d6ed03","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027name\u0027]"},{"line_number":76,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":77,"context_line":"    name \u003d sql.Column(sql.String(64), unique\u003dTrue, nullable\u003dFalse)"},{"line_number":78,"context_line":"    description \u003d sql.Column(sql.String(64))"},{"line_number":79,"context_line":"    enabled \u003d sql.Column(sql.Boolean)"},{"line_number":80,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAMH%2F%2Fw1s%3D","line":78,"in_reply_to":"AAAAMH%2F%2FxM8%3D","updated":"2012-11-26 20:59:21.000000000","message":"Done","commit_id":"26839c2af47294b8130c0da86ce7800dc19a0254"}],"tests/default_fixtures.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f97e5c96c69516e8c182e999ef97a42204e14c3e","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        \u0027name\u0027: \u0027FOO\u0027,"},{"line_number":37,"context_line":"        \u0027password\u0027: \u0027foo2\u0027,"},{"line_number":38,"context_line":"        \u0027tenants\u0027: [\u0027bar\u0027],"},{"line_number":39,"context_line":"        \u0027enabled\u0027: True"},{"line_number":40,"context_line":"    }, {"},{"line_number":41,"context_line":"        \u0027id\u0027: \u0027two\u0027,"},{"line_number":42,"context_line":"        \u0027name\u0027: \u0027TWO\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F5PA%3D","line":39,"updated":"2012-11-16 18:41:38.000000000","message":"enabled is defaulted, but the tests look for dictionary comparisons.","commit_id":"c3733c09a11296a52bab1f1d75f9a7376146925c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"a73ee5d0ee52f872e61bfd5c86db2e81b9e1d5c4","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        \u0027name\u0027: \u0027FOO\u0027,"},{"line_number":37,"context_line":"        \u0027password\u0027: \u0027foo2\u0027,"},{"line_number":38,"context_line":"        \u0027tenants\u0027: [\u0027bar\u0027],"},{"line_number":39,"context_line":"        \u0027enabled\u0027: True"},{"line_number":40,"context_line":"    }, {"},{"line_number":41,"context_line":"        \u0027id\u0027: \u0027two\u0027,"},{"line_number":42,"context_line":"        \u0027name\u0027: \u0027TWO\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F4l4%3D","line":39,"updated":"2012-11-17 04:09:11.000000000","message":"Actually, it would be good to drop this change, and put in an explicit test, to see if the Defaulting works.","commit_id":"aa9225f8f2f03b65e78873acb2c23037723681cd"}],"tests/test_backend.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"194bb15448ec73c345af6dcf2bd02f97c2bfa858","unresolved":false,"context_lines":[{"line_number":665,"context_line":"        self.assertDictEqual(original_user, new_user)"},{"line_number":666,"context_line":""},{"line_number":667,"context_line":"    def test_update_user_enable(self):"},{"line_number":668,"context_line":"        user \u003d {\u0027id\u0027: \u0027fake1\u0027, \u0027name\u0027: \u0027fake1\u0027, \u0027enabled\u0027: \u0027True\u0027}"},{"line_number":669,"context_line":"        self.identity_api.create_user(\u0027fake1\u0027, user)"},{"line_number":670,"context_line":"        user_ref \u003d self.identity_api.get_user(\u0027fake1\u0027)"},{"line_number":671,"context_line":"        self.assertEqual(user_ref[\u0027enabled\u0027], \u0027True\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F49I%3D","side":"PARENT","line":668,"updated":"2012-11-16 21:26:38.000000000","message":"woooooooooow i\u0027ve never caught that before","commit_id":"36a247c66134c686acd78798adbc777717543a2a"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f97e5c96c69516e8c182e999ef97a42204e14c3e","unresolved":false,"context_lines":[{"line_number":659,"context_line":""},{"line_number":660,"context_line":"    def test_create_user_doesnt_modify_passed_in_dict(self):"},{"line_number":661,"context_line":"        new_user \u003d {\u0027id\u0027: \u0027user_id\u0027, \u0027name\u0027: \u0027new_user\u0027,"},{"line_number":662,"context_line":"                    \u0027password\u0027: \u0027secret\u0027, \u0027enabled\u0027: True}"},{"line_number":663,"context_line":"        original_user \u003d new_user.copy()"},{"line_number":664,"context_line":"        self.identity_api.create_user(\u0027user_id\u0027, new_user)"},{"line_number":665,"context_line":"        self.assertDictEqual(original_user, new_user)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F5PI%3D","line":662,"updated":"2012-11-16 18:41:38.000000000","message":"Note that this is a change to how the back end talks, but is more correct from a Python perspective, and also still marshalls correctly to other systems.","commit_id":"c3733c09a11296a52bab1f1d75f9a7376146925c"},{"author":{"_account_id":6,"name":"Joe Heck","email":"heckj@mac.com","username":"heckj"},"change_message_id":"89d8d9a81450a50bcd69ab482555ef5d20926f74","unresolved":false,"context_lines":[{"line_number":659,"context_line":""},{"line_number":660,"context_line":"    def test_create_user_doesnt_modify_passed_in_dict(self):"},{"line_number":661,"context_line":"        new_user \u003d {\u0027id\u0027: \u0027user_id\u0027, \u0027name\u0027: \u0027new_user\u0027,"},{"line_number":662,"context_line":"                    \u0027password\u0027: \u0027secret\u0027, \u0027enabled\u0027: True}"},{"line_number":663,"context_line":"        original_user \u003d new_user.copy()"},{"line_number":664,"context_line":"        self.identity_api.create_user(\u0027user_id\u0027, new_user)"},{"line_number":665,"context_line":"        self.assertDictEqual(original_user, new_user)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F5Mw%3D","line":662,"in_reply_to":"AAAAMH%2F%2F5PI%3D","updated":"2012-11-16 18:55:11.000000000","message":"+1","commit_id":"c3733c09a11296a52bab1f1d75f9a7376146925c"}],"tests/test_backend_sql.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"c2f0e22b1889c3d4dd5dcfad86aaeed203a5fd31","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        # populate the engine with tables \u0026 fixtures"},{"line_number":55,"context_line":"        self.load_fixtures(default_fixtures)"},{"line_number":56,"context_line":"        #defaulted by the data load"},{"line_number":57,"context_line":"        self.user_foo[\u0027enabled\u0027] \u003d True"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def tearDown(self):"},{"line_number":60,"context_line":"        sql.set_global_engine(None)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAMH%2F%2Fzr4%3D","line":57,"updated":"2012-11-21 22:57:12.000000000","message":"curious why this is necessary?","commit_id":"f727ec413a8b07f8bd349985f154c71cc3104ca6"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7af1b633875f778bd9bc5976fcb799335f8ac91c","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        # populate the engine with tables \u0026 fixtures"},{"line_number":55,"context_line":"        self.load_fixtures(default_fixtures)"},{"line_number":56,"context_line":"        #defaulted by the data load"},{"line_number":57,"context_line":"        self.user_foo[\u0027enabled\u0027] \u003d True"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def tearDown(self):"},{"line_number":60,"context_line":"        sql.set_global_engine(None)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAMH%2F%2FxdI%3D","line":57,"in_reply_to":"AAAAMH%2F%2Fzr4%3D","updated":"2012-11-26 14:32:21.000000000","message":"Without it, the dictionaries don\u0027t match:  \u0027enabled\u0027 is now always returned True or False.","commit_id":"f727ec413a8b07f8bd349985f154c71cc3104ca6"}],"tests/test_sql_upgrade.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"a73ee5d0ee52f872e61bfd5c86db2e81b9e1d5c4","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        self.assertTableColumns(\"metadata\", [\"user_id\", \"tenant_id\", \"data\"])"},{"line_number":77,"context_line":"        self.populate_user_table()"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def test_upgrade_1_to_6(self):"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        self.assertEqual(self.schema.version, 0, \"DB is at version 0\")"},{"line_number":82,"context_line":"        self._migrate(self.repo_path, 1)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F4l8%3D","line":79,"updated":"2012-11-17 04:09:11.000000000","message":"Can\u0027t write a \"test downgrade\" due to the limitations of SQLite.","commit_id":"aa9225f8f2f03b65e78873acb2c23037723681cd"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"83c3150c6c65fc973528e12da336f3c373d3a5c6","unresolved":false,"context_lines":[{"line_number":118,"context_line":"            raise AssertionError(\u0027Table \"%s\" already exists\u0027 % table_name)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def _migrate(self, repository, version):"},{"line_number":121,"context_line":"        upgrade \u003d True"},{"line_number":122,"context_line":"        err \u003d \"\""},{"line_number":123,"context_line":"        version \u003d versioning_api._migrate_version(self.schema,"},{"line_number":124,"context_line":"                                                  version,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAMH%2F%2F1NU%3D","side":"PARENT","line":121,"updated":"2012-11-20 22:10:39.000000000","message":"nice","commit_id":"4c0f9a6ec2f05b11bce29f2c865b01dc9ae2d8b1"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"83c3150c6c65fc973528e12da336f3c373d3a5c6","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        user_table \u003d sqlalchemy.Table(\"user\","},{"line_number":109,"context_line":"                                      self.metadata,"},{"line_number":110,"context_line":"                                      autoload\u003dTrue)"},{"line_number":111,"context_line":"        a_user \u003d session.query(user_table).filter(\"id\u003d\u0027foo\u0027\").one()"},{"line_number":112,"context_line":"        self.assertTrue(a_user.enabled)"},{"line_number":113,"context_line":"        a_user \u003d session.query(user_table).filter(\"id\u003d\u0027badguy\u0027\").one()"},{"line_number":114,"context_line":"        self.assertFalse(a_user.enabled)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAMH%2F%2F1NI%3D","line":111,"updated":"2012-11-20 22:10:39.000000000","message":"try filter_by(id\u003d\u0027foo\u0027), I think","commit_id":"19da3b02eb325c5876c443cfdf52e6ecd43a9190"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7430b0a6c397b04a1fbc7906781f106a75cb1079","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        user_table \u003d sqlalchemy.Table(\"user\","},{"line_number":109,"context_line":"                                      self.metadata,"},{"line_number":110,"context_line":"                                      autoload\u003dTrue)"},{"line_number":111,"context_line":"        a_user \u003d session.query(user_table).filter(\"id\u003d\u0027foo\u0027\").one()"},{"line_number":112,"context_line":"        self.assertTrue(a_user.enabled)"},{"line_number":113,"context_line":"        a_user \u003d session.query(user_table).filter(\"id\u003d\u0027badguy\u0027\").one()"},{"line_number":114,"context_line":"        self.assertFalse(a_user.enabled)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAMH%2F%2F1HE%3D","line":111,"in_reply_to":"AAAAMH%2F%2F1NI%3D","updated":"2012-11-20 23:16:45.000000000","message":"Nah, has to be straight sql for this to work.  That form works elsewhere.","commit_id":"19da3b02eb325c5876c443cfdf52e6ecd43a9190"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"c2f0e22b1889c3d4dd5dcfad86aaeed203a5fd31","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        self.populate_user_table()"},{"line_number":93,"context_line":"        self.populate_tenant_table()"},{"line_number":94,"context_line":"        self._migrate(self.repo_path, 9)"},{"line_number":95,"context_line":"        self.assertEqual(self.schema.version, 9, \"DB is at version 0\")"},{"line_number":96,"context_line":"        self.assertTableColumns(\"user\","},{"line_number":97,"context_line":"                                [\"id\", \"name\", \"extra\", \"password\","},{"line_number":98,"context_line":"                                 \"enabled\"])"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAMH%2F%2Fzrw%3D","line":95,"updated":"2012-11-21 22:57:12.000000000","message":"update the message or just remove it (error message should be clear without it)","commit_id":"f727ec413a8b07f8bd349985f154c71cc3104ca6"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7af1b633875f778bd9bc5976fcb799335f8ac91c","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        self.populate_user_table()"},{"line_number":93,"context_line":"        self.populate_tenant_table()"},{"line_number":94,"context_line":"        self._migrate(self.repo_path, 9)"},{"line_number":95,"context_line":"        self.assertEqual(self.schema.version, 9, \"DB is at version 0\")"},{"line_number":96,"context_line":"        self.assertTableColumns(\"user\","},{"line_number":97,"context_line":"                                [\"id\", \"name\", \"extra\", \"password\","},{"line_number":98,"context_line":"                                 \"enabled\"])"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAMH%2F%2FxdE%3D","line":95,"in_reply_to":"AAAAMH%2F%2Fzrw%3D","updated":"2012-11-26 14:32:21.000000000","message":"Done","commit_id":"f727ec413a8b07f8bd349985f154c71cc3104ca6"}]}
