)]}'
{"nova/object/instance.py":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"5fd44c95584d2cc489d0d572e10f89e6d55a6219","unresolved":false,"context_lines":[{"line_number":28,"context_line":"CONF \u003d cfg.CONF"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def datetime_or_none(dt):"},{"line_number":32,"context_line":"    if dt is None or isinstance(dt, datetime.datetime):"},{"line_number":33,"context_line":"        return dt"},{"line_number":34,"context_line":"    raise ValueError(\u0027A datetime.datetime is required here\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2FzAI%3D","line":31,"updated":"2013-05-22 20:24:05.000000000","message":"Seems like you\u0027ll be using these functions a lot in other objects, right?  Do you plan on pulling them out into, say, nova.object.utils?  Any reason not to do so in this patch?","commit_id":"77952f49d362a02c34ba2494946b1c9a87cb9174"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"14bbef3cfcdcc1c0ac9287e1e7754353b8280dbf","unresolved":false,"context_lines":[{"line_number":220,"context_line":"        return instance"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    @base.remotable_classmethod"},{"line_number":223,"context_line":"    def get_by_uuid(cls, context, uuid\u003dNone, expected_attrs\u003dNone):"},{"line_number":224,"context_line":"        if expected_attrs is None:"},{"line_number":225,"context_line":"            expected_attrs \u003d []"},{"line_number":226,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPH%2F%2FyQ0%3D","line":223,"updated":"2013-05-23 02:42:42.000000000","message":"In patch 30192 I see a few cases of having temp code calling this method with [\u0027system_metadata\u0027, \u0027metadata\u0027] for expected_attrs, if that somehow becomes permanent, wondering if you should have an overloaded version of this method that just passes those in by default, e.g. get_by_uuid_with_meta(cls, context, uuid\u003dNone).","commit_id":"6ac1bd5f7c44aa0d26aed1289ce0bd6ba7662372"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"2de5c72ffdde2363c2969c23f84a9a177bce8c51","unresolved":false,"context_lines":[{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    _attr_scheduled_at_to_primitive \u003d obj_utils.dt_serializer(\u0027scheduled_at\u0027)"},{"line_number":133,"context_line":"    _attr_launched_at_to_primitive \u003d obj_utils.dt_serializer(\u0027launched_at\u0027)"},{"line_number":134,"context_line":"    _attr_terminated_at_to_primitive \u003d obj_utils.dt_serializer(\u0027terminated_at\u0027)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    _attr_scheduled_at_from_primitive \u003d obj_utils.dt_deserializer"},{"line_number":137,"context_line":"    _attr_launched_at_from_primitive \u003d obj_utils.dt_deserializer"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPH%2F%2Fwc8%3D","line":134,"updated":"2013-05-23 18:48:47.000000000","message":"Forgot to mention it in the base patch, but use the common functions in utils here.","commit_id":"9719b0ce3d406723a661773ff9aa4917902b747e"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"65b79be9c8e1d2be1b2cf3a1293f881b6d9860ac","unresolved":false,"context_lines":[{"line_number":210,"context_line":"        for field in [\u0027system_metadata\u0027, \u0027metadata\u0027]:"},{"line_number":211,"context_line":"            if hasattr(self, base.get_attrname(field)):"},{"line_number":212,"context_line":"                extra.append(field)"},{"line_number":213,"context_line":"        current \u003d Instance.get_by_uuid(context, uuid\u003dself.uuid,"},{"line_number":214,"context_line":"                                       expected_attrs\u003dextra)"},{"line_number":215,"context_line":"        for field in self.fields:"},{"line_number":216,"context_line":"            if (hasattr(self, base.get_attrname(field)) and"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPH%2F%2Fpak%3D","line":213,"updated":"2013-05-28 16:55:00.000000000","message":"Instance should be:  self.__class__  so that subclassing works.","commit_id":"78b5916be8d6752c67d8bad77d4105ce89d8eb3f"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"65b79be9c8e1d2be1b2cf3a1293f881b6d9860ac","unresolved":false,"context_lines":[{"line_number":228,"context_line":"            raise Exception(\u0027Cannot load \"%s\" from instance\u0027 % attrname)"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        # NOTE(danms): This could be optimized to just load the bits we need"},{"line_number":231,"context_line":"        instance \u003d Instance.get_by_uuid(self._context,"},{"line_number":232,"context_line":"                                        uuid\u003dself.uuid,"},{"line_number":233,"context_line":"                                        expected_attrs\u003dextra)"},{"line_number":234,"context_line":"        self[attrname] \u003d instance[attrname]"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPH%2F%2Fpas%3D","line":231,"updated":"2013-05-28 16:55:00.000000000","message":"Same as above.","commit_id":"78b5916be8d6752c67d8bad77d4105ce89d8eb3f"}],"nova/objects/instance.py":[{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"0ebf1f6fc0f52542badf67bff06f2d767cdff656","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    _attr_terminated_at_from_primitive \u003d obj_utils.dt_deserializer"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    @classmethod"},{"line_number":141,"context_line":"    def _from_db_object(cls, db_inst, expected_attrs\u003dNone):"},{"line_number":142,"context_line":"        \"\"\"Method to help with migration to objects."},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        Converts a database entity to a formal object."}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAPH%2F%2FoPc%3D","line":141,"updated":"2013-05-28 23:23:27.000000000","message":"When I was messing around, I wondered if this should just be a staticmethod with the first argument being the object to update.  It may be this class instance or another one.  You\u0027ll see why below.","commit_id":"135fff8063be8e22a28a52cd1ee41cd7cd4472df"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"0ebf1f6fc0f52542badf67bff06f2d767cdff656","unresolved":false,"context_lines":[{"line_number":175,"context_line":""},{"line_number":176,"context_line":"        db_inst \u003d db.instance_get_by_uuid(context, uuid,"},{"line_number":177,"context_line":"                                          columns_to_join)"},{"line_number":178,"context_line":"        return cls._from_db_object(db_inst, expected_attrs)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    @base.remotable"},{"line_number":181,"context_line":"    def save(self, context, expected_task_state\u003dNone):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAPH%2F%2FoO0%3D","line":178,"updated":"2013-05-28 23:23:27.000000000","message":"This would be:  instance \u003d cls()  And return cls._from_db_object(instance, db_inst, expected_attrs) with my comment above.  See why even further below","commit_id":"135fff8063be8e22a28a52cd1ee41cd7cd4472df"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"0ebf1f6fc0f52542badf67bff06f2d767cdff656","unresolved":false,"context_lines":[{"line_number":197,"context_line":"            updates[\u0027expected_task_state\u0027] \u003d expected_task_state"},{"line_number":198,"context_line":"        old_ref, inst_ref \u003d db.instance_update_and_get_original(context,"},{"line_number":199,"context_line":"                                                                self.uuid,"},{"line_number":200,"context_line":"                                                                updates)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"        if \u0027vm_state\u0027 in changes or \u0027task_state\u0027 in changes:"},{"line_number":203,"context_line":"            notifications.send_update(context, old_ref, inst_ref)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAPH%2F%2FoPA%3D","line":200,"updated":"2013-05-28 23:23:27.000000000","message":"Should we not apply the fresh DB info to ourselves?  Ie:\n\nself._from_db_object(self, inst_ref), etc.. or something similar.","commit_id":"135fff8063be8e22a28a52cd1ee41cd7cd4472df"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"507257e8ef1f366abc56693f6d386ed3320f6d22","unresolved":false,"context_lines":[{"line_number":188,"context_line":"        :param expected_task_state: Optional tuple of valid task states"},{"line_number":189,"context_line":"                                    for the instance to be in."},{"line_number":190,"context_line":"        \"\"\""},{"line_number":191,"context_line":"        updates \u003d dict()"},{"line_number":192,"context_line":"        changes \u003d self.obj_what_changed()"},{"line_number":193,"context_line":"        for field in changes:"},{"line_number":194,"context_line":"            updates[field] \u003d self[field]"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAPH%2F%2FmHo%3D","line":191,"updated":"2013-05-29 17:24:52.000000000","message":"updates \u003d {} is slightly better.  (Faster, and matches the [] syntax you use to initialize lists.)","commit_id":"44c8dae89f5d04967ad4edb21973231d09aa443e"}],"nova/tests/objects/test_instance.py":[{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"507257e8ef1f366abc56693f6d386ed3320f6d22","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                tzinfo\u003diso8601.iso8601.Utc(), microsecond\u003d0))"},{"line_number":41,"context_line":"        return fake_instance"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def test_datetime_hydration(self):"},{"line_number":44,"context_line":"        red_letter_date \u003d timeutils.parse_isotime("},{"line_number":45,"context_line":"            timeutils.isotime(datetime.datetime(1955, 11, 5)))"},{"line_number":46,"context_line":"        inst \u003d instance.Instance()"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAPH%2F%2FmH0%3D","line":43,"updated":"2013-05-29 17:24:52.000000000","message":"What does hydration mean here?","commit_id":"44c8dae89f5d04967ad4edb21973231d09aa443e"}],"nova/tests/test_object.py":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"5fd44c95584d2cc489d0d572e10f89e6d55a6219","unresolved":false,"context_lines":[{"line_number":384,"context_line":"        self.assertEqual(obj.bar, \u0027meow\u0027)"},{"line_number":385,"context_line":""},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"class TestInstanceObject(_ObjectTest):"},{"line_number":388,"context_line":"    def setUp(self):"},{"line_number":389,"context_line":"        super(TestInstanceObject, self).setUp()"},{"line_number":390,"context_line":"        self.fake_instance \u003d fakes.stub_instance(1)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2Fy%2F0%3D","line":387,"updated":"2013-05-22 20:24:05.000000000","message":"As you add different types of objects, this file is going to become quite large.  Perhaps it would be worth placing this into a file, perhaps in an \"object\" subdirectory?  For one thing, this would match your object-per-file pattern you\u0027re doing on the implementation side…","commit_id":"77952f49d362a02c34ba2494946b1c9a87cb9174"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"227f9035909a8e72cead575d8b1ed64ba39b5f28","unresolved":false,"context_lines":[{"line_number":429,"context_line":"        self.assertRemotes()"},{"line_number":430,"context_line":""},{"line_number":431,"context_line":""},{"line_number":432,"context_line":"class _TestInstanceObject(object):"},{"line_number":433,"context_line":"    @property"},{"line_number":434,"context_line":"    def fake_instance(self):"},{"line_number":435,"context_line":"        fake_instance \u003d fakes.stub_instance(id\u003d2,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPH%2F%2FwYo%3D","line":432,"updated":"2013-05-23 19:15:17.000000000","message":"I still feel like the object-specific tests should go into a test_\u003cobject\u003e.py file of their own, to keep the size of test_object.py down…","commit_id":"9719b0ce3d406723a661773ff9aa4917902b747e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a3b0c98d5693aea47d4b9fdad9c9ce5e4292424b","unresolved":false,"context_lines":[{"line_number":429,"context_line":"        self.assertRemotes()"},{"line_number":430,"context_line":""},{"line_number":431,"context_line":""},{"line_number":432,"context_line":"class _TestInstanceObject(object):"},{"line_number":433,"context_line":"    @property"},{"line_number":434,"context_line":"    def fake_instance(self):"},{"line_number":435,"context_line":"        fake_instance \u003d fakes.stub_instance(id\u003d2,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPH%2F%2FwWE%3D","line":432,"in_reply_to":"AAAAPH%2F%2FwYo%3D","updated":"2013-05-23 19:33:34.000000000","message":"Oh, that\u0027s fine. Sorry if I missed that in a previous review.","commit_id":"9719b0ce3d406723a661773ff9aa4917902b747e"}]}
