)]}'
{"nova/db/sqlalchemy/migrate_repo/versions/255_add_fixed_ip_updated_index.py":[{"author":{"_account_id":8412,"name":"Mike Durnosvistov","email":"glacierr.dev@gmail.com","username":"mdurnosvistov"},"change_message_id":"f03769b5da633145dd1dd6fb8926195697cca3f1","unresolved":false,"context_lines":[{"line_number":11,"context_line":"#  under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"from sqlalchemy import Index, MetaData, Table"},{"line_number":14,"context_line":"from nova.openstack.common.gettextutils import _"},{"line_number":15,"context_line":"from nova.openstack.common import log as logging"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa98f980_f905ab15","line":14,"updated":"2014-09-18 12:51:01.000000000","message":"please use `from nova.i18n import _`","commit_id":"2bbef60931e559044e2a4dcb6e74a6aee2eaacd8"},{"author":{"_account_id":8412,"name":"Mike Durnosvistov","email":"glacierr.dev@gmail.com","username":"mdurnosvistov"},"change_message_id":"f03769b5da633145dd1dd6fb8926195697cca3f1","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    def _ensure_index(self, added, tablename, *args):"},{"line_number":28,"context_line":"        table \u003d Table(tablename, self.meta, autoload\u003dTrue)"},{"line_number":29,"context_line":"        idx_cols \u003d set(args)"},{"line_number":30,"context_line":"        #4 cases to account for: perform an index-add, perform an index-remove,"},{"line_number":31,"context_line":"        #roll back an index-add, roll back an index-remove."},{"line_number":32,"context_line":"        creating \u003d (bool(added) \u003d\u003d bool(self.upgrading))"},{"line_number":33,"context_line":"        idx_name \u003d \u0027_\u0027.join((tablename,) + args + (\u0027idx\u0027,))"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa98f980_39001302","line":30,"updated":"2014-09-18 12:51:01.000000000","message":"E265 block comment should start with \u0027# \u0027","commit_id":"2bbef60931e559044e2a4dcb6e74a6aee2eaacd8"},{"author":{"_account_id":8412,"name":"Mike Durnosvistov","email":"glacierr.dev@gmail.com","username":"mdurnosvistov"},"change_message_id":"f03769b5da633145dd1dd6fb8926195697cca3f1","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        table \u003d Table(tablename, self.meta, autoload\u003dTrue)"},{"line_number":29,"context_line":"        idx_cols \u003d set(args)"},{"line_number":30,"context_line":"        #4 cases to account for: perform an index-add, perform an index-remove,"},{"line_number":31,"context_line":"        #roll back an index-add, roll back an index-remove."},{"line_number":32,"context_line":"        creating \u003d (bool(added) \u003d\u003d bool(self.upgrading))"},{"line_number":33,"context_line":"        idx_name \u003d \u0027_\u0027.join((tablename,) + args + (\u0027idx\u0027,))"},{"line_number":34,"context_line":"        if not args:"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa98f980_64fe6e07","line":31,"updated":"2014-09-18 12:51:01.000000000","message":"ditto","commit_id":"2bbef60931e559044e2a4dcb6e74a6aee2eaacd8"},{"author":{"_account_id":8412,"name":"Mike Durnosvistov","email":"glacierr.dev@gmail.com","username":"mdurnosvistov"},"change_message_id":"f03769b5da633145dd1dd6fb8926195697cca3f1","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        if not args:"},{"line_number":35,"context_line":"            raise TypeError(\u0027index add/remove requires 1 or more column-names\u0027)"},{"line_number":36,"context_line":"        for index in table.indexes:"},{"line_number":37,"context_line":"            #check for equivalent sets of columns"},{"line_number":38,"context_line":"            if not idx_cols.symmetric_difference(index.columns.keys()):"},{"line_number":39,"context_line":"                if creating:"},{"line_number":40,"context_line":"                    LOG.info(_(\u0027Skipped adding %s index because an \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa98f980_a4085629","line":37,"updated":"2014-09-18 12:51:01.000000000","message":"ditto","commit_id":"2bbef60931e559044e2a4dcb6e74a6aee2eaacd8"},{"author":{"_account_id":8412,"name":"Mike Durnosvistov","email":"glacierr.dev@gmail.com","username":"mdurnosvistov"},"change_message_id":"f03769b5da633145dd1dd6fb8926195697cca3f1","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            #check for equivalent sets of columns"},{"line_number":38,"context_line":"            if not idx_cols.symmetric_difference(index.columns.keys()):"},{"line_number":39,"context_line":"                if creating:"},{"line_number":40,"context_line":"                    LOG.info(_(\u0027Skipped adding %s index because an \u0027"},{"line_number":41,"context_line":"                        \u0027equivalent index already exists.\u0027) % (idx_name,))"},{"line_number":42,"context_line":"                else:"},{"line_number":43,"context_line":"                    index.drop(self.meta.bind)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa98f980_a41f765a","line":40,"updated":"2014-09-18 12:51:01.000000000","message":"Please use `_LI`","commit_id":"2bbef60931e559044e2a4dcb6e74a6aee2eaacd8"},{"author":{"_account_id":8412,"name":"Mike Durnosvistov","email":"glacierr.dev@gmail.com","username":"mdurnosvistov"},"change_message_id":"f03769b5da633145dd1dd6fb8926195697cca3f1","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                index.create(self.meta.bind)"},{"line_number":50,"context_line":"            else:"},{"line_number":51,"context_line":"                index \u003d None"},{"line_number":52,"context_line":"                LOG.info(_(\u0027Skipped removing %s index because it does not \u0027"},{"line_number":53,"context_line":"                                \u0027exist.\u0027) % (idx_name,))"},{"line_number":54,"context_line":"        return index"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa98f980_64258ead","line":52,"range":{"start_line":52,"start_character":24,"end_line":52,"end_character":27},"updated":"2014-09-18 12:51:01.000000000","message":"Please use `_LI`","commit_id":"2bbef60931e559044e2a4dcb6e74a6aee2eaacd8"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"166e10ddda863ed852a9a1ac81772471ad2a0aa4","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        creating \u003d (bool(added) \u003d\u003d bool(self.upgrading))"},{"line_number":33,"context_line":"        idx_name \u003d \u0027_\u0027.join((tablename,) + args + (\u0027idx\u0027,))"},{"line_number":34,"context_line":"        if not args:"},{"line_number":35,"context_line":"            raise TypeError(\u0027index add/remove requires 1 or more column-names\u0027)"},{"line_number":36,"context_line":"        for index in table.indexes:"},{"line_number":37,"context_line":"            # check for equivalent sets of columns"},{"line_number":38,"context_line":"            if not idx_cols.symmetric_difference(index.columns.keys()):"}],"source_content_type":"text/x-python","patch_set":3,"id":"baa201ad_d9758733","line":35,"updated":"2014-09-29 06:33:03.000000000","message":"missing translation here","commit_id":"80638870a735a033fac19909ae569ead1866f9de"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d811a80ce21c02e41497de9d6ec76fb24d2f8213","unresolved":false,"context_lines":[{"line_number":11,"context_line":"#  under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"from sqlalchemy import Index, MetaData, Table"},{"line_number":14,"context_line":"from nova.i18n import _LI, _LE"},{"line_number":15,"context_line":"from nova.openstack.common import log as logging"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":4,"id":"baa201ad_2b1aab17","line":14,"updated":"2014-09-29 16:49:14.000000000","message":"pep8 is going to complain about not grouping the sqlalchemy stuff separately from the nova imports.  Just add a blank line between them.","commit_id":"c544e0b2f483a1f0ff50a36c6dfdf1e8cb5ca292"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d811a80ce21c02e41497de9d6ec76fb24d2f8213","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        return index"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"index_args \u003d [True, \u0027fixed_ips\u0027, \u0027deleted\u0027, \u0027allocated\u0027, \u0027updated_at\u0027]"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":4,"id":"baa201ad_0be4070c","line":58,"updated":"2014-09-29 16:49:14.000000000","message":"Suggest making index_args all caps and move above the class definition so it\u0027s more clear it\u0027s a constant.","commit_id":"c544e0b2f483a1f0ff50a36c6dfdf1e8cb5ca292"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"61ef7211d2a850603ae2631000cfba92370f7722","unresolved":false,"context_lines":[{"line_number":20,"context_line":"INDEX_ARGS \u003d [True, \u0027fixed_ips\u0027, \u0027deleted\u0027, \u0027allocated\u0027, \u0027updated_at\u0027]"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class Migrator(object):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def __init__(self, migrate_engine, upgrading\u003dTrue):"},{"line_number":26,"context_line":"        self.meta \u003d MetaData()"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_bccfbfaf","line":23,"updated":"2014-09-29 18:07:41.000000000","message":"this really needs to be put into the sqla utils, and preferably directly tested itself. It\u0027s good to be generic, but this is enough logic here it would be good to see that it recovers correctly in the fail case.","commit_id":"bb95edccf0817cd762223ba823b6d8f2b5652ae7"}],"nova/db/sqlalchemy/migrate_repo/versions/266_add_fixed_ip_updated_index.py":[{"author":{"_account_id":100,"name":"Johannes Erdfelt","email":"johannes@erdfelt.com","username":"johannes.erdfelt"},"change_message_id":"05d6ceaa7b1b3c806f73dce66872be9edd434e92","unresolved":false,"context_lines":[{"line_number":18,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"INDEX_COLUMNS \u003d sorted((\u0027allocated\u0027, \u0027deleted\u0027, \u0027updated_at\u0027))"},{"line_number":22,"context_line":"INDEX_NAME \u003d \u0027fixed_ips_%s_idx\u0027 % (\u0027_\u0027.join(INDEX_COLUMNS),)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9aa7fdbe_7c1605a9","line":21,"updated":"2014-10-21 17:24:32.000000000","message":"The order of the columns can help optimize other queries. Can we be explicit about the order?\n\nMaking \u0027deleted\u0027 first would help with pruning of the database. It also matches the order in the test you\u0027ve written.","commit_id":"47c5b4dfbfc24b2d9c3da93972aa2cfd526f88e2"},{"author":{"_account_id":100,"name":"Johannes Erdfelt","email":"johannes@erdfelt.com","username":"johannes.erdfelt"},"change_message_id":"05d6ceaa7b1b3c806f73dce66872be9edd434e92","unresolved":false,"context_lines":[{"line_number":48,"context_line":"def downgrade(migrate_engine):"},{"line_number":49,"context_line":"    meta, table, index \u003d _get_table_index(migrate_engine)"},{"line_number":50,"context_line":"    if not index:"},{"line_number":51,"context_line":"        LOG.info(_LI(\u0027Skipped removing %s because no such index exists\u0027) %\\"},{"line_number":52,"context_line":"                     (INDEX_NAME,))"},{"line_number":53,"context_line":"        return"},{"line_number":54,"context_line":"    index.drop(migrate_engine)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9aa7fdbe_5c894125","line":51,"updated":"2014-10-21 17:24:32.000000000","message":"Trailing \\ is unnecessary","commit_id":"47c5b4dfbfc24b2d9c3da93972aa2cfd526f88e2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3808b59cc2c31c8c39b39d6348c94cbf54c7d6e3","unresolved":false,"context_lines":[{"line_number":22,"context_line":"INDEX_NAME \u003d \u0027fixed_ips_%s_idx\u0027 % (\u0027_\u0027.join(INDEX_COLUMNS),)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"def _get_table_index(migrate_engine):"},{"line_number":26,"context_line":"    meta \u003d MetaData()"},{"line_number":27,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":28,"context_line":"    table \u003d Table(\u0027fixed_ips\u0027, meta, autoload\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa7fdbe_90f08468","line":25,"updated":"2014-10-24 19:13:28.000000000","message":"I was going to say use this:\n\nhttp://git.openstack.org/cgit/openstack/oslo.db/tree/oslo/db/sqlalchemy/utils.py?id\u003d1.0.2#n717\n\nbut it\u0027s a bit different, checks on name.","commit_id":"a16d53c496e0520a36f78e74626058bd5bd32508"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3808b59cc2c31c8c39b39d6348c94cbf54c7d6e3","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    meta, table, index \u003d _get_table_index(migrate_engine)"},{"line_number":40,"context_line":"    if index:"},{"line_number":41,"context_line":"        LOG.info(_LI(\u0027Skipped adding %s because an equivalent index\u0027"},{"line_number":42,"context_line":"                     \u0027 already exists.\u0027) % (INDEX_NAME,))"},{"line_number":43,"context_line":"        return"},{"line_number":44,"context_line":"    columns \u003d [getattr(table.c, col_name) for col_name in INDEX_COLUMNS]"},{"line_number":45,"context_line":"    index \u003d Index(INDEX_NAME, *columns)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa7fdbe_9062443c","line":42,"updated":"2014-10-24 19:13:28.000000000","message":"You should pass INDEX_NAME as an arg to LOG.info, see:\n\nhttp://docs.openstack.org/developer/oslo.i18n/guidelines.html#adding-variables-to-log-messages","commit_id":"a16d53c496e0520a36f78e74626058bd5bd32508"},{"author":{"_account_id":13103,"name":"Paul Griffin","email":"paul.griffin@bct-llc.com","username":"pgriffin"},"change_message_id":"db3bbfc9a1e090bb34d74ceba9111d3b0a1c0492","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    meta, table, index \u003d _get_table_index(migrate_engine)"},{"line_number":40,"context_line":"    if index:"},{"line_number":41,"context_line":"        LOG.info(_LI(\u0027Skipped adding %s because an equivalent index\u0027"},{"line_number":42,"context_line":"                     \u0027 already exists.\u0027) % (INDEX_NAME,))"},{"line_number":43,"context_line":"        return"},{"line_number":44,"context_line":"    columns \u003d [getattr(table.c, col_name) for col_name in INDEX_COLUMNS]"},{"line_number":45,"context_line":"    index \u003d Index(INDEX_NAME, *columns)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_b2690cfb","line":42,"in_reply_to":"9aa7fdbe_9062443c","updated":"2014-11-24 17:15:42.000000000","message":"Done","commit_id":"a16d53c496e0520a36f78e74626058bd5bd32508"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3808b59cc2c31c8c39b39d6348c94cbf54c7d6e3","unresolved":false,"context_lines":[{"line_number":49,"context_line":"def downgrade(migrate_engine):"},{"line_number":50,"context_line":"    meta, table, index \u003d _get_table_index(migrate_engine)"},{"line_number":51,"context_line":"    if not index:"},{"line_number":52,"context_line":"        LOG.info(_LI(\u0027Skipped removing %s because no such index exists\u0027) %"},{"line_number":53,"context_line":"                     (INDEX_NAME,))"},{"line_number":54,"context_line":"        return"},{"line_number":55,"context_line":"    index.drop(migrate_engine)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa7fdbe_d0584c8c","line":52,"updated":"2014-10-24 19:13:28.000000000","message":"ditto:\n\nhttp://docs.openstack.org/developer/oslo.i18n/guidelines.html#adding-variables-to-log-messages","commit_id":"a16d53c496e0520a36f78e74626058bd5bd32508"},{"author":{"_account_id":13103,"name":"Paul Griffin","email":"paul.griffin@bct-llc.com","username":"pgriffin"},"change_message_id":"db3bbfc9a1e090bb34d74ceba9111d3b0a1c0492","unresolved":false,"context_lines":[{"line_number":49,"context_line":"def downgrade(migrate_engine):"},{"line_number":50,"context_line":"    meta, table, index \u003d _get_table_index(migrate_engine)"},{"line_number":51,"context_line":"    if not index:"},{"line_number":52,"context_line":"        LOG.info(_LI(\u0027Skipped removing %s because no such index exists\u0027) %"},{"line_number":53,"context_line":"                     (INDEX_NAME,))"},{"line_number":54,"context_line":"        return"},{"line_number":55,"context_line":"    index.drop(migrate_engine)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_f26f14fa","line":52,"in_reply_to":"9aa7fdbe_d0584c8c","updated":"2014-11-24 17:15:42.000000000","message":"Done","commit_id":"a16d53c496e0520a36f78e74626058bd5bd32508"}],"nova/db/sqlalchemy/migrate_repo/versions/275_add_fixed_ip_updated_index.py":[{"author":{"_account_id":100,"name":"Johannes Erdfelt","email":"johannes@erdfelt.com","username":"johannes.erdfelt"},"change_message_id":"08a6c840d5c2fbea87760cbf2ae03fff992668e9","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    table \u003d Table(\u0027fixed_ips\u0027, meta, autoload\u003dTrue)"},{"line_number":29,"context_line":"    col_set \u003d sorted(INDEX_COLUMNS)"},{"line_number":30,"context_line":"    for idx in table.indexes:"},{"line_number":31,"context_line":"        if sorted(idx.columns.keys()) \u003d\u003d col_set:"},{"line_number":32,"context_line":"            break"},{"line_number":33,"context_line":"    else:"},{"line_number":34,"context_line":"        idx \u003d None"}],"source_content_type":"text/x-python","patch_set":16,"id":"da86d52c_aaa28748","line":31,"updated":"2015-02-04 18:04:57.000000000","message":"Order of the columns does matter for a couple of reasons:\n\n1) Most SQL engines can use the leading columns of indexes to optimize queries that don\u0027t use all of the columns in the index.\n\n2) A unit test has recently been merged that compares the resulting schema from the migrations against the model. It enforces the order of the indexes.\n\nAs a result, sorting the order of the columns when comparing isn\u0027t necessary and can just possibly end up with results that will fail unit tests anyway.","commit_id":"ced18c0d3f710aae4610381447033e6b5164c475"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"e6e575f72a660e334bd352dac240d6a4da930ff1","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    table \u003d Table(\u0027fixed_ips\u0027, meta, autoload\u003dTrue)"},{"line_number":29,"context_line":"    col_set \u003d sorted(INDEX_COLUMNS)"},{"line_number":30,"context_line":"    for idx in table.indexes:"},{"line_number":31,"context_line":"        if sorted(idx.columns.keys()) \u003d\u003d col_set:"},{"line_number":32,"context_line":"            break"},{"line_number":33,"context_line":"    else:"},{"line_number":34,"context_line":"        idx \u003d None"}],"source_content_type":"text/x-python","patch_set":16,"id":"da86d52c_7459078d","line":31,"in_reply_to":"da86d52c_aaa28748","updated":"2015-02-06 13:53:33.000000000","message":"agree, this should get fixed before merge","commit_id":"ced18c0d3f710aae4610381447033e6b5164c475"}],"nova/db/sqlalchemy/migrate_repo/versions/277_add_fixed_ip_updated_index.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8d1f196bb0a74b873c8e03f8a91204d97162d425","unresolved":false,"context_lines":[{"line_number":13,"context_line":"from sqlalchemy import Index, MetaData, Table"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from nova.i18n import _LI"},{"line_number":16,"context_line":"from nova.openstack.common import log as logging"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"ba7be1f8_65a4e108","line":16,"updated":"2015-02-26 23:26:45.000000000","message":"This needs to be rebased, you have to use oslo_log now.","commit_id":"05f0fd5b9d2e851c5a7f402a95b693329b5619f1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9684b1bb63996a47a87c05aed89b3603ad1a3d30","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    meta, table, index \u003d _get_table_index(migrate_engine)"},{"line_number":50,"context_line":"    if not index:"},{"line_number":51,"context_line":"        LOG.info(_LI(\u0027Skipped removing %s because no such index exists\u0027),"},{"line_number":52,"context_line":"                     INDEX_NAME)"},{"line_number":53,"context_line":"        return"},{"line_number":54,"context_line":"    index.drop(migrate_engine)"}],"source_content_type":"text/x-python","patch_set":17,"id":"ba7be1f8_d77546fb","line":52,"updated":"2015-02-26 21:28:32.000000000","message":"nit: technically this should be aligned with the _LI above.","commit_id":"05f0fd5b9d2e851c5a7f402a95b693329b5619f1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d9de7b6480cf68fa9a0c8685ae48f3ee94ce902d","unresolved":false,"context_lines":[{"line_number":13,"context_line":"from sqlalchemy import Index, MetaData, Table"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from nova.i18n import _LI"},{"line_number":16,"context_line":"from oslo_log import log as logging"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"ba7be1f8_eeb414d3","line":16,"updated":"2015-02-27 14:32:43.000000000","message":"The oslo_log import should be grouped with other 3rd party imports like sqlalchemy above.\n\nThe groups go:\n\nstdlib\n\n3rd party\n\nnova\n\nhttp://docs.openstack.org/developer/hacking/#imports","commit_id":"71a0f1217dc93af7aeb3b7942740a3d5668a9c7a"}],"nova/tests/unit/db/test_migrations.py":[{"author":{"_account_id":100,"name":"Johannes Erdfelt","email":"johannes@erdfelt.com","username":"johannes.erdfelt"},"change_message_id":"08a6c840d5c2fbea87760cbf2ae03fff992668e9","unresolved":false,"context_lines":[{"line_number":767,"context_line":"        fixed_ips \u003d oslodbutils.get_table(engine, \u0027fixed_ips\u0027)"},{"line_number":768,"context_line":"        index_names \u003d [idx.name for idx in fixed_ips.indexes]"},{"line_number":769,"context_line":"        self.assertNotIn(\u0027fixed_ips_deleted_allocated_updated_at_idx\u0027,"},{"line_number":770,"context_line":"                         index_names)"},{"line_number":771,"context_line":""},{"line_number":772,"context_line":""},{"line_number":773,"context_line":"class TestNovaMigrationsSQLite(NovaMigrationsCheckers,"}],"source_content_type":"text/x-python","patch_set":16,"id":"da86d52c_8a10635a","line":770,"updated":"2015-02-04 18:04:57.000000000","message":"There is a new assertIndexNotExists method which would simplify this. See _post_downgrade_274","commit_id":"ced18c0d3f710aae4610381447033e6b5164c475"}]}
