)]}'
{"octavia/common/data_models.py":[{"author":{"_account_id":10980,"name":"Doug Wiegley","email":"dougwig@parkside.io","username":"dougw"},"change_message_id":"bf1e021ba17eda1688e3399beb35c66752c2794c","unresolved":false,"context_lines":[{"line_number":24,"context_line":"            if attr.startswith(\u0027_\u0027):"},{"line_number":25,"context_line":"                continue"},{"line_number":26,"context_line":"            if isinstance(getattr(self, attr), (BaseDataModel, list)):"},{"line_number":27,"context_line":"                ret[attr] \u003d None"},{"line_number":28,"context_line":"            else:"},{"line_number":29,"context_line":"                ret[attr] \u003d self.__dict__[attr]"},{"line_number":30,"context_line":"        return ret"}],"source_content_type":"text/x-python","patch_set":15,"id":"da9df570_503e218d","line":27,"updated":"2014-09-26 16:07:34.000000000","message":"If I\u0027m reading this right, shouldn\u0027t this set it to [] ?","commit_id":"be3d3bcaa1dc09a0df665d851aa82a29dab2e57b"},{"author":{"_account_id":10806,"name":"Trevor Vardeman","email":"tvardema@redhat.com","username":"tvardeman"},"change_message_id":"db5de3f8f9c90048a3ce2e1dfab0c92e82f9ca9f","unresolved":false,"context_lines":[{"line_number":24,"context_line":"            if attr.startswith(\u0027_\u0027):"},{"line_number":25,"context_line":"                continue"},{"line_number":26,"context_line":"            if isinstance(getattr(self, attr), (BaseDataModel, list)):"},{"line_number":27,"context_line":"                ret[attr] \u003d None"},{"line_number":28,"context_line":"            else:"},{"line_number":29,"context_line":"                ret[attr] \u003d self.__dict__[attr]"},{"line_number":30,"context_line":"        return ret"}],"source_content_type":"text/x-python","patch_set":15,"id":"baa201ad_5c4a5384","line":27,"in_reply_to":"da9df570_503e218d","updated":"2014-09-29 18:33:32.000000000","message":"If you set to an empty list rather than None, then when doing the equality method below the memory addresses of children will be compared, rather than their fields.  Setting it to None allows us to only compare the fields.  I\u0027m sorry I don\u0027t really know why, I just know the tests including children objects will fail if set to [].","commit_id":"be3d3bcaa1dc09a0df665d851aa82a29dab2e57b"}],"octavia/common/exceptions.py":[{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"c885443e28208a7abee7860add27d0385b3e477c","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        return False"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"class BadRequest(OctaviaException):"},{"line_number":51,"context_line":"    message \u003d _(\u0027Bad %(resource)s request: %(msg)s\u0027)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"baa201ad_9921dbb6","line":50,"updated":"2014-10-02 15:06:10.000000000","message":"That feels lije re-inventing the wheel exception wise. I can see it\u0027s nice to have them under Octavia though...","commit_id":"d079e4503ad3a3492632cab11cff1eb162d16db8"}],"octavia/db/repositories.py":[{"author":{"_account_id":10980,"name":"Doug Wiegley","email":"dougwig@parkside.io","username":"dougw"},"change_message_id":"dc67fe3d1d872cf2b024aa2ec4893027954eb1ad","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":"from octavia.common import exceptions"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from octavia.db import models"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class BaseRepository(object):"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa98f980_d4929e57","line":16,"updated":"2014-09-16 20:55:11.000000000","message":"i see two pep8 failures here.  if you run \"tox\" locally, it won\u0027t abuse jenkins so much.  :-)","commit_id":"0e5f6f147196c3d787990497e53e29dd3e58eee7"},{"author":{"_account_id":10806,"name":"Trevor Vardeman","email":"tvardema@redhat.com","username":"tvardeman"},"change_message_id":"c6e2d042c2bb7b3301cf0cdc46e392e8eada0ec6","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":"from octavia.common import exceptions"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from octavia.db import models"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class BaseRepository(object):"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa98f980_ea44161d","line":16,"in_reply_to":"fa98f980_d4929e57","updated":"2014-09-17 00:58:24.000000000","message":"I pushed this because brandon was hounding me for it.  I\u0027ll get them fixed before meeting tomorrow.","commit_id":"0e5f6f147196c3d787990497e53e29dd3e58eee7"},{"author":{"_account_id":10980,"name":"Doug Wiegley","email":"dougwig@parkside.io","username":"dougw"},"change_message_id":"dc67fe3d1d872cf2b024aa2ec4893027954eb1ad","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class BaseRepository(object):"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    model_class \u003d None"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def create(self, session, **model_kwargs):"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa98f980_94ae5680","line":20,"updated":"2014-09-16 20:55:11.000000000","message":"Forgive me, but I still have no idea what a repository is.  Can you put in a docstring or comment and set the stage of what these objects are all about?","commit_id":"0e5f6f147196c3d787990497e53e29dd3e58eee7"},{"author":{"_account_id":10806,"name":"Trevor Vardeman","email":"tvardema@redhat.com","username":"tvardeman"},"change_message_id":"c6e2d042c2bb7b3301cf0cdc46e392e8eada0ec6","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class BaseRepository(object):"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    model_class \u003d None"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def create(self, session, **model_kwargs):"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa98f980_8a354aaa","line":20,"in_reply_to":"fa98f980_94ae5680","updated":"2014-09-17 00:58:24.000000000","message":"Yeah sorry about that, I totally forgot to acknowledge this.  It exists in other projects so I\u0027ll look to see how they document/detail it and copy that, sound good?","commit_id":"0e5f6f147196c3d787990497e53e29dd3e58eee7"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"05bc2e2987c4fdfde8c3d54d0b66a70862b3a913","unresolved":false,"context_lines":[{"line_number":24,"context_line":"        with session.begin():"},{"line_number":25,"context_line":"            model \u003d self.model_class(**model_kwargs)"},{"line_number":26,"context_line":"            session.add(model)"},{"line_number":27,"context_line":"        return model"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def delete(self, session, id\u003dNone):"},{"line_number":30,"context_line":"        if not id:"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa98f980_4047c1bc","line":27,"updated":"2014-09-17 04:29:01.000000000","message":"this should return model.to_data_model()\n\nAll repository calls should return a data model, not the sql alchemy model.","commit_id":"0e5f6f147196c3d787990497e53e29dd3e58eee7"},{"author":{"_account_id":10806,"name":"Trevor Vardeman","email":"tvardema@redhat.com","username":"tvardeman"},"change_message_id":"1cf54bcdd56f1d7a57d3ea797ae5d4a1f69dad10","unresolved":false,"context_lines":[{"line_number":24,"context_line":"        with session.begin():"},{"line_number":25,"context_line":"            model \u003d self.model_class(**model_kwargs)"},{"line_number":26,"context_line":"            session.add(model)"},{"line_number":27,"context_line":"        return model"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def delete(self, session, id\u003dNone):"},{"line_number":30,"context_line":"        if not id:"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa98f980_0ef6bc90","line":27,"in_reply_to":"fa98f980_4047c1bc","updated":"2014-09-17 15:13:37.000000000","message":"So test_repositories is going to change to working with the data_models then.  Sounds good.","commit_id":"0e5f6f147196c3d787990497e53e29dd3e58eee7"},{"author":{"_account_id":10806,"name":"Trevor Vardeman","email":"tvardema@redhat.com","username":"tvardeman"},"change_message_id":"f0412b8979bd7a17bbad45e071542aae6f1448ec","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        if not load_balancer_id:"},{"line_number":101,"context_line":"            raise exceptions.MissingArguments"},{"line_number":102,"context_line":"        vip \u003d session.query(self.model_class).filter_by("},{"line_number":103,"context_line":"            load_balancer_id\u003dload_balancer_id).first()"},{"line_number":104,"context_line":"        with session.begin():"},{"line_number":105,"context_line":"            session.delete(vip)"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"fa98f980_02b5a8cf","line":103,"updated":"2014-09-17 19:34:24.000000000","message":"Try using \".delete()\" instead of \".first()\" and then a session deletion.  Documentation shows a difference in behavior, however the question to answer is does that affect how we plan to use the database.","commit_id":"c894d52b1b73bd3b1b5d0d39ed34bbdc532f6bcb"},{"author":{"_account_id":10806,"name":"Trevor Vardeman","email":"tvardema@redhat.com","username":"tvardeman"},"change_message_id":"5928b6ce3d3ef265cb82b81aec6d4009c4ee77c8","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    def delete(self, session, id\u003dNone):"},{"line_number":35,"context_line":"        if not id:"},{"line_number":36,"context_line":"            raise exceptions.MissingArguments"},{"line_number":37,"context_line":"        model \u003d session.query(self.model_class).filter_by(id\u003did).first()"},{"line_number":38,"context_line":"        with session.begin():"},{"line_number":39,"context_line":"            session.delete(model)"},{"line_number":40,"context_line":"            session.flush()"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa98f980_bfa13297","line":37,"updated":"2014-09-19 00:02:59.000000000","message":"Attempted to use the \".delete()\" function of a session.  In the documentation it warned about failure to cascade, and I verified that is the case.  I\u0027m going to stick to a get/delete fashion here.","commit_id":"c5584bc3812cd549511b405e78720873d1aa248e"},{"author":{"_account_id":10806,"name":"Trevor Vardeman","email":"tvardema@redhat.com","username":"tvardeman"},"change_message_id":"5928b6ce3d3ef265cb82b81aec6d4009c4ee77c8","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    def delete(self, session, id\u003dNone):"},{"line_number":35,"context_line":"        if not id:"},{"line_number":36,"context_line":"            raise exceptions.MissingArguments"},{"line_number":37,"context_line":"        model \u003d session.query(self.model_class).filter_by(id\u003did).first()"},{"line_number":38,"context_line":"        with session.begin():"},{"line_number":39,"context_line":"            session.delete(model)"},{"line_number":40,"context_line":"            session.flush()"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa98f980_9fad4e9e","line":37,"updated":"2014-09-19 00:02:59.000000000","message":"I attempted the \".delete()\" method with the session here, and it doesn\u0027t cascade.  Sticking to a get/delete operation.","commit_id":"c5584bc3812cd549511b405e78720873d1aa248e"},{"author":{"_account_id":10980,"name":"Doug Wiegley","email":"dougwig@parkside.io","username":"dougw"},"change_message_id":"bf1e021ba17eda1688e3399beb35c66752c2794c","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    #         listener_id\u003dlistener_id).first()"},{"line_number":135,"context_line":"    #     if not stats:"},{"line_number":136,"context_line":"    #         return None"},{"line_number":137,"context_line":"    #     return stats.to_data_model()"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def update(self, session, listener_id, **model_kwargs):"},{"line_number":140,"context_line":"        with session.begin():"}],"source_content_type":"text/x-python","patch_set":15,"id":"da9df570_506541b3","line":137,"updated":"2014-09-26 16:07:34.000000000","message":"Why commented out?  Uncomment, delete, or add # TODO()","commit_id":"be3d3bcaa1dc09a0df665d851aa82a29dab2e57b"},{"author":{"_account_id":10806,"name":"Trevor Vardeman","email":"tvardema@redhat.com","username":"tvardeman"},"change_message_id":"f371031dbee6f50a03ea237355d952394a642f96","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    #         listener_id\u003dlistener_id).first()"},{"line_number":135,"context_line":"    #     if not stats:"},{"line_number":136,"context_line":"    #         return None"},{"line_number":137,"context_line":"    #     return stats.to_data_model()"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def update(self, session, listener_id, **model_kwargs):"},{"line_number":140,"context_line":"        with session.begin():"}],"source_content_type":"text/x-python","patch_set":15,"id":"baa201ad_dc22ca00","line":137,"in_reply_to":"da9df570_506541b3","updated":"2014-09-29 15:08:45.000000000","message":"Yeah, totally forgot about these o_0.  Will remove :D","commit_id":"be3d3bcaa1dc09a0df665d851aa82a29dab2e57b"}],"octavia/db/repository.py":[{"author":{"_account_id":10980,"name":"Doug Wiegley","email":"dougwig@parkside.io","username":"dougw"},"change_message_id":"6c6822bb4f8ce97a4f3582123883ff37bdadac38","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from octavia.db import models"},{"line_number":16,"context_line":"from octavia.common.exceptions import MissingArguments"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class BaseRepository(object):"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_0dc26234","line":16,"updated":"2014-09-16 16:16:54.000000000","message":"I don\u0027t think the openstack hacking rules allow importing objects; just modules.","commit_id":"396e0b55a79319522c877dc0470bd0c8f89f3864"},{"author":{"_account_id":10980,"name":"Doug Wiegley","email":"dougwig@parkside.io","username":"dougw"},"change_message_id":"6c6822bb4f8ce97a4f3582123883ff37bdadac38","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from octavia.common.exceptions import MissingArguments"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class BaseRepository(object):"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    model_class \u003d None"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_4ddb8a21","line":19,"updated":"2014-09-16 16:16:54.000000000","message":"What is a repository?","commit_id":"396e0b55a79319522c877dc0470bd0c8f89f3864"},{"author":{"_account_id":10980,"name":"Doug Wiegley","email":"dougwig@parkside.io","username":"dougw"},"change_message_id":"6c6822bb4f8ce97a4f3582123883ff37bdadac38","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    def delete_batch(self, session, ids\u003dNone):"},{"line_number":38,"context_line":"        ids \u003d ids or []"},{"line_number":39,"context_line":"        for id in ids:"},{"line_number":40,"context_line":"            self.delete(session, id)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def update(self, session, id, **model_kwargs):"},{"line_number":43,"context_line":"        with session.begin():"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_4d02aa73","line":40,"updated":"2014-09-16 16:16:54.000000000","message":"[self.delete(session, id) for id in ids]","commit_id":"396e0b55a79319522c877dc0470bd0c8f89f3864"},{"author":{"_account_id":10980,"name":"Doug Wiegley","email":"dougwig@parkside.io","username":"dougw"},"change_message_id":"6c6822bb4f8ce97a4f3582123883ff37bdadac38","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        return object"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def get_all(self, session, tenant_id\u003dNone):"},{"line_number":52,"context_line":"        # TODO(Trevor): Verify/Enable always returns list"},{"line_number":53,"context_line":"        model_list \u003d session.query(self.model_class).filter_by("},{"line_number":54,"context_line":"            tenant_id\u003dtenant_id).all()"},{"line_number":55,"context_line":"        return model_list"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_0df0a290","line":52,"updated":"2014-09-16 16:16:54.000000000","message":"Don\u0027t keep us in suspense.  Does it?  :-)","commit_id":"396e0b55a79319522c877dc0470bd0c8f89f3864"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"ad4073c04613d94d517553c9c23831e3fd303bd6","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        return model_list"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"class Repositories():"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def __init__(self):"},{"line_number":61,"context_line":"        self.load_balancer_repo \u003d LoadBalancerRepository()"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_1c461a50","line":58,"updated":"2014-09-16 14:53:18.000000000","message":"need to inherit from object","commit_id":"396e0b55a79319522c877dc0470bd0c8f89f3864"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"ad4073c04613d94d517553c9c23831e3fd303bd6","unresolved":false,"context_lines":[{"line_number":58,"context_line":"class Repositories():"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def __init__(self):"},{"line_number":61,"context_line":"        self.load_balancer_repo \u003d LoadBalancerRepository()"},{"line_number":62,"context_line":"        self.vip_repo \u003d VipRepository()"},{"line_number":63,"context_line":"        self.health_monitor_repo \u003d HealthMonitorRepository()"},{"line_number":64,"context_line":"        self.session_persistence_repo \u003d SessionPersistenceRepository()"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_9c712aab","line":61,"updated":"2014-09-16 14:53:18.000000000","message":"remove _repo, its redundant","commit_id":"396e0b55a79319522c877dc0470bd0c8f89f3864"}]}
