)]}'
{"openstack/cluster/v1/node.py":[{"author":{"_account_id":8257,"name":"Brian Curtin","email":"brian@python.org","username":"briancurtin"},"change_message_id":"d8abb32c437896a348d67cabed2e90a48e95c771","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        \"\"\""},{"line_number":78,"context_line":"        url \u003d utils.urljoin(self.base_path, self.id, \u0027action\u0027)"},{"line_number":79,"context_line":"        resp \u003d session.put(url, endpoint_filter\u003dself.service, json\u003dbody)"},{"line_number":80,"context_line":"        resp \u003d resp.json()"},{"line_number":81,"context_line":"        return resp"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def join(self, session, cluster_id):"}],"source_content_type":"text/x-python","patch_set":30,"id":"da85f559_5f0ca9ec","line":80,"updated":"2015-11-11 17:52:18.000000000","message":"Can this be folded into the return line so it\u0027s just `return resp.json()`?","commit_id":"de93fa5bacfe241f2d8b6230d8e29ff9f325b889"}],"openstack/compute/v2/server.py":[{"author":{"_account_id":8257,"name":"Brian Curtin","email":"brian@python.org","username":"briancurtin"},"change_message_id":"d8abb32c437896a348d67cabed2e90a48e95c771","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            headers \u003d {\u0027Accept\u0027: \u0027\u0027}"},{"line_number":96,"context_line":"            resp \u003d session.post("},{"line_number":97,"context_line":"                url, endpoint_filter\u003dself.service, json\u003dbody, headers\u003dheaders)"},{"line_number":98,"context_line":"        resp \u003d resp.json()"},{"line_number":99,"context_line":"        return resp"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def change_password(self, session, new_password):"}],"source_content_type":"text/x-python","patch_set":30,"id":"da85f559_9ffe91ac","line":98,"updated":"2015-11-11 17:52:18.000000000","message":"Combine with return line?","commit_id":"de93fa5bacfe241f2d8b6230d8e29ff9f325b889"}],"openstack/connection.py":[{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"2e36f0cde8dac03900b11d04c9a94105d0227b97","unresolved":false,"context_lines":[{"line_number":130,"context_line":"class Connection(object):"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def __init__(self, authenticator\u003dNone, profile\u003dNone, verify\u003dTrue,"},{"line_number":133,"context_line":"                 user_agent\u003dNone, auth_plugin\u003dNone, **auth_args):"},{"line_number":134,"context_line":"        \"\"\"Create a context for a connection to a cloud provider."},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"        A connection needs a transport and an authenticator.  The user may pass"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa1b9901_e9f9484f","line":133,"updated":"2015-08-26 01:08:36.000000000","message":"i\u0027m concerned about passing auth args like this","commit_id":"28fab0a2d39ffb653db4d3e4e4ae7e66f4460945"},{"author":{"_account_id":8257,"name":"Brian Curtin","email":"brian@python.org","username":"briancurtin"},"change_message_id":"7c6eabc12c489234239db4598c19723446fa7689","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        self.authenticator \u003d self._create_authenticator(authenticator,"},{"line_number":176,"context_line":"                                                        auth_plugin,"},{"line_number":177,"context_line":"                                                        **auth_args)"},{"line_number":178,"context_line":"        self.profile \u003d profile if profile else _profile.Profile()"},{"line_number":179,"context_line":"        self.session \u003d session.Session(self.profile, auth\u003dself.authenticator,"},{"line_number":180,"context_line":"                                       verify\u003dverify, user_agent\u003duser_agent)"},{"line_number":181,"context_line":"        self._open()"}],"source_content_type":"text/x-python","patch_set":19,"id":"9a1a9d01_05d843ee","line":178,"updated":"2015-09-28 20:03:18.000000000","message":"Can just do `profile or _profile.Profile()`","commit_id":"21ac9649447797b2cff8e0597b437da19ba946d9"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"6de4ea3a67593b34c5b9985127053050cc18cebb","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        if authenticator:"},{"line_number":185,"context_line":"            return authenticator"},{"line_number":186,"context_line":"        loader \u003d ksa_loader.get_plugin_loader(auth_plugin)"},{"line_number":187,"context_line":"        return loader().load_from_options(**auth_args)"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def _open(self):"},{"line_number":190,"context_line":"        \"\"\"Open the connection."}],"source_content_type":"text/x-python","patch_set":20,"id":"3a29b11f_47cbe772","line":187,"updated":"2015-10-26 22:06:26.000000000","message":"so this is similar to what you had before - however is this right that we only want to allow people to auth based on a string and a bunch of options? The idea of passing in a built plugin is that you could reuse some existing authentication, for example coming from cache, which i am looking at in ksa.","commit_id":"42545e58440a849464e676c86e5eede560cc3857"}],"openstack/database/v1/user.py":[{"author":{"_account_id":8257,"name":"Brian Curtin","email":"brian@python.org","username":"briancurtin"},"change_message_id":"d8abb32c437896a348d67cabed2e90a48e95c771","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        # Create expects an array of users"},{"line_number":44,"context_line":"        body \u003d {\u0027users\u0027: [attrs]}"},{"line_number":45,"context_line":"        resp \u003d session.post(url, endpoint_filter\u003dcls.service, json\u003dbody)"},{"line_number":46,"context_line":"        resp \u003d resp.json()"},{"line_number":47,"context_line":"        return resp"}],"source_content_type":"text/x-python","patch_set":30,"id":"da85f559_9f1bf1c9","line":46,"updated":"2015-11-11 17:52:18.000000000","message":"Combine with return line?","commit_id":"de93fa5bacfe241f2d8b6230d8e29ff9f325b889"}],"openstack/module_loader.py":[{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"2e36f0cde8dac03900b11d04c9a94105d0227b97","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        self.auth_mgr \u003d extension.ExtensionManager("},{"line_number":39,"context_line":"            namespace\u003d\"keystoneauth1.plugin\","},{"line_number":40,"context_line":"            invoke_on_load\u003dFalse,"},{"line_number":41,"context_line":"        )"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def get_auth_plugin(self, plugin_name):"},{"line_number":44,"context_line":"        \"\"\"Get an authentication plugin by name.\"\"\""}],"source_content_type":"text/x-python","patch_set":15,"id":"fa1b9901_29dd00e0","line":41,"updated":"2015-08-26 01:08:36.000000000","message":"why are we handling this? What doesn\u0027t keystoneauth provide that you need here?","commit_id":"28fab0a2d39ffb653db4d3e4e4ae7e66f4460945"}],"openstack/network/v2/router.py":[{"author":{"_account_id":8257,"name":"Brian Curtin","email":"brian@python.org","username":"briancurtin"},"change_message_id":"d8abb32c437896a348d67cabed2e90a48e95c771","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        body \u003d {\u0027subnet_id\u0027: subnet_id}"},{"line_number":54,"context_line":"        url \u003d utils.urljoin(self.base_path, self.id, \u0027add_router_interface\u0027)"},{"line_number":55,"context_line":"        resp \u003d session.put(url, endpoint_filter\u003dself.service, json\u003dbody)"},{"line_number":56,"context_line":"        resp \u003d resp.json()"},{"line_number":57,"context_line":"        return resp"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def remove_interface(self, session, subnet_id):"}],"source_content_type":"text/x-python","patch_set":30,"id":"da85f559_ff9c7d0f","line":56,"updated":"2015-11-11 17:52:18.000000000","message":"Combine with return line?","commit_id":"de93fa5bacfe241f2d8b6230d8e29ff9f325b889"},{"author":{"_account_id":8257,"name":"Brian Curtin","email":"brian@python.org","username":"briancurtin"},"change_message_id":"d8abb32c437896a348d67cabed2e90a48e95c771","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        body \u003d {\u0027subnet_id\u0027: subnet_id}"},{"line_number":69,"context_line":"        url \u003d utils.urljoin(self.base_path, self.id, \u0027remove_router_interface\u0027)"},{"line_number":70,"context_line":"        resp \u003d session.put(url, endpoint_filter\u003dself.service, json\u003dbody)"},{"line_number":71,"context_line":"        resp \u003d resp.json()"},{"line_number":72,"context_line":"        return resp"}],"source_content_type":"text/x-python","patch_set":30,"id":"da85f559_bf8b55c2","line":71,"updated":"2015-11-11 17:52:18.000000000","message":"Combine with return line?","commit_id":"de93fa5bacfe241f2d8b6230d8e29ff9f325b889"}],"openstack/orchestration/v1/stack.py":[{"author":{"_account_id":8257,"name":"Brian Curtin","email":"brian@python.org","username":"briancurtin"},"change_message_id":"d8abb32c437896a348d67cabed2e90a48e95c771","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        \"\"\"Perform stack actions\"\"\""},{"line_number":70,"context_line":"        url \u003d utils.urljoin(self.base_path, self.id, \u0027actions\u0027)"},{"line_number":71,"context_line":"        resp \u003d session.post(url, endpoint_filter\u003dself.service, json\u003dbody)"},{"line_number":72,"context_line":"        resp \u003d resp.json()"},{"line_number":73,"context_line":"        return resp"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def check(self, session):"}],"source_content_type":"text/x-python","patch_set":30,"id":"da85f559_7f2deda6","line":72,"updated":"2015-11-11 17:52:18.000000000","message":"Combine with return line?","commit_id":"de93fa5bacfe241f2d8b6230d8e29ff9f325b889"}],"openstack/profile.py":[{"author":{"_account_id":8257,"name":"Brian Curtin","email":"brian@python.org","username":"briancurtin"},"change_message_id":"d8abb32c437896a348d67cabed2e90a48e95c771","unresolved":false,"context_lines":[{"line_number":114,"context_line":"    def _add_service(self, serv):"},{"line_number":115,"context_line":"        serv.interface \u003d None"},{"line_number":116,"context_line":"        self._services[serv.service_type] \u003d serv"},{"line_number":117,"context_line":"        self.service_keys \u003d sorted(self._services.keys())"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def _load_plugin(self, namespace):"},{"line_number":120,"context_line":"        \"\"\"Load a service plugin."}],"source_content_type":"text/x-python","patch_set":30,"id":"da85f559_bac60398","line":117,"updated":"2015-11-11 17:52:18.000000000","message":"What\u0027s the reason for the sorting call? We\u0027d currently be calling this 13 times when initializing the class and it\u0027s only going to get bigger, and Profile instances could be created a few times -- if you\u0027re using from_config we\u0027re creating one, users themselves are potentially creating one, we\u0027re creating one by default if one isn\u0027t passed in, etc.\n\nIf there\u0027s a true need to be sorted, can we move this to the end of __init__ so it\u0027s only called once per initialization?","commit_id":"de93fa5bacfe241f2d8b6230d8e29ff9f325b889"},{"author":{"_account_id":8736,"name":"Terry Howe","email":"terrylhowe@gmail.com","username":"terrylhowe"},"change_message_id":"19322bf4898ad81d753d1e82e6159865080e76c7","unresolved":false,"context_lines":[{"line_number":114,"context_line":"    def _add_service(self, serv):"},{"line_number":115,"context_line":"        serv.interface \u003d None"},{"line_number":116,"context_line":"        self._services[serv.service_type] \u003d serv"},{"line_number":117,"context_line":"        self.service_keys \u003d sorted(self._services.keys())"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def _load_plugin(self, namespace):"},{"line_number":120,"context_line":"        \"\"\"Load a service plugin."}],"source_content_type":"text/x-python","patch_set":30,"id":"ba8a016a_2acc5769","line":117,"in_reply_to":"da85f559_bac60398","updated":"2015-11-17 19:50:09.000000000","message":"Done","commit_id":"de93fa5bacfe241f2d8b6230d8e29ff9f325b889"},{"author":{"_account_id":8257,"name":"Brian Curtin","email":"brian@python.org","username":"briancurtin"},"change_message_id":"d8abb32c437896a348d67cabed2e90a48e95c771","unresolved":false,"context_lines":[{"line_number":145,"context_line":"            return serv"},{"line_number":146,"context_line":"        msg \u003d (\"Service %s not in list of valid services: %s\" %"},{"line_number":147,"context_line":"               (service, self.service_keys))"},{"line_number":148,"context_line":"        raise exceptions.SDKException(msg)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    def get_services(self):"},{"line_number":151,"context_line":"        \"\"\"Get a list of all the known services.\"\"\""}],"source_content_type":"text/x-python","patch_set":30,"id":"da85f559_0507b018","line":148,"updated":"2015-11-11 17:52:18.000000000","message":"This feels a bit odd raising the base SDKException, and it actually feels a bit odd raising an exception at all since it\u0027s not all that exceptional of a thing. Could this just return the filter or None like before?\n\nIf this does in fact need to raise an exception, I think it should raise a more specific exception. Perhaps ServiceNotFound? Ideally I don\u0027t think we should be using the base SDKException, as I\u0027d think users are going to catch more specific things and leave an SDKException handler as the very top-level handler of their app.\n\nAnyway, my preference here would be to just return.","commit_id":"de93fa5bacfe241f2d8b6230d8e29ff9f325b889"},{"author":{"_account_id":8736,"name":"Terry Howe","email":"terrylhowe@gmail.com","username":"terrylhowe"},"change_message_id":"19322bf4898ad81d753d1e82e6159865080e76c7","unresolved":false,"context_lines":[{"line_number":145,"context_line":"            return serv"},{"line_number":146,"context_line":"        msg \u003d (\"Service %s not in list of valid services: %s\" %"},{"line_number":147,"context_line":"               (service, self.service_keys))"},{"line_number":148,"context_line":"        raise exceptions.SDKException(msg)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    def get_services(self):"},{"line_number":151,"context_line":"        \"\"\"Get a list of all the known services.\"\"\""}],"source_content_type":"text/x-python","patch_set":30,"id":"ba8a016a_0aaab370","line":148,"in_reply_to":"da85f559_0507b018","updated":"2015-11-17 19:50:09.000000000","message":"This actually lines up with that code there on the old file #145 that throws an exception.","commit_id":"de93fa5bacfe241f2d8b6230d8e29ff9f325b889"}],"openstack/resource.py":[{"author":{"_account_id":8257,"name":"Brian Curtin","email":"brian@python.org","username":"briancurtin"},"change_message_id":"d8abb32c437896a348d67cabed2e90a48e95c771","unresolved":false,"context_lines":[{"line_number":542,"context_line":"            args[HEADERS] \u003d headers"},{"line_number":543,"context_line":"        if resource_id:"},{"line_number":544,"context_line":"            resp \u003d session.put(url, endpoint_filter\u003dcls.service, **args)"},{"line_number":545,"context_line":"            resp \u003d resp.json()"},{"line_number":546,"context_line":"        else:"},{"line_number":547,"context_line":"            resp \u003d session.post(url, endpoint_filter\u003dcls.service, **args)"},{"line_number":548,"context_line":"            resp \u003d resp.json()"}],"source_content_type":"text/x-python","patch_set":30,"id":"da85f559_85bc0007","line":545,"updated":"2015-11-11 17:52:18.000000000","message":"Can we move this line to just be done once after the branch instead of being done in both branches?","commit_id":"de93fa5bacfe241f2d8b6230d8e29ff9f325b889"}],"openstack/service_filter.py":[{"author":{"_account_id":8257,"name":"Brian Curtin","email":"brian@python.org","username":"briancurtin"},"change_message_id":"7c6eabc12c489234239db4598c19723446fa7689","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self.path \u003d path or module"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class ServiceFilter(dict):"},{"line_number":68,"context_line":"    UNVERSIONED \u003d \u0027\u0027"},{"line_number":69,"context_line":"    PUBLIC \u003d \u0027public\u0027"},{"line_number":70,"context_line":"    INTERNAL \u003d \u0027internal\u0027"}],"source_content_type":"text/x-python","patch_set":19,"id":"9a1a9d01_056a831a","line":67,"updated":"2015-09-28 20:03:18.000000000","message":"This should inherit from MutableMapping instead of the builtin dictionary type.\n\nHowever, I\u0027m not entirely sure why this would need to do that at all. Users should just be accessing attributes.","commit_id":"21ac9649447797b2cff8e0597b437da19ba946d9"},{"author":{"_account_id":8257,"name":"Brian Curtin","email":"brian@python.org","username":"briancurtin"},"change_message_id":"d8abb32c437896a348d67cabed2e90a48e95c771","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self.path \u003d path or module"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class ServiceFilter(dict):"},{"line_number":68,"context_line":"    UNVERSIONED \u003d \u0027\u0027"},{"line_number":69,"context_line":"    PUBLIC \u003d \u0027public\u0027"},{"line_number":70,"context_line":"    INTERNAL \u003d \u0027internal\u0027"}],"source_content_type":"text/x-python","patch_set":30,"id":"da85f559_4562983f","line":67,"updated":"2015-11-11 17:52:18.000000000","message":"I\u0027m guessing this subclasses dict because KSA expects to work with dicts and we\u0027re working with objects/properties on our end?","commit_id":"de93fa5bacfe241f2d8b6230d8e29ff9f325b889"},{"author":{"_account_id":8736,"name":"Terry Howe","email":"terrylhowe@gmail.com","username":"terrylhowe"},"change_message_id":"24fc3b5d758031643d6c99bbfdd0b3d016ab26ae","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self.path \u003d path or module"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class ServiceFilter(dict):"},{"line_number":68,"context_line":"    UNVERSIONED \u003d \u0027\u0027"},{"line_number":69,"context_line":"    PUBLIC \u003d \u0027public\u0027"},{"line_number":70,"context_line":"    INTERNAL \u003d \u0027internal\u0027"}],"source_content_type":"text/x-python","patch_set":30,"id":"da85f559_addfa667","line":67,"in_reply_to":"da85f559_4562983f","updated":"2015-11-17 19:09:55.000000000","message":"Yeh, it needs to behave like a dictionary i general and the code looks cleaner if we just say \u0027endpoint_filter\u003dcls.sevice\u0027  I think this code could use some clean up in general, but it isn\u0027t too bad.  I\u0027ve got a task card to consider renaming it EndpointFilter so it lines up with KSA.","commit_id":"de93fa5bacfe241f2d8b6230d8e29ff9f325b889"}],"openstack/session.py":[{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"2e36f0cde8dac03900b11d04c9a94105d0227b97","unresolved":false,"context_lines":[{"line_number":60,"context_line":"from keystoneauth1 import session as _session"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"class Session(_session.Session):"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def __init__(self, profile, **kwargs):"},{"line_number":66,"context_line":"        \"\"\"Create a new Keystone auth session with a profile."}],"source_content_type":"text/x-python","patch_set":15,"id":"fa1b9901_c9f4845c","line":63,"updated":"2015-08-26 01:08:36.000000000","message":"any reason this wouldn\u0027t be a keystoneauth1.Adapter?","commit_id":"28fab0a2d39ffb653db4d3e4e4ae7e66f4460945"},{"author":{"_account_id":8736,"name":"Terry Howe","email":"terrylhowe@gmail.com","username":"terrylhowe"},"change_message_id":"29267dfbcd9edee9d55f6eb9d27afd872d2c7032","unresolved":false,"context_lines":[{"line_number":60,"context_line":"from keystoneauth1 import session as _session"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"class Session(_session.Session):"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def __init__(self, profile, **kwargs):"},{"line_number":66,"context_line":"        \"\"\"Create a new Keystone auth session with a profile."}],"source_content_type":"text/x-python","patch_set":15,"id":"da20952f_61912e99","line":63,"in_reply_to":"fa1b9901_c9f4845c","updated":"2015-08-27 15:54:21.000000000","message":"The way I understand it, I\u0027d have to have an adapter for every service since the adapter basically has an endpoint filter.\n\n* It would result in a lot more changes than I already have.\n* It adds a whole other layer to the stack trace\n* I can see the Adapter would be handy if i was just dealing with one service, but I\u0027m not.  We are currently supporting 13 services.","commit_id":"28fab0a2d39ffb653db4d3e4e4ae7e66f4460945"},{"author":{"_account_id":8257,"name":"Brian Curtin","email":"brian@python.org","username":"briancurtin"},"change_message_id":"d8abb32c437896a348d67cabed2e90a48e95c771","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"def parse_url(filt, url):"},{"line_number":25,"context_line":"    pattern \u003d re.compile(\u0027/v\\d[\\d.]*\u0027)"},{"line_number":26,"context_line":"    result \u003d parse.urlparse(url)"},{"line_number":27,"context_line":"    path \u003d result.path"},{"line_number":28,"context_line":"    vstr \u003d pattern.search(path)"}],"source_content_type":"text/x-python","patch_set":30,"id":"da85f559_c58be8c1","line":25,"updated":"2015-11-11 17:52:18.000000000","message":"Should move the re.compile out to be a module-level name so it\u0027s compiled once at import time rather than each time parse_url is called from get_endpoint. They don\u0027t get cached by the re module so we\u0027re only sort of getting the benefit of compiling the regex.","commit_id":"de93fa5bacfe241f2d8b6230d8e29ff9f325b889"}],"openstack/telemetry/v2/alarm.py":[{"author":{"_account_id":8257,"name":"Brian Curtin","email":"brian@python.org","username":"briancurtin"},"change_message_id":"d8abb32c437896a348d67cabed2e90a48e95c771","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        \"\"\""},{"line_number":73,"context_line":"        url \u003d utils.urljoin(self.base_path, self.id, \u0027state\u0027)"},{"line_number":74,"context_line":"        resp \u003d session.put(url, endpoint_filter\u003dself.service, json\u003dnext_state)"},{"line_number":75,"context_line":"        resp \u003d resp.json()"},{"line_number":76,"context_line":"        return resp"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def check_state(self, session):"}],"source_content_type":"text/x-python","patch_set":30,"id":"da85f559_25b99479","line":75,"updated":"2015-11-11 17:52:18.000000000","message":"Move with return line?","commit_id":"de93fa5bacfe241f2d8b6230d8e29ff9f325b889"}],"requirements.txt":[{"author":{"_account_id":8257,"name":"Brian Curtin","email":"brian@python.org","username":"briancurtin"},"change_message_id":"7c6eabc12c489234239db4598c19723446fa7689","unresolved":false,"context_lines":[{"line_number":7,"context_line":"stevedore\u003e\u003d1.5.0 # Apache-2.0"},{"line_number":8,"context_line":"oslo.utils\u003e\u003d2.0.0 # Apache-2.0"},{"line_number":9,"context_line":"os-client-config!\u003d1.6.2,\u003e\u003d1.4.0"},{"line_number":10,"context_line":"keystoneauth1"}],"source_content_type":"text/plain","patch_set":19,"id":"9a1a9d01_a5a077a0","line":10,"updated":"2015-09-28 20:03:18.000000000","message":"Should this be pinned on something?","commit_id":"21ac9649447797b2cff8e0597b437da19ba946d9"}]}
