)]}'
{"nova/objects/flavor.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"fba9adeb916a6e893bb1ea5d86923df3e7b584b1","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        \u0027vcpus\u0027: fields.IntegerField(),"},{"line_number":32,"context_line":"        \u0027root_gb\u0027: fields.IntegerField(),"},{"line_number":33,"context_line":"        \u0027ephemeral_gb\u0027: fields.IntegerField(),"},{"line_number":34,"context_line":"        \u0027flavorid\u0027: fields.StringField(),"},{"line_number":35,"context_line":"        \u0027swap\u0027: fields.IntegerField(),"},{"line_number":36,"context_line":"        \u0027rxtx_factor\u0027: fields.FloatField(nullable\u003dTrue, default\u003d1.0),"},{"line_number":37,"context_line":"        \u0027vcpu_weight\u0027: fields.IntegerField(),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2B%2FTk%3D","line":34,"updated":"2013-11-16 07:31:21.000000000","message":"this is a uuid - how about we call it flavoruuid? or uuid? all of the names are confusing - id, name, flavorid","commit_id":"bc65ae6b38465f0dcfeace71aad49e95728680ab"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ad55f98b009a065ff60221928275af0466ff3944","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        \u0027vcpus\u0027: fields.IntegerField(),"},{"line_number":32,"context_line":"        \u0027root_gb\u0027: fields.IntegerField(),"},{"line_number":33,"context_line":"        \u0027ephemeral_gb\u0027: fields.IntegerField(),"},{"line_number":34,"context_line":"        \u0027flavorid\u0027: fields.StringField(),"},{"line_number":35,"context_line":"        \u0027swap\u0027: fields.IntegerField(),"},{"line_number":36,"context_line":"        \u0027rxtx_factor\u0027: fields.FloatField(nullable\u003dTrue, default\u003d1.0),"},{"line_number":37,"context_line":"        \u0027vcpu_weight\u0027: fields.IntegerField(),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2B4b8%3D","line":34,"in_reply_to":"AAAATn%2F%2B%2FTk%3D","updated":"2013-11-19 01:00:00.000000000","message":"I agree, but it\u0027s used pretty extensively in the code and I\u0027m not sure it matters that much. If others feel strongly, then we could do that.","commit_id":"bc65ae6b38465f0dcfeace71aad49e95728680ab"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"fba9adeb916a6e893bb1ea5d86923df3e7b584b1","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        \u0027ephemeral_gb\u0027: fields.IntegerField(),"},{"line_number":34,"context_line":"        \u0027flavorid\u0027: fields.StringField(),"},{"line_number":35,"context_line":"        \u0027swap\u0027: fields.IntegerField(),"},{"line_number":36,"context_line":"        \u0027rxtx_factor\u0027: fields.FloatField(nullable\u003dTrue, default\u003d1.0),"},{"line_number":37,"context_line":"        \u0027vcpu_weight\u0027: fields.IntegerField(),"},{"line_number":38,"context_line":"        \u0027disabled\u0027: fields.BooleanField(),"},{"line_number":39,"context_line":"        \u0027is_public\u0027: fields.BooleanField(),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2B%2FUA%3D","line":36,"updated":"2013-11-16 07:31:21.000000000","message":"was there talk of removing this? maybe that was just related to the v3 api.","commit_id":"bc65ae6b38465f0dcfeace71aad49e95728680ab"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ad55f98b009a065ff60221928275af0466ff3944","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        \u0027ephemeral_gb\u0027: fields.IntegerField(),"},{"line_number":34,"context_line":"        \u0027flavorid\u0027: fields.StringField(),"},{"line_number":35,"context_line":"        \u0027swap\u0027: fields.IntegerField(),"},{"line_number":36,"context_line":"        \u0027rxtx_factor\u0027: fields.FloatField(nullable\u003dTrue, default\u003d1.0),"},{"line_number":37,"context_line":"        \u0027vcpu_weight\u0027: fields.IntegerField(),"},{"line_number":38,"context_line":"        \u0027disabled\u0027: fields.BooleanField(),"},{"line_number":39,"context_line":"        \u0027is_public\u0027: fields.BooleanField(),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2B4bw%3D","line":36,"in_reply_to":"AAAATn%2F%2B%2FUA%3D","updated":"2013-11-19 01:00:00.000000000","message":"Hmm? This is a xenism actually.","commit_id":"bc65ae6b38465f0dcfeace71aad49e95728680ab"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"5b2d67b4502f01cb42f9def4353da5186050aa1d","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        \u0027vcpus\u0027: fields.IntegerField(),"},{"line_number":32,"context_line":"        \u0027root_gb\u0027: fields.IntegerField(),"},{"line_number":33,"context_line":"        \u0027ephemeral_gb\u0027: fields.IntegerField(),"},{"line_number":34,"context_line":"        \u0027flavorid\u0027: fields.StringField(),"},{"line_number":35,"context_line":"        \u0027swap\u0027: fields.IntegerField(),"},{"line_number":36,"context_line":"        \u0027rxtx_factor\u0027: fields.FloatField(nullable\u003dTrue, default\u003d1.0),"},{"line_number":37,"context_line":"        \u0027vcpu_weight\u0027: fields.IntegerField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2Bzak%3D","line":34,"updated":"2013-11-19 23:28:42.000000000","message":"Hm, the sqlalchemy model doesn\u0027t have a nullable\u003dFalse on the above 3 (root_gb thru flavorid)... so I think we need nullable\u003dTrue?   Although I can\u0027t see how a NULL flavorid would actually work... so maybe that one is okay.","commit_id":"4f2fea5097287a8906006dde6d5561419767cb5d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"59d07c8f49f67873c34f1fb153185a4d0cacaac8","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        \u0027vcpus\u0027: fields.IntegerField(),"},{"line_number":32,"context_line":"        \u0027root_gb\u0027: fields.IntegerField(),"},{"line_number":33,"context_line":"        \u0027ephemeral_gb\u0027: fields.IntegerField(),"},{"line_number":34,"context_line":"        \u0027flavorid\u0027: fields.StringField(),"},{"line_number":35,"context_line":"        \u0027swap\u0027: fields.IntegerField(),"},{"line_number":36,"context_line":"        \u0027rxtx_factor\u0027: fields.FloatField(nullable\u003dTrue, default\u003d1.0),"},{"line_number":37,"context_line":"        \u0027vcpu_weight\u0027: fields.IntegerField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2Br%2B4%3D","line":34,"in_reply_to":"AAAATn%2F%2Bzak%3D","updated":"2013-11-21 14:52:59.000000000","message":"Yeah, flavorid is really required. I don\u0027t really understand how the others make any sense to be nullable either and haven\u0027t come across any examples yet.","commit_id":"4f2fea5097287a8906006dde6d5561419767cb5d"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"5b2d67b4502f01cb42f9def4353da5186050aa1d","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                continue"},{"line_number":51,"context_line":"            value \u003d db_flavor[name]"},{"line_number":52,"context_line":"            if isinstance(field, fields.IntegerField):"},{"line_number":53,"context_line":"                value \u003d value if value is not None else 0"},{"line_number":54,"context_line":"            flavor[name] \u003d value"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        if \u0027extra_specs\u0027 in expected_attrs:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2BzaM%3D","line":53,"updated":"2013-11-19 23:28:42.000000000","message":"Ah, I guess you\u0027re covering for my above comment here... ?","commit_id":"4f2fea5097287a8906006dde6d5561419767cb5d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"59d07c8f49f67873c34f1fb153185a4d0cacaac8","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                continue"},{"line_number":51,"context_line":"            value \u003d db_flavor[name]"},{"line_number":52,"context_line":"            if isinstance(field, fields.IntegerField):"},{"line_number":53,"context_line":"                value \u003d value if value is not None else 0"},{"line_number":54,"context_line":"            flavor[name] \u003d value"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        if \u0027extra_specs\u0027 in expected_attrs:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2Br%2Bc%3D","line":53,"in_reply_to":"AAAATn%2F%2BzaM%3D","updated":"2013-11-21 14:52:59.000000000","message":"Right, I was just trying to simplify things a little bit so that we can rely on some consistent behavior going forward. I really don\u0027t understand the reasoning behind \"everything is nullable\" and it makes our tests sloppy in a lot of places. If there\u0027s a good reason, then that\u0027s fine, but I don\u0027t know what it is :)","commit_id":"4f2fea5097287a8906006dde6d5561419767cb5d"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"5b2d67b4502f01cb42f9def4353da5186050aa1d","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        projects \u003d updates.pop(\u0027projects\u0027, [])"},{"line_number":110,"context_line":"        db_flavor \u003d db.flavor_create(context, updates)"},{"line_number":111,"context_line":"        for project_id in projects:"},{"line_number":112,"context_line":"            db.flavor_access_add(context, db_flavor[\u0027flavorid\u0027], project_id)"},{"line_number":113,"context_line":"        self._from_db_object(context, self, db_flavor,"},{"line_number":114,"context_line":"                             expected_attrs\u003dexpected_attrs)"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2BzaI%3D","line":112,"updated":"2013-11-19 23:28:42.000000000","message":"I\u0027m guessing this race exists in the current code... seems like these should be done under a DB transaction otherwise you end up with a split second where all projects can access the flavor?","commit_id":"4f2fea5097287a8906006dde6d5561419767cb5d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"59d07c8f49f67873c34f1fb153185a4d0cacaac8","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        projects \u003d updates.pop(\u0027projects\u0027, [])"},{"line_number":110,"context_line":"        db_flavor \u003d db.flavor_create(context, updates)"},{"line_number":111,"context_line":"        for project_id in projects:"},{"line_number":112,"context_line":"            db.flavor_access_add(context, db_flavor[\u0027flavorid\u0027], project_id)"},{"line_number":113,"context_line":"        self._from_db_object(context, self, db_flavor,"},{"line_number":114,"context_line":"                             expected_attrs\u003dexpected_attrs)"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2Br%2BI%3D","line":112,"in_reply_to":"AAAATn%2F%2BzaI%3D","updated":"2013-11-21 14:52:59.000000000","message":"See below","commit_id":"4f2fea5097287a8906006dde6d5561419767cb5d"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"5b2d67b4502f01cb42f9def4353da5186050aa1d","unresolved":false,"context_lines":[{"line_number":127,"context_line":"                                                   extra_specs)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        # NOTE(danms): This could be much simpler and more efficient"},{"line_number":130,"context_line":"        # with a smarter flavor_access_update() method in db_api."},{"line_number":131,"context_line":"        if projects is not None:"},{"line_number":132,"context_line":"            current_projects \u003d [x[\u0027project_id\u0027]"},{"line_number":133,"context_line":"                                for x in db.flavor_access_get_by_flavor_id("}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2BzZ8%3D","line":130,"updated":"2013-11-19 23:28:42.000000000","message":"Hm yeah... :)  Should also be done under a transaction, IMO.","commit_id":"4f2fea5097287a8906006dde6d5561419767cb5d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"59d07c8f49f67873c34f1fb153185a4d0cacaac8","unresolved":false,"context_lines":[{"line_number":127,"context_line":"                                                   extra_specs)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        # NOTE(danms): This could be much simpler and more efficient"},{"line_number":130,"context_line":"        # with a smarter flavor_access_update() method in db_api."},{"line_number":131,"context_line":"        if projects is not None:"},{"line_number":132,"context_line":"            current_projects \u003d [x[\u0027project_id\u0027]"},{"line_number":133,"context_line":"                                for x in db.flavor_access_get_by_flavor_id("}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2Br9w%3D","line":130,"in_reply_to":"AAAATn%2F%2BzZ8%3D","updated":"2013-11-21 14:52:59.000000000","message":"Yeah, mostly because I was just punting on this, but it sounds like I should go ahead and write that other function to do what I want under a transaction. Then when we move things from db/api to here natively, it will just be moving that function here I think.","commit_id":"4f2fea5097287a8906006dde6d5561419767cb5d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cb8757cf06235542cadc7edc13efa0ba59004b33","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        \u0027disabled\u0027: fields.BooleanField(),"},{"line_number":39,"context_line":"        \u0027is_public\u0027: fields.BooleanField(),"},{"line_number":40,"context_line":"        \u0027extra_specs\u0027: fields.DictOfStringsField(),"},{"line_number":41,"context_line":"        \u0027projects\u0027: fields.ListOfStringsField(),"},{"line_number":42,"context_line":"        }"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F95Jc%3D","line":41,"updated":"2013-12-04 20:25:19.000000000","message":"nit: this is really project_ids, but you\u0027d have to change it in a lot of places so not considering it a big deal - would make it more readable though.","commit_id":"be174282443a7871bdb3ee50cde5a06340023e1c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cb8757cf06235542cadc7edc13efa0ba59004b33","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                continue"},{"line_number":51,"context_line":"            value \u003d db_flavor[name]"},{"line_number":52,"context_line":"            if isinstance(field, fields.IntegerField):"},{"line_number":53,"context_line":"                value \u003d value if value is not None else 0"},{"line_number":54,"context_line":"            flavor[name] \u003d value"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        if \u0027extra_specs\u0027 in expected_attrs:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F95Ls%3D","line":53,"updated":"2013-12-04 20:25:19.000000000","message":"I probably just don\u0027t understand this, but would it also make sense to set the default to 0 on the IntegerField types in fields?","commit_id":"be174282443a7871bdb3ee50cde5a06340023e1c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b1896d56f7fcb4fcb869113124c17c0ebc9aaa90","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                continue"},{"line_number":51,"context_line":"            value \u003d db_flavor[name]"},{"line_number":52,"context_line":"            if isinstance(field, fields.IntegerField):"},{"line_number":53,"context_line":"                value \u003d value if value is not None else 0"},{"line_number":54,"context_line":"            flavor[name] \u003d value"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        if \u0027extra_specs\u0027 in expected_attrs:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F94Oc%3D","line":53,"in_reply_to":"AAAATn%2F94ls%3D","updated":"2013-12-04 23:28:36.000000000","message":"OK, makes sense.","commit_id":"be174282443a7871bdb3ee50cde5a06340023e1c"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"61275244a47cfc8a1012c9bfc5fdb3763388af5c","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                continue"},{"line_number":51,"context_line":"            value \u003d db_flavor[name]"},{"line_number":52,"context_line":"            if isinstance(field, fields.IntegerField):"},{"line_number":53,"context_line":"                value \u003d value if value is not None else 0"},{"line_number":54,"context_line":"            flavor[name] \u003d value"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        if \u0027extra_specs\u0027 in expected_attrs:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F94ls%3D","line":53,"in_reply_to":"AAAATn%2F95Ls%3D","updated":"2013-12-04 21:54:08.000000000","message":"Setting the default in the field requires that they be nullable, which I don\u0027t want. None of them are actually optional. So, this is actually a load-time database migration to get us to a sane state and then we could remove the nullability on the column later.","commit_id":"be174282443a7871bdb3ee50cde5a06340023e1c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cb8757cf06235542cadc7edc13efa0ba59004b33","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                                                           self.flavorid)]"},{"line_number":71,"context_line":"        self.obj_reset_changes(\u0027projects\u0027)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def obj_load_attr(self, attrname):"},{"line_number":74,"context_line":"        # NOTE(danms): Only projects could be lazy-loaded right now"},{"line_number":75,"context_line":"        if attrname !\u003d \u0027projects\u0027:"},{"line_number":76,"context_line":"            raise exception.ObjectActionError("}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F949k%3D","line":73,"updated":"2013-12-04 20:25:19.000000000","message":"Don\u0027t see a test for this, should be easy to write a negative test that passing in \u0027foo\u0027 or something and asserts the ObjectActionError.","commit_id":"be174282443a7871bdb3ee50cde5a06340023e1c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b1896d56f7fcb4fcb869113124c17c0ebc9aaa90","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                                                           self.flavorid)]"},{"line_number":71,"context_line":"        self.obj_reset_changes(\u0027projects\u0027)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def obj_load_attr(self, attrname):"},{"line_number":74,"context_line":"        # NOTE(danms): Only projects could be lazy-loaded right now"},{"line_number":75,"context_line":"        if attrname !\u003d \u0027projects\u0027:"},{"line_number":76,"context_line":"            raise exception.ObjectActionError("}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F94OU%3D","line":73,"in_reply_to":"AAAATn%2F949k%3D","updated":"2013-12-04 23:28:36.000000000","message":"See that you added test_load_anything_else to cover this, thanks.","commit_id":"be174282443a7871bdb3ee50cde5a06340023e1c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cb8757cf06235542cadc7edc13efa0ba59004b33","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    @base.remotable"},{"line_number":101,"context_line":"    def add_access(self, context, project_id):"},{"line_number":102,"context_line":"        if \u0027projects\u0027 in self.obj_what_changed():"},{"line_number":103,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027add_access\u0027,"},{"line_number":104,"context_line":"                                              reason\u003d\u0027projects modified\u0027)"},{"line_number":105,"context_line":"        db.flavor_access_add(context, self.flavorid, project_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F95Ic%3D","line":102,"updated":"2013-12-04 20:25:19.000000000","message":"Just to confirm my understanding, is this to make it like a mutex, i.e. can\u0027t add access while another operation hasn\u0027t saved the state yet?","commit_id":"be174282443a7871bdb3ee50cde5a06340023e1c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b1896d56f7fcb4fcb869113124c17c0ebc9aaa90","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    @base.remotable"},{"line_number":101,"context_line":"    def add_access(self, context, project_id):"},{"line_number":102,"context_line":"        if \u0027projects\u0027 in self.obj_what_changed():"},{"line_number":103,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027add_access\u0027,"},{"line_number":104,"context_line":"                                              reason\u003d\u0027projects modified\u0027)"},{"line_number":105,"context_line":"        db.flavor_access_add(context, self.flavorid, project_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F94Ms%3D","line":102,"in_reply_to":"AAAATn%2F94zw%3D","updated":"2013-12-04 23:28:36.000000000","message":"Ahh, good idea.","commit_id":"be174282443a7871bdb3ee50cde5a06340023e1c"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"61275244a47cfc8a1012c9bfc5fdb3763388af5c","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    @base.remotable"},{"line_number":101,"context_line":"    def add_access(self, context, project_id):"},{"line_number":102,"context_line":"        if \u0027projects\u0027 in self.obj_what_changed():"},{"line_number":103,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027add_access\u0027,"},{"line_number":104,"context_line":"                                              reason\u003d\u0027projects modified\u0027)"},{"line_number":105,"context_line":"        db.flavor_access_add(context, self.flavorid, project_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F94zw%3D","line":102,"in_reply_to":"AAAATn%2F95Ic%3D","updated":"2013-12-04 21:54:08.000000000","message":"No, it\u0027s to enforce that projects need to be added via add_access() and not by manipulating the projects list directly.","commit_id":"be174282443a7871bdb3ee50cde5a06340023e1c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cb8757cf06235542cadc7edc13efa0ba59004b33","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    @base.remotable"},{"line_number":101,"context_line":"    def add_access(self, context, project_id):"},{"line_number":102,"context_line":"        if \u0027projects\u0027 in self.obj_what_changed():"},{"line_number":103,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027add_access\u0027,"},{"line_number":104,"context_line":"                                              reason\u003d\u0027projects modified\u0027)"},{"line_number":105,"context_line":"        db.flavor_access_add(context, self.flavorid, project_id)"},{"line_number":106,"context_line":"        self.projects \u003d [x[\u0027project_id\u0027] for x in"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F949g%3D","line":103,"updated":"2013-12-04 20:25:19.000000000","message":"Is there a way to test this?","commit_id":"be174282443a7871bdb3ee50cde5a06340023e1c"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"61275244a47cfc8a1012c9bfc5fdb3763388af5c","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    @base.remotable"},{"line_number":101,"context_line":"    def add_access(self, context, project_id):"},{"line_number":102,"context_line":"        if \u0027projects\u0027 in self.obj_what_changed():"},{"line_number":103,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027add_access\u0027,"},{"line_number":104,"context_line":"                                              reason\u003d\u0027projects modified\u0027)"},{"line_number":105,"context_line":"        db.flavor_access_add(context, self.flavorid, project_id)"},{"line_number":106,"context_line":"        self.projects \u003d [x[\u0027project_id\u0027] for x in"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F94zQ%3D","line":103,"in_reply_to":"AAAATn%2F949g%3D","updated":"2013-12-04 21:54:08.000000000","message":"Yes.","commit_id":"be174282443a7871bdb3ee50cde5a06340023e1c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b1896d56f7fcb4fcb869113124c17c0ebc9aaa90","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    @base.remotable"},{"line_number":101,"context_line":"    def add_access(self, context, project_id):"},{"line_number":102,"context_line":"        if \u0027projects\u0027 in self.obj_what_changed():"},{"line_number":103,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027add_access\u0027,"},{"line_number":104,"context_line":"                                              reason\u003d\u0027projects modified\u0027)"},{"line_number":105,"context_line":"        db.flavor_access_add(context, self.flavorid, project_id)"},{"line_number":106,"context_line":"        self.projects \u003d [x[\u0027project_id\u0027] for x in"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F94M4%3D","line":103,"in_reply_to":"AAAATn%2F94zQ%3D","updated":"2013-12-04 23:28:36.000000000","message":"Covered with test_add_access_with_dirty_projects, thanks.","commit_id":"be174282443a7871bdb3ee50cde5a06340023e1c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cb8757cf06235542cadc7edc13efa0ba59004b33","unresolved":false,"context_lines":[{"line_number":103,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027add_access\u0027,"},{"line_number":104,"context_line":"                                              reason\u003d\u0027projects modified\u0027)"},{"line_number":105,"context_line":"        db.flavor_access_add(context, self.flavorid, project_id)"},{"line_number":106,"context_line":"        self.projects \u003d [x[\u0027project_id\u0027] for x in"},{"line_number":107,"context_line":"                         db.flavor_access_get_by_flavor_id(context,"},{"line_number":108,"context_line":"                                                           self.flavorid)]"},{"line_number":109,"context_line":"        self.obj_reset_changes()"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F95GQ%3D","line":106,"updated":"2013-12-04 20:25:19.000000000","message":"Call self._load_projects here to avoid copy/paste?","commit_id":"be174282443a7871bdb3ee50cde5a06340023e1c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cb8757cf06235542cadc7edc13efa0ba59004b33","unresolved":false,"context_lines":[{"line_number":111,"context_line":"    @base.remotable"},{"line_number":112,"context_line":"    def remove_access(self, context, project_id):"},{"line_number":113,"context_line":"        if \u0027projects\u0027 in self.obj_what_changed():"},{"line_number":114,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027add_access\u0027,"},{"line_number":115,"context_line":"                                              reason\u003d\u0027projects modified\u0027)"},{"line_number":116,"context_line":"        db.flavor_access_remove(context, self.flavorid, project_id)"},{"line_number":117,"context_line":"        self.projects \u003d [x[\u0027project_id\u0027] for x in"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F95Io%3D","line":114,"updated":"2013-12-04 20:25:19.000000000","message":"action should be \u0027remove_access\u0027, also, is there a way to test this condition?","commit_id":"be174282443a7871bdb3ee50cde5a06340023e1c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cb8757cf06235542cadc7edc13efa0ba59004b33","unresolved":false,"context_lines":[{"line_number":114,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027add_access\u0027,"},{"line_number":115,"context_line":"                                              reason\u003d\u0027projects modified\u0027)"},{"line_number":116,"context_line":"        db.flavor_access_remove(context, self.flavorid, project_id)"},{"line_number":117,"context_line":"        self.projects \u003d [x[\u0027project_id\u0027] for x in"},{"line_number":118,"context_line":"                         db.flavor_access_get_by_flavor_id(context,"},{"line_number":119,"context_line":"                                                           self.flavorid)]"},{"line_number":120,"context_line":"        self.obj_reset_changes()"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F95GY%3D","line":117,"updated":"2013-12-04 20:25:19.000000000","message":"Call self._load_projects here to avoid copy/paste?","commit_id":"be174282443a7871bdb3ee50cde5a06340023e1c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cb8757cf06235542cadc7edc13efa0ba59004b33","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    @base.remotable"},{"line_number":123,"context_line":"    def create(self, context):"},{"line_number":124,"context_line":"        if self.obj_attr_is_set(\u0027id\u0027):"},{"line_number":125,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027create\u0027,"},{"line_number":126,"context_line":"                                              reason\u003d\u0027already created\u0027)"},{"line_number":127,"context_line":"        updates \u003d self.obj_get_changes()"},{"line_number":128,"context_line":"        expected_attrs \u003d []"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F948o%3D","line":125,"updated":"2013-12-04 20:25:19.000000000","message":"Should have a simple negative test for this?\n\nflavor.id \u003d 1\n\nflavor.create(context)\n\nkaboom!","commit_id":"be174282443a7871bdb3ee50cde5a06340023e1c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b1896d56f7fcb4fcb869113124c17c0ebc9aaa90","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    @base.remotable"},{"line_number":123,"context_line":"    def create(self, context):"},{"line_number":124,"context_line":"        if self.obj_attr_is_set(\u0027id\u0027):"},{"line_number":125,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027create\u0027,"},{"line_number":126,"context_line":"                                              reason\u003d\u0027already created\u0027)"},{"line_number":127,"context_line":"        updates \u003d self.obj_get_changes()"},{"line_number":128,"context_line":"        expected_attrs \u003d []"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F94II%3D","line":125,"in_reply_to":"AAAATn%2F948o%3D","updated":"2013-12-04 23:28:36.000000000","message":"Covered with test_create_with_id, thanks.","commit_id":"be174282443a7871bdb3ee50cde5a06340023e1c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cb8757cf06235542cadc7edc13efa0ba59004b33","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        expected_attrs \u003d []"},{"line_number":129,"context_line":"        if \u0027extra_specs\u0027 in updates:"},{"line_number":130,"context_line":"            expected_attrs \u003d [\u0027extra_specs\u0027]"},{"line_number":131,"context_line":"        projects \u003d updates.pop(\u0027projects\u0027, [])"},{"line_number":132,"context_line":"        db_flavor \u003d db.flavor_create(context, updates, projects\u003dprojects)"},{"line_number":133,"context_line":"        self._from_db_object(context, self, db_flavor,"},{"line_number":134,"context_line":"                             expected_attrs\u003dexpected_attrs)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F95G8%3D","line":131,"updated":"2013-12-04 20:25:19.000000000","message":"If projects is set, should expected_attrs contain \u0027projects\u0027 also?","commit_id":"be174282443a7871bdb3ee50cde5a06340023e1c"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"61275244a47cfc8a1012c9bfc5fdb3763388af5c","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        expected_attrs \u003d []"},{"line_number":129,"context_line":"        if \u0027extra_specs\u0027 in updates:"},{"line_number":130,"context_line":"            expected_attrs \u003d [\u0027extra_specs\u0027]"},{"line_number":131,"context_line":"        projects \u003d updates.pop(\u0027projects\u0027, [])"},{"line_number":132,"context_line":"        db_flavor \u003d db.flavor_create(context, updates, projects\u003dprojects)"},{"line_number":133,"context_line":"        self._from_db_object(context, self, db_flavor,"},{"line_number":134,"context_line":"                             expected_attrs\u003dexpected_attrs)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F94xQ%3D","line":131,"in_reply_to":"AAAATn%2F95G8%3D","updated":"2013-12-04 21:54:08.000000000","message":"Yes.","commit_id":"be174282443a7871bdb3ee50cde5a06340023e1c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cb8757cf06235542cadc7edc13efa0ba59004b33","unresolved":false,"context_lines":[{"line_number":130,"context_line":"            expected_attrs \u003d [\u0027extra_specs\u0027]"},{"line_number":131,"context_line":"        projects \u003d updates.pop(\u0027projects\u0027, [])"},{"line_number":132,"context_line":"        db_flavor \u003d db.flavor_create(context, updates, projects\u003dprojects)"},{"line_number":133,"context_line":"        self._from_db_object(context, self, db_flavor,"},{"line_number":134,"context_line":"                             expected_attrs\u003dexpected_attrs)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    @base.remotable"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F95AY%3D","line":133,"updated":"2013-12-04 20:25:19.000000000","message":"Should this return the flavor object that was created? If not, and \u0027projects\u0027 isn\u0027t in expected_attrs, then does flavor.projects get lost after calling create()?","commit_id":"be174282443a7871bdb3ee50cde5a06340023e1c"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"61275244a47cfc8a1012c9bfc5fdb3763388af5c","unresolved":false,"context_lines":[{"line_number":130,"context_line":"            expected_attrs \u003d [\u0027extra_specs\u0027]"},{"line_number":131,"context_line":"        projects \u003d updates.pop(\u0027projects\u0027, [])"},{"line_number":132,"context_line":"        db_flavor \u003d db.flavor_create(context, updates, projects\u003dprojects)"},{"line_number":133,"context_line":"        self._from_db_object(context, self, db_flavor,"},{"line_number":134,"context_line":"                             expected_attrs\u003dexpected_attrs)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    @base.remotable"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F94xM%3D","line":133,"in_reply_to":"AAAATn%2F95AY%3D","updated":"2013-12-04 21:54:08.000000000","message":"No, it\u0027s an object method so it shouldn\u0027t return the object.","commit_id":"be174282443a7871bdb3ee50cde5a06340023e1c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cb8757cf06235542cadc7edc13efa0ba59004b33","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        projects \u003d updates.pop(\u0027projects\u0027, None)"},{"line_number":140,"context_line":"        extra_specs \u003d updates.pop(\u0027extra_specs\u0027, None)"},{"line_number":141,"context_line":"        if updates:"},{"line_number":142,"context_line":"            raise exception.ObjectActionError("},{"line_number":143,"context_line":"                action\u003d\u0027save\u0027, reason\u003d\u0027read-only fields were changed\u0027)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        if extra_specs:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F947Y%3D","line":142,"updated":"2013-12-04 20:25:19.000000000","message":"Any way to test this?","commit_id":"be174282443a7871bdb3ee50cde5a06340023e1c"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"61275244a47cfc8a1012c9bfc5fdb3763388af5c","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        projects \u003d updates.pop(\u0027projects\u0027, None)"},{"line_number":140,"context_line":"        extra_specs \u003d updates.pop(\u0027extra_specs\u0027, None)"},{"line_number":141,"context_line":"        if updates:"},{"line_number":142,"context_line":"            raise exception.ObjectActionError("},{"line_number":143,"context_line":"                action\u003d\u0027save\u0027, reason\u003d\u0027read-only fields were changed\u0027)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        if extra_specs:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F94xA%3D","line":142,"in_reply_to":"AAAATn%2F947Y%3D","updated":"2013-12-04 21:54:08.000000000","message":"Yes, and it is. See test_save_invalid_fields().","commit_id":"be174282443a7871bdb3ee50cde5a06340023e1c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cb8757cf06235542cadc7edc13efa0ba59004b33","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        # NOTE(danms): This could be much simpler and more efficient"},{"line_number":150,"context_line":"        # with a smarter flavor_access_update() method in db_api."},{"line_number":151,"context_line":"        if projects is not None:"},{"line_number":152,"context_line":"            current_projects \u003d [x[\u0027project_id\u0027]"},{"line_number":153,"context_line":"                                for x in db.flavor_access_get_by_flavor_id("},{"line_number":154,"context_line":"                                    context, self.flavorid)]"},{"line_number":155,"context_line":"            for project_id in projects:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F95GM%3D","line":152,"updated":"2013-12-04 20:25:19.000000000","message":"nit: making current_projects a set should be faster for the \u0027in\u0027 check on 156 but it\u0027s probably not noticeable, and then you\u0027d lose any perf gain by iterating over it on 160, so probably a wash.","commit_id":"be174282443a7871bdb3ee50cde5a06340023e1c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"321c433329235451507720a04f09e6407b88d31a","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                                              reason\u003d\u0027already created\u0027)"},{"line_number":121,"context_line":"        updates \u003d self.obj_get_changes()"},{"line_number":122,"context_line":"        expected_attrs \u003d []"},{"line_number":123,"context_line":"        for attr in [\u0027extra_specs\u0027, \u0027projects\u0027]:"},{"line_number":124,"context_line":"            if attr in updates:"},{"line_number":125,"context_line":"                expected_attrs.append(attr)"},{"line_number":126,"context_line":"        projects \u003d updates.pop(\u0027projects\u0027, [])"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F94GM%3D","line":123,"updated":"2013-12-04 23:31:24.000000000","message":"Why not iterate over OPTIONAL_FIELDS here?","commit_id":"3faaf8716e3d8b44c140c728dc20102a79749271"}],"nova/tests/objects/test_flavor.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"fba9adeb916a6e893bb1ea5d86923df3e7b584b1","unresolved":false,"context_lines":[{"line_number":175,"context_line":""},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"class _TestFlavorList(object):"},{"line_number":178,"context_line":"    def test_get_all(self):"},{"line_number":179,"context_line":"        with mock.patch.object(db, \u0027flavor_get_all\u0027) as get_all:"},{"line_number":180,"context_line":"            get_all.return_value \u003d [fake_flavor]"},{"line_number":181,"context_line":"            flavors \u003d flavor_obj.FlavorList.get_all(self.context)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2B%2FTg%3D","line":178,"updated":"2013-11-16 07:31:21.000000000","message":"would it be possible to test this with some filters?","commit_id":"bc65ae6b38465f0dcfeace71aad49e95728680ab"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ad55f98b009a065ff60221928275af0466ff3944","unresolved":false,"context_lines":[{"line_number":175,"context_line":""},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"class _TestFlavorList(object):"},{"line_number":178,"context_line":"    def test_get_all(self):"},{"line_number":179,"context_line":"        with mock.patch.object(db, \u0027flavor_get_all\u0027) as get_all:"},{"line_number":180,"context_line":"            get_all.return_value \u003d [fake_flavor]"},{"line_number":181,"context_line":"            flavors \u003d flavor_obj.FlavorList.get_all(self.context)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2B4bE%3D","line":178,"in_reply_to":"AAAATn%2F%2B%2FTg%3D","updated":"2013-11-19 01:00:00.000000000","message":"Heh, yeah I should.","commit_id":"bc65ae6b38465f0dcfeace71aad49e95728680ab"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cb8757cf06235542cadc7edc13efa0ba59004b33","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        flavor \u003d flavor_obj.Flavor(context\u003delevated, flavorid\u003d\u0027123\u0027)"},{"line_number":73,"context_line":"        with mock.patch.object(db, \u0027flavor_access_add\u0027) as add:"},{"line_number":74,"context_line":"            flavor.add_access(\u0027456\u0027)"},{"line_number":75,"context_line":"            add.assert_called_with(elevated, \u0027123\u0027, \u0027456\u0027)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def test_remove_access(self):"},{"line_number":78,"context_line":"        elevated \u003d self.context.elevated()"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F95Ds%3D","line":75,"updated":"2013-12-04 20:25:19.000000000","message":"Probably more robust to use assert_called_once_with (applies throughout where assert_called_with is used).","commit_id":"be174282443a7871bdb3ee50cde5a06340023e1c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cb8757cf06235542cadc7edc13efa0ba59004b33","unresolved":false,"context_lines":[{"line_number":170,"context_line":"            destroy.assert_called_with(self.context, flavor.name)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def test_load_projects(self):"},{"line_number":173,"context_line":"        flavor \u003d flavor_obj.Flavor(flavorid\u003d\u0027foo\u0027)"},{"line_number":174,"context_line":"        flavor._context \u003d self.context"},{"line_number":175,"context_line":"        with mock.patch.object(db, \u0027flavor_access_get_by_flavor_id\u0027) as get:"},{"line_number":176,"context_line":"            get.return_value \u003d [{\u0027project_id\u0027: \u0027project-1\u0027}]"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F94%2BU%3D","line":173,"updated":"2013-12-04 20:25:19.000000000","message":"In test_add_access and test_remove_access you create the Flavor object by passing in an elevated context, why not here?","commit_id":"be174282443a7871bdb3ee50cde5a06340023e1c"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"61275244a47cfc8a1012c9bfc5fdb3763388af5c","unresolved":false,"context_lines":[{"line_number":170,"context_line":"            destroy.assert_called_with(self.context, flavor.name)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def test_load_projects(self):"},{"line_number":173,"context_line":"        flavor \u003d flavor_obj.Flavor(flavorid\u003d\u0027foo\u0027)"},{"line_number":174,"context_line":"        flavor._context \u003d self.context"},{"line_number":175,"context_line":"        with mock.patch.object(db, \u0027flavor_access_get_by_flavor_id\u0027) as get:"},{"line_number":176,"context_line":"            get.return_value \u003d [{\u0027project_id\u0027: \u0027project-1\u0027}]"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F94m4%3D","line":173,"in_reply_to":"AAAATn%2F94%2BU%3D","updated":"2013-12-04 21:54:08.000000000","message":"Because those end up calling flavor_access_get_by_flavor_id() unstubbed before the add. This stubs out the only thing it hits, and so it\u0027s not necessary here.","commit_id":"be174282443a7871bdb3ee50cde5a06340023e1c"}]}
