)]}'
{"dragonflow/db/db_store2.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"053d289d317c9d0b198004e77385742f395c0f17","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        return (self._get_by_id(id_) for id_ in ids)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"def _hashable(obj):"},{"line_number":173,"context_line":"    \u0027\u0027\u0027Returns a hashable representation of the objects: its type and ID\u0027\u0027\u0027"},{"line_number":174,"context_line":"    return (type(obj), obj.id)"},{"line_number":175,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ffe62b97_966400e6","line":172,"range":{"start_line":172,"start_character":7,"end_line":172,"end_character":14},"updated":"2017-03-27 10:03:13.000000000","message":"Please rename to: _get_db_store_hash (or move to __hash__ on model)","commit_id":"1c0072b61af81cedbe4847fd9b2bb271f67ecb19"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"0ba44f7184c5f4f48e4cf8c99d788cee0f642879","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        return (self._get_by_id(id_) for id_ in ids)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"def _hashable(obj):"},{"line_number":173,"context_line":"    \u0027\u0027\u0027Returns a hashable representation of the objects: its type and ID\u0027\u0027\u0027"},{"line_number":174,"context_line":"    return (type(obj), obj.id)"},{"line_number":175,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ffe62b97_fff5ea57","line":172,"range":{"start_line":172,"start_character":7,"end_line":172,"end_character":14},"in_reply_to":"ffe62b97_966400e6","updated":"2017-03-30 06:56:09.000000000","message":"Renamed to _obj_key","commit_id":"1c0072b61af81cedbe4847fd9b2bb271f67ecb19"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"053d289d317c9d0b198004e77385742f395c0f17","unresolved":false,"context_lines":[{"line_number":243,"context_line":""},{"line_number":244,"context_line":"           \u003e\u003e\u003e db_store.delete(Lport(id\u003dlport_id))"},{"line_number":245,"context_line":"        \"\"\""},{"line_number":246,"context_line":"        for subobj_key in self._obj_to_embedded[_hashable(obj)]:"},{"line_number":247,"context_line":"            self._delete_embedded(obj, subobj_key)"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"        self._get_cache(type(obj)).delete(obj)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffe62b97_b6238405","line":246,"range":{"start_line":246,"start_character":26,"end_line":246,"end_character":63},"updated":"2017-03-27 10:03:13.000000000","message":"Maybe put this in a variable with \u0027pop\u0027, so the item in the dict will also be deleted?","commit_id":"1c0072b61af81cedbe4847fd9b2bb271f67ecb19"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"0ba44f7184c5f4f48e4cf8c99d788cee0f642879","unresolved":false,"context_lines":[{"line_number":243,"context_line":""},{"line_number":244,"context_line":"           \u003e\u003e\u003e db_store.delete(Lport(id\u003dlport_id))"},{"line_number":245,"context_line":"        \"\"\""},{"line_number":246,"context_line":"        for subobj_key in self._obj_to_embedded[_hashable(obj)]:"},{"line_number":247,"context_line":"            self._delete_embedded(obj, subobj_key)"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"        self._get_cache(type(obj)).delete(obj)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffe62b97_13e117d1","line":246,"range":{"start_line":246,"start_character":26,"end_line":246,"end_character":63},"in_reply_to":"ffe62b97_b6238405","updated":"2017-03-30 06:56:09.000000000","message":"Agree","commit_id":"1c0072b61af81cedbe4847fd9b2bb271f67ecb19"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"053d289d317c9d0b198004e77385742f395c0f17","unresolved":false,"context_lines":[{"line_number":245,"context_line":"        \"\"\""},{"line_number":246,"context_line":"        for subobj_key in self._obj_to_embedded[_hashable(obj)]:"},{"line_number":247,"context_line":"            self._delete_embedded(obj, subobj_key)"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"        self._get_cache(type(obj)).delete(obj)"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    def _delete_embedded(self, obj, embedded_key):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffe62b97_b6ff0433","line":248,"updated":"2017-03-27 10:03:13.000000000","message":"Maybe also add self._embedded_refs.pop(_hashable(obj), None), to clear _embedded_refs from deleted objects?","commit_id":"1c0072b61af81cedbe4847fd9b2bb271f67ecb19"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"0ba44f7184c5f4f48e4cf8c99d788cee0f642879","unresolved":false,"context_lines":[{"line_number":245,"context_line":"        \"\"\""},{"line_number":246,"context_line":"        for subobj_key in self._obj_to_embedded[_hashable(obj)]:"},{"line_number":247,"context_line":"            self._delete_embedded(obj, subobj_key)"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"        self._get_cache(type(obj)).delete(obj)"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    def _delete_embedded(self, obj, embedded_key):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffe62b97_b3d14bfe","line":248,"in_reply_to":"ffe62b97_b6ff0433","updated":"2017-03-30 06:56:09.000000000","message":"Agree","commit_id":"1c0072b61af81cedbe4847fd9b2bb271f67ecb19"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"053d289d317c9d0b198004e77385742f395c0f17","unresolved":false,"context_lines":[{"line_number":262,"context_line":"        \"\"\""},{"line_number":263,"context_line":"        self._get_cache(type(obj)).update(obj)"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        new_embedded \u003d set()"},{"line_number":266,"context_line":"        obj_key \u003d _hashable(obj)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        for subobj in obj.iterate_embedded_models():"},{"line_number":269,"context_line":"            self.update(subobj)"},{"line_number":270,"context_line":"            embedded_key \u003d _hashable(subobj)"},{"line_number":271,"context_line":"            new_embedded.add(embedded_key)"},{"line_number":272,"context_line":"            self._embedded_refs[embedded_key].add(obj_key)"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"        old_embedded \u003d self._obj_to_embedded[obj_key]"},{"line_number":275,"context_line":"        for embedded_key in (old_embedded - new_embedded):"},{"line_number":276,"context_line":"            self._delete_embedded(obj, embedded_key)"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"        self._obj_to_embedded[obj_key] \u003d new_embedded"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"    def __contains__(self, elem):"},{"line_number":281,"context_line":"        return self.get_one(elem) \u003d\u003d elem"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffe62b97_96dbe019","line":278,"range":{"start_line":265,"start_character":0,"end_line":278,"end_character":53},"updated":"2017-03-27 10:03:13.000000000","message":"Maybe place in a method?","commit_id":"1c0072b61af81cedbe4847fd9b2bb271f67ecb19"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"0ba44f7184c5f4f48e4cf8c99d788cee0f642879","unresolved":false,"context_lines":[{"line_number":262,"context_line":"        \"\"\""},{"line_number":263,"context_line":"        self._get_cache(type(obj)).update(obj)"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        new_embedded \u003d set()"},{"line_number":266,"context_line":"        obj_key \u003d _hashable(obj)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        for subobj in obj.iterate_embedded_models():"},{"line_number":269,"context_line":"            self.update(subobj)"},{"line_number":270,"context_line":"            embedded_key \u003d _hashable(subobj)"},{"line_number":271,"context_line":"            new_embedded.add(embedded_key)"},{"line_number":272,"context_line":"            self._embedded_refs[embedded_key].add(obj_key)"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"        old_embedded \u003d self._obj_to_embedded[obj_key]"},{"line_number":275,"context_line":"        for embedded_key in (old_embedded - new_embedded):"},{"line_number":276,"context_line":"            self._delete_embedded(obj, embedded_key)"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"        self._obj_to_embedded[obj_key] \u003d new_embedded"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"    def __contains__(self, elem):"},{"line_number":281,"context_line":"        return self.get_one(elem) \u003d\u003d elem"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffe62b97_ca7a3e22","line":278,"range":{"start_line":265,"start_character":0,"end_line":278,"end_character":53},"in_reply_to":"ffe62b97_96dbe019","updated":"2017-03-30 06:56:09.000000000","message":"It\u0027s not repeated so I\u0027m very ambivalent about it.","commit_id":"1c0072b61af81cedbe4847fd9b2bb271f67ecb19"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"931dfd776a7f4cbb3abe910b9ac3ef757aa53efe","unresolved":false,"context_lines":[{"line_number":243,"context_line":""},{"line_number":244,"context_line":"           \u003e\u003e\u003e db_store.delete(Lport(id\u003dlport_id))"},{"line_number":245,"context_line":"        \"\"\""},{"line_number":246,"context_line":"        subobj_keys \u003d self._obj_to_embedded.pop(_obj_key(obj))"},{"line_number":247,"context_line":"        for key in subobj_keys:"},{"line_number":248,"context_line":"            self._delete_embedded(obj, key)"},{"line_number":249,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"dfeb2761_a714814f","line":246,"range":{"start_line":246,"start_character":60,"end_line":246,"end_character":62},"updated":"2017-04-03 08:58:48.000000000","message":"Add default empty tuple, to avoid KeyError and errors in the loop next line?","commit_id":"cf589bbad19866f0f0c48c50c612201206951bd9"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"931dfd776a7f4cbb3abe910b9ac3ef757aa53efe","unresolved":false,"context_lines":[{"line_number":264,"context_line":"        \"\"\""},{"line_number":265,"context_line":"        self._get_cache(type(obj)).update(obj)"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"        new_embedded \u003d set()"},{"line_number":268,"context_line":"        obj_key \u003d _obj_key(obj)"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"        for subobj in obj.iterate_embedded_models():"},{"line_number":271,"context_line":"            self.update(subobj)"},{"line_number":272,"context_line":"            embedded_key \u003d _obj_key(subobj)"},{"line_number":273,"context_line":"            new_embedded.add(embedded_key)"},{"line_number":274,"context_line":"            self._embedded_refs[embedded_key].add(obj_key)"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"        old_embedded \u003d self._obj_to_embedded[obj_key]"},{"line_number":277,"context_line":"        for embedded_key in (old_embedded - new_embedded):"},{"line_number":278,"context_line":"            self._delete_embedded(obj, embedded_key)"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"        self._obj_to_embedded[obj_key] \u003d new_embedded"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def __contains__(self, elem):"},{"line_number":283,"context_line":"        return self.get_one(elem) \u003d\u003d elem"}],"source_content_type":"text/x-python","patch_set":5,"id":"dfeb2761_6702f80b","line":280,"range":{"start_line":267,"start_character":0,"end_line":280,"end_character":53},"updated":"2017-04-03 08:58:48.000000000","message":"Method placement is not only for code-reuse. It\u0027s also to break up the code to readable, byte-sized chunks. I stand by my comment in PS3.","commit_id":"cf589bbad19866f0f0c48c50c612201206951bd9"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"253627672bd40083cb6d43e140d8cf4ae6d46523","unresolved":false,"context_lines":[{"line_number":243,"context_line":""},{"line_number":244,"context_line":"           \u003e\u003e\u003e db_store.delete(Lport(id\u003dlport_id))"},{"line_number":245,"context_line":"        \"\"\""},{"line_number":246,"context_line":"        subobj_keys \u003d self._obj_to_embedded.pop(_obj_key(obj), ())"},{"line_number":247,"context_line":"        for key in subobj_keys:"},{"line_number":248,"context_line":"            self._delete_embedded(obj, key)"},{"line_number":249,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"dfeb2761_614f3b6b","line":246,"range":{"start_line":246,"start_character":63,"end_line":246,"end_character":65},"updated":"2017-04-05 01:19:54.000000000","message":"nit: this is a tuple here. A set() will match the definition of _obj_to_embedded","commit_id":"a3638bd756e8c44ad909db40500ca608fcb01f51"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"d954f13ae9d536c6d50e0c36abfb6710b8fba1c7","unresolved":false,"context_lines":[{"line_number":243,"context_line":""},{"line_number":244,"context_line":"           \u003e\u003e\u003e db_store.delete(Lport(id\u003dlport_id))"},{"line_number":245,"context_line":"        \"\"\""},{"line_number":246,"context_line":"        subobj_keys \u003d self._obj_to_embedded.pop(_obj_key(obj), ())"},{"line_number":247,"context_line":"        for key in subobj_keys:"},{"line_number":248,"context_line":"            self._delete_embedded(obj, key)"},{"line_number":249,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"dfeb2761_b31b54c8","line":246,"range":{"start_line":246,"start_character":63,"end_line":246,"end_character":65},"in_reply_to":"dfeb2761_614f3b6b","updated":"2017-04-05 07:16:00.000000000","message":"I don\u0027t care changing it to set(), I plugged () here because it works and avoids creating a new object (empty tuple is singleton).","commit_id":"a3638bd756e8c44ad909db40500ca608fcb01f51"}],"dragonflow/db/model_framework.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"053d289d317c9d0b198004e77385742f395c0f17","unresolved":false,"context_lines":[{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        return set(deps)"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def iterate_embedded_models(self):"},{"line_number":206,"context_line":"        for name, field in self.iterate_over_fields():"},{"line_number":207,"context_line":"            if isinstance(field, fields.EmbeddedField):"},{"line_number":208,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffe62b97_f6a22c4b","line":205,"range":{"start_line":205,"start_character":8,"end_line":205,"end_character":31},"updated":"2017-03-27 10:03:13.000000000","message":"Maybe rename to iterate_embedded_instances? (So we know it\u0027s an instance and not a class)?","commit_id":"1c0072b61af81cedbe4847fd9b2bb271f67ecb19"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"0ba44f7184c5f4f48e4cf8c99d788cee0f642879","unresolved":false,"context_lines":[{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        return set(deps)"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def iterate_embedded_models(self):"},{"line_number":206,"context_line":"        for name, field in self.iterate_over_fields():"},{"line_number":207,"context_line":"            if isinstance(field, fields.EmbeddedField):"},{"line_number":208,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffe62b97_cae35e04","line":205,"range":{"start_line":205,"start_character":8,"end_line":205,"end_character":31},"in_reply_to":"ffe62b97_f6a22c4b","updated":"2017-03-30 06:56:09.000000000","message":"I feel that instance is a too broad term","commit_id":"1c0072b61af81cedbe4847fd9b2bb271f67ecb19"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"053d289d317c9d0b198004e77385742f395c0f17","unresolved":false,"context_lines":[{"line_number":215,"context_line":"                continue"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"            for attr in attrs:"},{"line_number":218,"context_line":"                if not isinstance(attr, ModelBase):"},{"line_number":219,"context_line":"                    continue"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffe62b97_7655fc1c","line":218,"range":{"start_line":218,"start_character":24,"end_line":218,"end_character":50},"updated":"2017-03-27 10:03:13.000000000","message":"Doesn\u0027t this return the same value for all attr in attrs?","commit_id":"1c0072b61af81cedbe4847fd9b2bb271f67ecb19"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"0ba44f7184c5f4f48e4cf8c99d788cee0f642879","unresolved":false,"context_lines":[{"line_number":215,"context_line":"                continue"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"            for attr in attrs:"},{"line_number":218,"context_line":"                if not isinstance(attr, ModelBase):"},{"line_number":219,"context_line":"                    continue"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffe62b97_ead18224","line":218,"range":{"start_line":218,"start_character":24,"end_line":218,"end_character":50},"in_reply_to":"ffe62b97_7655fc1c","updated":"2017-03-30 06:56:09.000000000","message":"Why? Neither ListField nor EmbeddedField doesn\u0027t require mf.ModelBase as type","commit_id":"1c0072b61af81cedbe4847fd9b2bb271f67ecb19"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"053d289d317c9d0b198004e77385742f395c0f17","unresolved":false,"context_lines":[{"line_number":354,"context_line":"def iter_models(include_embedded\u003dFalse):"},{"line_number":355,"context_line":"    \u0027\u0027\u0027Iterate over all registered models\u0027\u0027\u0027"},{"line_number":356,"context_line":"    for model in _registered_models:"},{"line_number":357,"context_line":"        if include_embedded or hasattr(model, \u0027table_name\u0027):"},{"line_number":358,"context_line":"            yield model"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ffe62b97_561b1880","line":357,"range":{"start_line":357,"start_character":31,"end_line":357,"end_character":60},"updated":"2017-03-27 10:03:13.000000000","message":"Maybe create a function: is_embedded, in case we change this heuristic in the future?","commit_id":"1c0072b61af81cedbe4847fd9b2bb271f67ecb19"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"0ba44f7184c5f4f48e4cf8c99d788cee0f642879","unresolved":false,"context_lines":[{"line_number":354,"context_line":"def iter_models(include_embedded\u003dFalse):"},{"line_number":355,"context_line":"    \u0027\u0027\u0027Iterate over all registered models\u0027\u0027\u0027"},{"line_number":356,"context_line":"    for model in _registered_models:"},{"line_number":357,"context_line":"        if include_embedded or hasattr(model, \u0027table_name\u0027):"},{"line_number":358,"context_line":"            yield model"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ffe62b97_ea96224c","line":357,"range":{"start_line":357,"start_character":31,"end_line":357,"end_character":60},"in_reply_to":"ffe62b97_561b1880","updated":"2017-03-30 06:56:09.000000000","message":"I think we should change this altogather, the relation is a bit confusing...\n\nA model is not embedded because it lacks a table, its embedded because other model(s) contain it.","commit_id":"1c0072b61af81cedbe4847fd9b2bb271f67ecb19"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"931dfd776a7f4cbb3abe910b9ac3ef757aa53efe","unresolved":false,"context_lines":[{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        return set(deps)"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def iterate_embedded_models(self):"},{"line_number":206,"context_line":"        for name, field in self.iterate_over_fields():"},{"line_number":207,"context_line":"            if isinstance(field, fields.EmbeddedField):"},{"line_number":208,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"dfeb2761_87285c86","line":205,"updated":"2017-04-03 08:58:48.000000000","message":"A rename is still needed.","commit_id":"cf589bbad19866f0f0c48c50c612201206951bd9"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"b08d336e7c31e77647f68d3c1053bbd44e6863e6","unresolved":false,"context_lines":[{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        return set(deps)"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def iterate_embedded_models(self):"},{"line_number":206,"context_line":"        for name, field in self.iterate_over_fields():"},{"line_number":207,"context_line":"            if isinstance(field, fields.EmbeddedField):"},{"line_number":208,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"dfeb2761_d63bb4c5","line":205,"in_reply_to":"dfeb2761_87285c86","updated":"2017-04-03 11:19:04.000000000","message":"Making this into a nit, since we can\u0027t find a better name. If anyone else has any suggestions, they are welcome.","commit_id":"cf589bbad19866f0f0c48c50c612201206951bd9"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"931dfd776a7f4cbb3abe910b9ac3ef757aa53efe","unresolved":false,"context_lines":[{"line_number":215,"context_line":"                continue"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"            for attr in attrs:"},{"line_number":218,"context_line":"                if not isinstance(attr, ModelBase):"},{"line_number":219,"context_line":"                    continue"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"dfeb2761_e73608e8","line":218,"updated":"2017-04-03 08:58:48.000000000","message":"Sorry. Please ignore.","commit_id":"cf589bbad19866f0f0c48c50c612201206951bd9"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"931dfd776a7f4cbb3abe910b9ac3ef757aa53efe","unresolved":false,"context_lines":[{"line_number":354,"context_line":"def iter_models(include_embedded\u003dFalse):"},{"line_number":355,"context_line":"    \u0027\u0027\u0027Iterate over all registered models\u0027\u0027\u0027"},{"line_number":356,"context_line":"    for model in _registered_models:"},{"line_number":357,"context_line":"        if include_embedded or hasattr(model, \u0027table_name\u0027):"},{"line_number":358,"context_line":"            yield model"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"dfeb2761_6750b80b","line":357,"updated":"2017-04-03 08:58:48.000000000","message":"Continuing from PS3 -\nEven more reason to move it to a separate method.","commit_id":"cf589bbad19866f0f0c48c50c612201206951bd9"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"9ae9e183701381be3facaca23c0800fcb856c8f9","unresolved":false,"context_lines":[{"line_number":227,"context_line":""},{"line_number":228,"context_line":"            for model in models:"},{"line_number":229,"context_line":"                if issubclass(model, ModelBase):"},{"line_number":230,"context_line":"                    embedded_models.add(model)"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"                    for model in model.iterate_embedded_model_types():"},{"line_number":233,"context_line":"                        embedded_models.add(model)"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        for model in embedded_models:"},{"line_number":236,"context_line":"            yield model"}],"source_content_type":"text/x-python","patch_set":7,"id":"dfeb2761_9aa4fca7","line":233,"range":{"start_line":230,"start_character":0,"end_line":233,"end_character":50},"updated":"2017-04-04 15:06:51.000000000","message":"nit: Would it be better to test containment, yield, and then add to embedded_models? This way the iteration can be stopped in the middle (with break).\n\nOtherwise, maybe just return the set, rather than forcing the client to iterate?","commit_id":"a3638bd756e8c44ad909db40500ca608fcb01f51"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"d954f13ae9d536c6d50e0c36abfb6710b8fba1c7","unresolved":false,"context_lines":[{"line_number":227,"context_line":""},{"line_number":228,"context_line":"            for model in models:"},{"line_number":229,"context_line":"                if issubclass(model, ModelBase):"},{"line_number":230,"context_line":"                    embedded_models.add(model)"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"                    for model in model.iterate_embedded_model_types():"},{"line_number":233,"context_line":"                        embedded_models.add(model)"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        for model in embedded_models:"},{"line_number":236,"context_line":"            yield model"}],"source_content_type":"text/x-python","patch_set":7,"id":"dfeb2761_13fb2079","line":233,"range":{"start_line":230,"start_character":0,"end_line":233,"end_character":50},"in_reply_to":"dfeb2761_9aa4fca7","updated":"2017-04-05 07:16:00.000000000","message":"I agree.","commit_id":"a3638bd756e8c44ad909db40500ca608fcb01f51"}],"dragonflow/tests/unit/test_model_framework.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"9ae9e183701381be3facaca23c0800fcb856c8f9","unresolved":false,"context_lines":[{"line_number":416,"context_line":""},{"line_number":417,"context_line":"        self.assertItemsEqual("},{"line_number":418,"context_line":"            (emb1, emb2, emb3),"},{"line_number":419,"context_line":"            embedding1.iterate_embedded_model_instances(),"},{"line_number":420,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":7,"id":"dfeb2761_fa0c28a6","line":419,"range":{"start_line":419,"start_character":23,"end_line":419,"end_character":55},"updated":"2017-04-04 15:06:51.000000000","message":"Maybe also add a test for iterate_embedded_model_types?","commit_id":"a3638bd756e8c44ad909db40500ca608fcb01f51"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"d954f13ae9d536c6d50e0c36abfb6710b8fba1c7","unresolved":false,"context_lines":[{"line_number":416,"context_line":""},{"line_number":417,"context_line":"        self.assertItemsEqual("},{"line_number":418,"context_line":"            (emb1, emb2, emb3),"},{"line_number":419,"context_line":"            embedding1.iterate_embedded_model_instances(),"},{"line_number":420,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":7,"id":"dfeb2761_136e802e","line":419,"range":{"start_line":419,"start_character":23,"end_line":419,"end_character":55},"in_reply_to":"dfeb2761_fa0c28a6","updated":"2017-04-05 07:16:00.000000000","message":"Line 400","commit_id":"a3638bd756e8c44ad909db40500ca608fcb01f51"}]}
