)]}'
{"nova/objects/flavor.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"9c46a78b811c4192943063e7378a6ecc74014379","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        for k, v in specs.items():"},{"line_number":134,"context_line":"            db_spec \u003d api_models.FlavorExtraSpecs()"},{"line_number":135,"context_line":"            db_spec[\u0027key\u0027] \u003d k"},{"line_number":136,"context_line":"            db_spec[\u0027value\u0027] \u003d v"},{"line_number":137,"context_line":"            db_specs.append(db_spec)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    projects \u003d values.get(\u0027projects\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"da0c15f0_72a9507b","line":136,"updated":"2016-03-27 13:51:24.000000000","message":"I think we should really be discouraging dict access in our models, right? Even the DB models... How about this instead?\n\n specs \u003d values.get(\u0027extra_specs\u0027)\n if specs:\n     db_specs \u003d [api_models.FlavorExtraSpecs(key\u003dk, value\u003dv)\n                 for k, v in specs.items()]","commit_id":"903b89ac2642fb8243e380531928ca23475c0c79"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f54dc31c1d3a52153556fc54a5515019a1a0cca3","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        for k, v in specs.items():"},{"line_number":134,"context_line":"            db_spec \u003d api_models.FlavorExtraSpecs()"},{"line_number":135,"context_line":"            db_spec[\u0027key\u0027] \u003d k"},{"line_number":136,"context_line":"            db_spec[\u0027value\u0027] \u003d v"},{"line_number":137,"context_line":"            db_specs.append(db_spec)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    projects \u003d values.get(\u0027projects\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"da0c15f0_90d4c120","line":136,"in_reply_to":"da0c15f0_72a9507b","updated":"2016-03-28 14:13:19.000000000","message":"I guess.. I\u0027m not sure I see the problem as this sort of access is a formal way we deal with those models elsewhere. This is just copy/adapted from the existing flavor db/api code.","commit_id":"903b89ac2642fb8243e380531928ca23475c0c79"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"9c46a78b811c4192943063e7378a6ecc74014379","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        for project in set(projects):"},{"line_number":143,"context_line":"            db_project \u003d api_models.FlavorProjects()"},{"line_number":144,"context_line":"            db_project[\u0027project_id\u0027] \u003d project"},{"line_number":145,"context_line":"            db_projects.append(db_project)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    values[\u0027extra_specs\u0027] \u003d db_specs"},{"line_number":148,"context_line":"    values[\u0027projects\u0027] \u003d db_projects"}],"source_content_type":"text/x-python","patch_set":17,"id":"da0c15f0_d2b65cdb","line":145,"updated":"2016-03-27 13:51:24.000000000","message":"Ditto from above...\n\n if projects:\n     db_projects \u003d [api_models.FlavorProject(project_id\u003dp)\n                    for p in set(projects)]","commit_id":"903b89ac2642fb8243e380531928ca23475c0c79"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"9c46a78b811c4192943063e7378a6ecc74014379","unresolved":false,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    values[\u0027extra_specs\u0027] \u003d db_specs"},{"line_number":148,"context_line":"    values[\u0027projects\u0027] \u003d db_projects"},{"line_number":149,"context_line":"    db_flavor \u003d api_models.Flavors()"},{"line_number":150,"context_line":"    db_flavor.update(values)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":17,"id":"da0c15f0_b2b928ce","line":149,"updated":"2016-03-27 13:51:24.000000000","message":"I originally thought this should have been api_models.Flavor (singular). Turns out that it is indeed Flavors (plural). Not sure why, but OK :)","commit_id":"903b89ac2642fb8243e380531928ca23475c0c79"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f54dc31c1d3a52153556fc54a5515019a1a0cca3","unresolved":false,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    values[\u0027extra_specs\u0027] \u003d db_specs"},{"line_number":148,"context_line":"    values[\u0027projects\u0027] \u003d db_projects"},{"line_number":149,"context_line":"    db_flavor \u003d api_models.Flavors()"},{"line_number":150,"context_line":"    db_flavor.update(values)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":17,"id":"da0c15f0_d0de393e","line":149,"in_reply_to":"da0c15f0_b2b928ce","updated":"2016-03-28 14:13:19.000000000","message":"Not my choice or preference either, believe me :)","commit_id":"903b89ac2642fb8243e380531928ca23475c0c79"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"373ed677bcf2f78baa89e52e1897aa6019b13465","unresolved":false,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    values[\u0027extra_specs\u0027] \u003d db_specs"},{"line_number":148,"context_line":"    values[\u0027projects\u0027] \u003d db_projects"},{"line_number":149,"context_line":"    db_flavor \u003d api_models.Flavors()"},{"line_number":150,"context_line":"    db_flavor.update(values)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":17,"id":"ba0121b8_eeff12a8","line":149,"in_reply_to":"da0c15f0_d0de393e","updated":"2016-03-30 14:16:52.000000000","message":"We can rename these easily enough. Just wasn\u0027t caught in review when they were added.","commit_id":"903b89ac2642fb8243e380531928ca23475c0c79"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"9c46a78b811c4192943063e7378a6ecc74014379","unresolved":false,"context_lines":[{"line_number":443,"context_line":""},{"line_number":444,"context_line":"    @staticmethod"},{"line_number":445,"context_line":"    def _flavor_create(context, updates):"},{"line_number":446,"context_line":"        return _flavor_create(context, updates)"},{"line_number":447,"context_line":""},{"line_number":448,"context_line":"    @base.remotable"},{"line_number":449,"context_line":"    def create(self):"}],"source_content_type":"text/x-python","patch_set":17,"id":"da0c15f0_12b1f4e1","line":446,"updated":"2016-03-27 13:51:24.000000000","message":"Not entirely sure this is necessary? Why not just call the _flavor_create() module-level function below?","commit_id":"903b89ac2642fb8243e380531928ca23475c0c79"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f54dc31c1d3a52153556fc54a5515019a1a0cca3","unresolved":false,"context_lines":[{"line_number":443,"context_line":""},{"line_number":444,"context_line":"    @staticmethod"},{"line_number":445,"context_line":"    def _flavor_create(context, updates):"},{"line_number":446,"context_line":"        return _flavor_create(context, updates)"},{"line_number":447,"context_line":""},{"line_number":448,"context_line":"    @base.remotable"},{"line_number":449,"context_line":"    def create(self):"}],"source_content_type":"text/x-python","patch_set":17,"id":"da0c15f0_f0225d00","line":446,"in_reply_to":"da0c15f0_12b1f4e1","updated":"2016-03-28 14:13:19.000000000","message":"Because long-term I want them in these static methods, so that if someone needed to subclass and reimplement one of the low-level accessors, they could. Ideally the above module-level function would be in this staticmethod, but due to bugs in the oslo.db decorator and in stubout for the context manager, that\u0027s not possible right now. We have fixes for both in the pipeline, but it will be a few weeks before we will have access to them here.\n\nThus, I\u0027ve got these here so that our code and tests are written the way we want, and we can move the above down into here when the appropriate fixes land.\n\nWe\u0027ve landed the rest of the implementation like this. I\u0027d rather not put comments on each method. If you think a big block comment above is necessary then I can surely do that, or we can just leave it in the reviews here in the reviews for posterity.","commit_id":"903b89ac2642fb8243e380531928ca23475c0c79"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"9c46a78b811c4192943063e7378a6ecc74014379","unresolved":false,"context_lines":[{"line_number":545,"context_line":""},{"line_number":546,"context_line":"    @staticmethod"},{"line_number":547,"context_line":"    def _flavor_destroy(context, flavor_id\u003dNone, name\u003dNone):"},{"line_number":548,"context_line":"        return _flavor_destroy(context, flavor_id\u003dflavor_id, name\u003dname)"},{"line_number":549,"context_line":""},{"line_number":550,"context_line":"    @base.remotable"},{"line_number":551,"context_line":"    def destroy(self):"}],"source_content_type":"text/x-python","patch_set":17,"id":"da0c15f0_f2b3a0e7","line":548,"updated":"2016-03-27 13:51:24.000000000","message":"Ditto.","commit_id":"903b89ac2642fb8243e380531928ca23475c0c79"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"9c46a78b811c4192943063e7378a6ecc74014379","unresolved":false,"context_lines":[{"line_number":554,"context_line":"                self._flavor_destroy(self._context, flavor_id\u003dself.id)"},{"line_number":555,"context_line":"            else:"},{"line_number":556,"context_line":"                self._flavor_destroy(self._context, name\u003dself.name)"},{"line_number":557,"context_line":"        except exception.FlavorNotFound:"},{"line_number":558,"context_line":"            db.flavor_destroy(self._context, self.name)"},{"line_number":559,"context_line":""},{"line_number":560,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"da0c15f0_52cb6c53","line":557,"updated":"2016-03-27 13:51:24.000000000","message":"Might be good to add a comment here indicating which scenarios we get here...","commit_id":"903b89ac2642fb8243e380531928ca23475c0c79"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f54dc31c1d3a52153556fc54a5515019a1a0cca3","unresolved":false,"context_lines":[{"line_number":554,"context_line":"                self._flavor_destroy(self._context, flavor_id\u003dself.id)"},{"line_number":555,"context_line":"            else:"},{"line_number":556,"context_line":"                self._flavor_destroy(self._context, name\u003dself.name)"},{"line_number":557,"context_line":"        except exception.FlavorNotFound:"},{"line_number":558,"context_line":"            db.flavor_destroy(self._context, self.name)"},{"line_number":559,"context_line":""},{"line_number":560,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"da0c15f0_d0a0f945","line":557,"in_reply_to":"da0c15f0_52cb6c53","updated":"2016-03-28 14:13:19.000000000","message":"Yep.","commit_id":"903b89ac2642fb8243e380531928ca23475c0c79"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"143fe835755bd127151a89106d4da73a92940226","unresolved":false,"context_lines":[{"line_number":260,"context_line":""},{"line_number":261,"context_line":"        if \u0027projects\u0027 in expected_attrs:"},{"line_number":262,"context_line":"            if \u0027projects\u0027 in db_flavor:"},{"line_number":263,"context_line":"                db_flavor[\u0027projects\u0027] \u003d [x[\u0027project_id\u0027]"},{"line_number":264,"context_line":"                                         for x in db_flavor[\u0027projects\u0027]]"},{"line_number":265,"context_line":"            else:"},{"line_number":266,"context_line":"                flavor._load_projects()"}],"source_content_type":"text/x-python","patch_set":18,"id":"ba0121b8_c95fa83f","line":263,"updated":"2016-03-30 14:58:52.000000000","message":"Was this supposed to be flavor[\u0027projects\u0027] here? I\u0027m not sure what this is accomplishing otherwise.\n\nI was looking at the tests to find where this could be caught but really this code is superfluous at the moment. Only create() seems to pass \u0027projects\u0027 in expected_attrs but in that case the projects are already set on the object. We should still leave this code IMO but it\u0027s not needed right now.","commit_id":"973850880f5407203b139c87459b5db7ef4bfb3a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c0de2358f8b161fe5f8ab5a921e1ca2a2e791225","unresolved":false,"context_lines":[{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    try:"},{"line_number":153,"context_line":"        db_flavor.save(context.session)"},{"line_number":154,"context_line":"    except db_exc.DBDuplicateEntry as e:"},{"line_number":155,"context_line":"        if \u0027flavorid\u0027 in e.columns:"},{"line_number":156,"context_line":"            raise exception.FlavorIdExists(flavor_id\u003dvalues[\u0027flavorid\u0027])"},{"line_number":157,"context_line":"        raise exception.FlavorExists(name\u003dvalues[\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":20,"id":"ba0121b8_b7fb5078","line":154,"range":{"start_line":154,"start_character":18,"end_line":154,"end_character":34},"updated":"2016-04-01 01:24:37.000000000","message":"I don\u0027t see a test for this case.","commit_id":"a6cdae29374ff22da5f43aa4c28e0f99e66827e4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c0de2358f8b161fe5f8ab5a921e1ca2a2e791225","unresolved":false,"context_lines":[{"line_number":172,"context_line":"    result \u003d query.first()"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    if not result:"},{"line_number":175,"context_line":"        raise exception.FlavorNotFound(flavor_id\u003dflavor_id)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    context.session.query(api_models.FlavorProjects).\\"},{"line_number":178,"context_line":"        filter_by(flavor_id\u003dresult.id).delete()"}],"source_content_type":"text/x-python","patch_set":20,"id":"ba0121b8_57b634f9","line":175,"updated":"2016-04-01 01:24:37.000000000","message":"If flavor_id is None then name is not None and you should be raising FlavorNotFoundByName instead, like in the main DB API.","commit_id":"a6cdae29374ff22da5f43aa4c28e0f99e66827e4"}],"nova/tests/functional/db/test_flavor.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"9c46a78b811c4192943063e7378a6ecc74014379","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        # Default flavors will overlap with our id, so just query and make sure"},{"line_number":67,"context_line":"        # they are different flavors"},{"line_number":68,"context_line":"        main_flavor \u003d db.flavor_get(self.context, flavor.id)"},{"line_number":69,"context_line":"        self.assertNotEqual(flavor.name, main_flavor[\u0027name\u0027])"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def test_get_with_no_projects(self):"},{"line_number":72,"context_line":"        fields \u003d dict(fake_api_flavor, projects\u003d[])"}],"source_content_type":"text/x-python","patch_set":17,"id":"da0c15f0_329fd851","line":69,"updated":"2016-03-27 13:51:24.000000000","message":"++ good test.","commit_id":"903b89ac2642fb8243e380531928ca23475c0c79"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"9c46a78b811c4192943063e7378a6ecc74014379","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    @staticmethod"},{"line_number":130,"context_line":"    @db_api.api_context_manager.reader"},{"line_number":131,"context_line":"    def _collect_flavor_residue_api(context, flavor):"},{"line_number":132,"context_line":"        flavors \u003d context.session.query(api_models.Flavors).\\"},{"line_number":133,"context_line":"                  filter_by(id\u003dflavor.id).all()"},{"line_number":134,"context_line":"        specs \u003d context.session.query(api_models.FlavorExtraSpecs).\\"}],"source_content_type":"text/x-python","patch_set":17,"id":"da0c15f0_92aea483","line":131,"updated":"2016-03-27 13:51:24.000000000","message":"LOL, nice name :) Also possible \"_collect_flavor_aftertaste()\"","commit_id":"903b89ac2642fb8243e380531928ca23475c0c79"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f54dc31c1d3a52153556fc54a5515019a1a0cca3","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    @staticmethod"},{"line_number":130,"context_line":"    @db_api.api_context_manager.reader"},{"line_number":131,"context_line":"    def _collect_flavor_residue_api(context, flavor):"},{"line_number":132,"context_line":"        flavors \u003d context.session.query(api_models.Flavors).\\"},{"line_number":133,"context_line":"                  filter_by(id\u003dflavor.id).all()"},{"line_number":134,"context_line":"        specs \u003d context.session.query(api_models.FlavorExtraSpecs).\\"}],"source_content_type":"text/x-python","patch_set":17,"id":"da0c15f0_b0baa56c","line":131,"in_reply_to":"da0c15f0_92aea483","updated":"2016-03-28 14:13:19.000000000","message":"Next time :)","commit_id":"903b89ac2642fb8243e380531928ca23475c0c79"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"32237f1c7ceb2b41075a290eadddf233558d4261","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        flavor2 \u003d objects.Flavor.get_by_flavor_id(self.context,"},{"line_number":116,"context_line":"                                                  flavor.flavorid)"},{"line_number":117,"context_line":"        self.assertEqual({\u0027marty\u0027: \u0027mcfly\u0027}, flavor2.extra_specs)"},{"line_number":118,"context_line":"        self.assertEqual(projects, flavor2.projects)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def test_save_api(self):"},{"line_number":121,"context_line":"        flavor \u003d objects.Flavor(context\u003dself.context, **fake_api_flavor)"}],"source_content_type":"text/x-python","patch_set":19,"id":"ba0121b8_037dedb0","line":118,"updated":"2016-03-30 18:51:14.000000000","message":"This is failing in the next review. It seems the projects list creation is not stable.\n\ntesttools.matchers._impl.MismatchError: [u\u0027project2\u0027, u\u0027project1\u0027] !\u003d [u\u0027project1\u0027, u\u0027project2\u0027]","commit_id":"4dba7117a56ef043b9086353a5e549fd183016f3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a1e5dc88483da987fc1c9d3e966d22a6ee374936","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        flavor2 \u003d objects.Flavor.get_by_flavor_id(self.context,"},{"line_number":116,"context_line":"                                                  flavor.flavorid)"},{"line_number":117,"context_line":"        self.assertEqual({\u0027marty\u0027: \u0027mcfly\u0027}, flavor2.extra_specs)"},{"line_number":118,"context_line":"        self.assertEqual(projects, flavor2.projects)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def test_save_api(self):"},{"line_number":121,"context_line":"        flavor \u003d objects.Flavor(context\u003dself.context, **fake_api_flavor)"}],"source_content_type":"text/x-python","patch_set":19,"id":"ba0121b8_3e2da695","line":118,"in_reply_to":"ba0121b8_037dedb0","updated":"2016-03-30 18:53:30.000000000","message":"eff.","commit_id":"4dba7117a56ef043b9086353a5e549fd183016f3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c0de2358f8b161fe5f8ab5a921e1ca2a2e791225","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        # Make sure we find this in the API database"},{"line_number":56,"context_line":"        flavor2 \u003d objects.Flavor._flavor_get_from_db(self.context, flavor.id)"},{"line_number":57,"context_line":"        self.assertEqual(flavor.id, flavor2[\u0027id\u0027])"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        # Make sure we don\u0027t find it in the main database"},{"line_number":60,"context_line":"        self.assertRaises(exception.FlavorNotFound,"}],"source_content_type":"text/x-python","patch_set":20,"id":"ba0121b8_37e0e0cc","line":57,"updated":"2016-04-01 01:24:37.000000000","message":"Would be good to make sure the extra_specs and projects are what we expect on the created flavor from the API DB since that\u0027s extra logic in _flavor_create.","commit_id":"a6cdae29374ff22da5f43aa4c28e0f99e66827e4"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"2e48a58d80ea1fd0c93c298753813715cf82908b","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        # Make sure we find this in the API database"},{"line_number":56,"context_line":"        flavor2 \u003d objects.Flavor._flavor_get_from_db(self.context, flavor.id)"},{"line_number":57,"context_line":"        self.assertEqual(flavor.id, flavor2[\u0027id\u0027])"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        # Make sure we don\u0027t find it in the main database"},{"line_number":60,"context_line":"        self.assertRaises(exception.FlavorNotFound,"}],"source_content_type":"text/x-python","patch_set":20,"id":"ba0121b8_ada647be","line":57,"in_reply_to":"ba0121b8_37e0e0cc","updated":"2016-04-01 15:10:50.000000000","message":"I cover this in the unit tests, but I\u0027ll add something here.","commit_id":"a6cdae29374ff22da5f43aa4c28e0f99e66827e4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c0de2358f8b161fe5f8ab5a921e1ca2a2e791225","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        self.assertEqual(flavor.id, flavor2[\u0027id\u0027])"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        # Make sure we don\u0027t find it in the main database"},{"line_number":60,"context_line":"        self.assertRaises(exception.FlavorNotFound,"},{"line_number":61,"context_line":"                          db.flavor_get_by_name, self.context, flavor.name)"},{"line_number":62,"context_line":"        self.assertRaises(exception.FlavorNotFound,"},{"line_number":63,"context_line":"                          db.flavor_get_by_flavor_id, self.context,"}],"source_content_type":"text/x-python","patch_set":20,"id":"ba0121b8_97a1ec96","line":60,"range":{"start_line":60,"start_character":36,"end_line":60,"end_character":50},"updated":"2016-04-01 01:24:37.000000000","message":"Specifically FlavorNotFoundByName but FlavorNotFoundByName extends FlavorNotFound so that\u0027s why this works.","commit_id":"a6cdae29374ff22da5f43aa4c28e0f99e66827e4"}]}
