)]}'
{"keystoneauth/access.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2e1f5c1d18bf44357fc7c6c4e9736b59e59ac033","unresolved":false,"context_lines":[{"line_number":694,"context_line":"            return None"},{"line_number":695,"context_line":""},{"line_number":696,"context_line":"    @property"},{"line_number":697,"context_line":"    def service_providers(self):"},{"line_number":698,"context_line":"        if not self._service_providers:"},{"line_number":699,"context_line":"            self._service_providers \u003d ("},{"line_number":700,"context_line":"                service_providers.ServiceProviders.from_token(self._data))"}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_d2445c1c","line":697,"updated":"2015-06-07 14:12:35.000000000","message":"without a docstring this method is useless as a public API.","commit_id":"a0ee3fbf4114bd64c904d9c4a36bcca304f4ec53"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"32ad0dd3e9d9bae733d998c52e2edabab0c746c0","unresolved":false,"context_lines":[{"line_number":694,"context_line":"            return None"},{"line_number":695,"context_line":""},{"line_number":696,"context_line":"    @property"},{"line_number":697,"context_line":"    def service_providers(self):"},{"line_number":698,"context_line":"        if not self._service_providers:"},{"line_number":699,"context_line":"            self._service_providers \u003d ("},{"line_number":700,"context_line":"                service_providers.ServiceProviders.from_token(self._data))"}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_a50df891","line":697,"in_reply_to":"3afb71cf_d2445c1c","updated":"2015-06-08 17:56:47.000000000","message":"this method overrides the abstract one in AccessInfo class, updated the docstring to inform about the return type","commit_id":"a0ee3fbf4114bd64c904d9c4a36bcca304f4ec53"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"098b10cf98b070b14f5e507fcd4f2704e47b70f8","unresolved":false,"context_lines":[{"line_number":699,"context_line":"            self._service_providers \u003d ("},{"line_number":700,"context_line":"                service_providers.ServiceProviders.from_token(self._data))"},{"line_number":701,"context_line":""},{"line_number":702,"context_line":"        return self._service_providers"}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_932aa62b","line":702,"updated":"2015-06-04 21:33:40.000000000","message":"Shall we here return some wrapper object here? This is not how rest of attributes is handled in AccessInfo class.\nHow about using this wrapper directly somewhere in the plugins (or wherever its used)?","commit_id":"a0ee3fbf4114bd64c904d9c4a36bcca304f4ec53"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"2afa2c7883c19b364803a807eafe7ebea730c97e","unresolved":false,"context_lines":[{"line_number":699,"context_line":"            self._service_providers \u003d ("},{"line_number":700,"context_line":"                service_providers.ServiceProviders.from_token(self._data))"},{"line_number":701,"context_line":""},{"line_number":702,"context_line":"        return self._service_providers"}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_ef68aebc","line":702,"in_reply_to":"3afb71cf_932aa62b","updated":"2015-06-05 16:50:07.000000000","message":"service_catalog is handled in the same way, that was the motivation to add this here and just use its methods in the auth plugin","commit_id":"a0ee3fbf4114bd64c904d9c4a36bcca304f4ec53"}],"keystoneauth/exceptions/service_providers.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e5be66c90957fbbb33264d37098f3eacffb562de","unresolved":false,"context_lines":[{"line_number":19,"context_line":"    \"\"\"A Service Provider cannot be found\"\"\""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    def __init__(self, sp_id):"},{"line_number":22,"context_line":"        self.sp_id \u003d sp_id"},{"line_number":23,"context_line":"        msg \u003d \u0027The Service Provider %(sp)s could not be found\u0027 % {\u0027sp\u0027: sp_id}"},{"line_number":24,"context_line":"        super(ServiceProviderNotFound, self).__init__(msg)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3afb71cf_5c28289a","line":22,"updated":"2015-06-09 17:26:16.000000000","message":"there\u0027s no reason to set this to a class attribute, is there?","commit_id":"acc1b6144f1e0e71867b394bc9c2c65c47809776"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"5e9361c4509e82267f140458cdf050e68fd85e43","unresolved":false,"context_lines":[{"line_number":19,"context_line":"    \"\"\"A Service Provider cannot be found\"\"\""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    def __init__(self, sp_id):"},{"line_number":22,"context_line":"        self.sp_id \u003d sp_id"},{"line_number":23,"context_line":"        msg \u003d \u0027The Service Provider %(sp)s could not be found\u0027 % {\u0027sp\u0027: sp_id}"},{"line_number":24,"context_line":"        super(ServiceProviderNotFound, self).__init__(msg)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3afb71cf_2e72c411","line":22,"in_reply_to":"3afb71cf_5c28289a","updated":"2015-06-09 23:07:55.000000000","message":"I like it here, it means you can parse the exception and figure out what id failed without having to regex the message.","commit_id":"acc1b6144f1e0e71867b394bc9c2c65c47809776"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e5be66c90957fbbb33264d37098f3eacffb562de","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    def __init__(self, sp_id):"},{"line_number":22,"context_line":"        self.sp_id \u003d sp_id"},{"line_number":23,"context_line":"        msg \u003d \u0027The Service Provider %(sp)s could not be found\u0027 % {\u0027sp\u0027: sp_id}"},{"line_number":24,"context_line":"        super(ServiceProviderNotFound, self).__init__(msg)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3afb71cf_bc1f1c6b","line":23,"updated":"2015-06-09 17:26:16.000000000","message":"you don\u0027t need to capitalize service provider","commit_id":"acc1b6144f1e0e71867b394bc9c2c65c47809776"}],"keystoneauth/service_providers.py":[{"author":{"_account_id":15750,"name":"Julian Edwards","email":"bigjools@gmail.com","username":"bigjools"},"change_message_id":"03dfada60523469004ba72ae542da3df0e32354c","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    def from_token(cls, token):"},{"line_number":19,"context_line":"        if \u0027token\u0027 not in token:"},{"line_number":20,"context_line":"            raise ValueError(\u0027Invalid token format for fetching\u0027"},{"line_number":21,"context_line":"                             \u0027Service Providers.\u0027)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"        return cls(token[\u0027token\u0027].get(\u0027service_providers\u0027, []))"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_3e9f1205","line":21,"updated":"2015-06-05 19:48:56.000000000","message":"I think the error message should say something about the missing \u0027token\u0027 otherwise this is the most frustrating kind of error that hides info.","commit_id":"a0ee3fbf4114bd64c904d9c4a36bcca304f4ec53"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2e1f5c1d18bf44357fc7c6c4e9736b59e59ac033","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    def from_token(cls, token):"},{"line_number":19,"context_line":"        if \u0027token\u0027 not in token:"},{"line_number":20,"context_line":"            raise ValueError(\u0027Invalid token format for fetching\u0027"},{"line_number":21,"context_line":"                             \u0027Service Providers.\u0027)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"        return cls(token[\u0027token\u0027].get(\u0027service_providers\u0027, []))"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_f27cf873","line":21,"updated":"2015-06-07 14:12:35.000000000","message":"lowercase \"service providers\"\n\nAlso, wrap in _() for translation.","commit_id":"a0ee3fbf4114bd64c904d9c4a36bcca304f4ec53"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"b8312353be94a53b179dc0aae8afaf57bc82b821","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    def from_token(cls, token):"},{"line_number":19,"context_line":"        if \u0027token\u0027 not in token:"},{"line_number":20,"context_line":"            raise ValueError(\u0027Invalid token format for fetching\u0027"},{"line_number":21,"context_line":"                             \u0027Service Providers.\u0027)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"        return cls(token[\u0027token\u0027].get(\u0027service_providers\u0027, []))"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_3af6fb8f","line":21,"in_reply_to":"3afb71cf_3e9f1205","updated":"2015-06-05 21:27:43.000000000","message":"it is the same message format as the ServiceCatalog error: https://github.com/openstack/keystoneauth/blob/master/keystoneauth/service_catalog.py#L213-L217","commit_id":"a0ee3fbf4114bd64c904d9c4a36bcca304f4ec53"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"4304d3bcc52bd4c38de2566043f738234491231b","unresolved":false,"context_lines":[{"line_number":19,"context_line":"        if \u0027token\u0027 not in token:"},{"line_number":20,"context_line":"            raise ValueError(\u0027Invalid token format for fetching\u0027"},{"line_number":21,"context_line":"                             \u0027Service Providers.\u0027)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"        return cls(token[\u0027token\u0027].get(\u0027service_providers\u0027, []))"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def _normalize_service_providers(self, service_providers_list):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_62b70fd9","line":22,"updated":"2015-06-08 07:49:23.000000000","message":"@Brant:  we don\u0027t use _() for translation in Keystoneauth. This is due to the effort of driving down to minimal requirements.\n\n@Julian: this is a case we could be a little better about returning a useful error - the error could probably say \"Invalid Token Format\" the \"for fetching service providers\" seems to be superfluous and doesn\u0027t help communicate the issue. This is really a catch \"this is not a valid format\" - or we could say \"Token Format Does Not Support Service Provierders\".\n\nV2 tokens cannot contain service providers - we could say as much as well I would guess.","commit_id":"a0ee3fbf4114bd64c904d9c4a36bcca304f4ec53"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"32ad0dd3e9d9bae733d998c52e2edabab0c746c0","unresolved":false,"context_lines":[{"line_number":19,"context_line":"        if \u0027token\u0027 not in token:"},{"line_number":20,"context_line":"            raise ValueError(\u0027Invalid token format for fetching\u0027"},{"line_number":21,"context_line":"                             \u0027Service Providers.\u0027)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"        return cls(token[\u0027token\u0027].get(\u0027service_providers\u0027, []))"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def _normalize_service_providers(self, service_providers_list):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_a55bb886","line":22,"in_reply_to":"3afb71cf_62b70fd9","updated":"2015-06-08 17:56:47.000000000","message":"thanks for the clarification and suggestions, will use the later one for the exception message.","commit_id":"a0ee3fbf4114bd64c904d9c4a36bcca304f4ec53"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2e1f5c1d18bf44357fc7c6c4e9736b59e59ac033","unresolved":false,"context_lines":[{"line_number":28,"context_line":"            try:"},{"line_number":29,"context_line":"                sp_id \u003d sp[\u0027id\u0027]"},{"line_number":30,"context_line":"            except KeyError:"},{"line_number":31,"context_line":"                continue"},{"line_number":32,"context_line":"            service_providers[sp_id] \u003d sp"},{"line_number":33,"context_line":"        return service_providers"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_92d94486","line":31,"updated":"2015-06-07 14:12:35.000000000","message":"add a comment why it\u0027s correct to ignore this error.","commit_id":"a0ee3fbf4114bd64c904d9c4a36bcca304f4ec53"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"32ad0dd3e9d9bae733d998c52e2edabab0c746c0","unresolved":false,"context_lines":[{"line_number":28,"context_line":"            try:"},{"line_number":29,"context_line":"                sp_id \u003d sp[\u0027id\u0027]"},{"line_number":30,"context_line":"            except KeyError:"},{"line_number":31,"context_line":"                continue"},{"line_number":32,"context_line":"            service_providers[sp_id] \u003d sp"},{"line_number":33,"context_line":"        return service_providers"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_4551a461","line":31,"in_reply_to":"3afb71cf_92d94486","updated":"2015-06-08 17:56:47.000000000","message":"Done","commit_id":"a0ee3fbf4114bd64c904d9c4a36bcca304f4ec53"},{"author":{"_account_id":15750,"name":"Julian Edwards","email":"bigjools@gmail.com","username":"bigjools"},"change_message_id":"03dfada60523469004ba72ae542da3df0e32354c","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            return self._service_providers[sp_id]"},{"line_number":42,"context_line":"        except KeyError:"},{"line_number":43,"context_line":"            raise ValueError(\u0027Could not find a Service Provider \u0027"},{"line_number":44,"context_line":"                             \u0027with ID \"%s\" in the token\u0027 % sp_id)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def get_sp_url(self, sp_id):"},{"line_number":47,"context_line":"        # All valid Service Provider object should have a sp_url attribute"}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_de747ed0","line":44,"updated":"2015-06-05 19:48:56.000000000","message":"Does this class always get constructed from a token? Otherwise the error text assumes too much.","commit_id":"a0ee3fbf4114bd64c904d9c4a36bcca304f4ec53"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2e1f5c1d18bf44357fc7c6c4e9736b59e59ac033","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            return self._service_providers[sp_id]"},{"line_number":42,"context_line":"        except KeyError:"},{"line_number":43,"context_line":"            raise ValueError(\u0027Could not find a Service Provider \u0027"},{"line_number":44,"context_line":"                             \u0027with ID \"%s\" in the token\u0027 % sp_id)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def get_sp_url(self, sp_id):"},{"line_number":47,"context_line":"        # All valid Service Provider object should have a sp_url attribute"}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_d2cd7cb8","line":44,"updated":"2015-06-07 14:12:35.000000000","message":"use _() for translation.","commit_id":"a0ee3fbf4114bd64c904d9c4a36bcca304f4ec53"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"b8312353be94a53b179dc0aae8afaf57bc82b821","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            return self._service_providers[sp_id]"},{"line_number":42,"context_line":"        except KeyError:"},{"line_number":43,"context_line":"            raise ValueError(\u0027Could not find a Service Provider \u0027"},{"line_number":44,"context_line":"                             \u0027with ID \"%s\" in the token\u0027 % sp_id)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def get_sp_url(self, sp_id):"},{"line_number":47,"context_line":"        # All valid Service Provider object should have a sp_url attribute"}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_3acf1b58","line":44,"in_reply_to":"3afb71cf_de747ed0","updated":"2015-06-05 21:27:43.000000000","message":"yes, it should be.","commit_id":"a0ee3fbf4114bd64c904d9c4a36bcca304f4ec53"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"4304d3bcc52bd4c38de2566043f738234491231b","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        except KeyError:"},{"line_number":43,"context_line":"            raise ValueError(\u0027Could not find a Service Provider \u0027"},{"line_number":44,"context_line":"                             \u0027with ID \"%s\" in the token\u0027 % sp_id)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def get_sp_url(self, sp_id):"},{"line_number":47,"context_line":"        # All valid Service Provider object should have a sp_url attribute"},{"line_number":48,"context_line":"        return self.get_service_provider(sp_id)[\u0027sp_url\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_42bad3c1","line":45,"updated":"2015-06-08 07:49:23.000000000","message":"Again we don\u0027t do translation in Keystoneauth.","commit_id":"a0ee3fbf4114bd64c904d9c4a36bcca304f4ec53"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"cec258b25cd77243bba92d049f79f99a2e12f22d","unresolved":false,"context_lines":[{"line_number":23,"context_line":"        return cls(token[\u0027token\u0027].get(\u0027service_providers\u0027, []))"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def _normalize_service_providers(self, service_providers_list):"},{"line_number":26,"context_line":"        service_providers \u003d {}"},{"line_number":27,"context_line":"        for sp in service_providers_list:"},{"line_number":28,"context_line":"            try:"},{"line_number":29,"context_line":"                sp_id \u003d sp[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"3afb71cf_9de2372e","line":26,"updated":"2015-06-09 08:30:08.000000000","message":"nit: return dict((sp[\u0027id\u0027], sp) for sp in service_providers_list if \u0027id\u0027 in sp)","commit_id":"9b9bdb6139c0603539d815300f7cd1da76194408"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"2a8824ca96dbd42ebcaf15fc32993f69333a20f5","unresolved":false,"context_lines":[{"line_number":23,"context_line":"        return cls(token[\u0027token\u0027].get(\u0027service_providers\u0027, []))"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def _normalize_service_providers(self, service_providers_list):"},{"line_number":26,"context_line":"        service_providers \u003d {}"},{"line_number":27,"context_line":"        for sp in service_providers_list:"},{"line_number":28,"context_line":"            try:"},{"line_number":29,"context_line":"                sp_id \u003d sp[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"3afb71cf_28a8a3da","line":26,"in_reply_to":"3afb71cf_9de2372e","updated":"2015-06-09 09:39:40.000000000","message":"Done","commit_id":"9b9bdb6139c0603539d815300f7cd1da76194408"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"cec258b25cd77243bba92d049f79f99a2e12f22d","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        self._service_providers \u003d ("},{"line_number":40,"context_line":"            self._normalize_service_providers(service_providers))"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def get_service_provider(self, sp_id):"},{"line_number":43,"context_line":"        try:"},{"line_number":44,"context_line":"            return self._service_providers[sp_id]"},{"line_number":45,"context_line":"        except KeyError:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3afb71cf_bd0173b1","line":42,"updated":"2015-06-09 08:30:08.000000000","message":"is this public on purpose? The structure of this object may change in future token formats.","commit_id":"9b9bdb6139c0603539d815300f7cd1da76194408"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"2a8824ca96dbd42ebcaf15fc32993f69333a20f5","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        self._service_providers \u003d ("},{"line_number":40,"context_line":"            self._normalize_service_providers(service_providers))"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def get_service_provider(self, sp_id):"},{"line_number":43,"context_line":"        try:"},{"line_number":44,"context_line":"            return self._service_providers[sp_id]"},{"line_number":45,"context_line":"        except KeyError:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3afb71cf_e8ae0be5","line":42,"in_reply_to":"3afb71cf_bd0173b1","updated":"2015-06-09 09:39:40.000000000","message":"Done","commit_id":"9b9bdb6139c0603539d815300f7cd1da76194408"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"eec8be64ce7c03f6bf7937a5e292652094cd7284","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        try:"},{"line_number":44,"context_line":"            return self._service_providers[sp_id]"},{"line_number":45,"context_line":"        except KeyError:"},{"line_number":46,"context_line":"            raise ValueError(\u0027Could not find a Service Provider \u0027"},{"line_number":47,"context_line":"                             \u0027with ID \"%s\" in the token\u0027 % sp_id)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def get_sp_url(self, sp_id):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3afb71cf_7ddf7b0d","line":46,"updated":"2015-06-09 08:35:41.000000000","message":"do we have something better than ValueError? service catalog has an EndpointNotFound exception.","commit_id":"9b9bdb6139c0603539d815300f7cd1da76194408"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"2a8824ca96dbd42ebcaf15fc32993f69333a20f5","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        try:"},{"line_number":44,"context_line":"            return self._service_providers[sp_id]"},{"line_number":45,"context_line":"        except KeyError:"},{"line_number":46,"context_line":"            raise ValueError(\u0027Could not find a Service Provider \u0027"},{"line_number":47,"context_line":"                             \u0027with ID \"%s\" in the token\u0027 % sp_id)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def get_sp_url(self, sp_id):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3afb71cf_ae67fbb5","line":46,"in_reply_to":"3afb71cf_7ddf7b0d","updated":"2015-06-09 09:39:40.000000000","message":"added new exception class.","commit_id":"9b9bdb6139c0603539d815300f7cd1da76194408"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"fee128676438f2bb85418da47957aa33a2693121","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                             \u0027with ID \"%s\" in the token\u0027 % sp_id)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def get_sp_url(self, sp_id):"},{"line_number":50,"context_line":"        # All valid Service Provider object should have a sp_url attribute"},{"line_number":51,"context_line":"        return self.get_service_provider(sp_id)[\u0027sp_url\u0027]"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def get_auth_url(self, sp_id):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3afb71cf_37336264","line":50,"updated":"2015-06-09 07:44:20.000000000","message":"You seem to care about id while assume auth_url and sp_url will be there. Why?","commit_id":"9b9bdb6139c0603539d815300f7cd1da76194408"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"cec258b25cd77243bba92d049f79f99a2e12f22d","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def get_auth_url(self, sp_id):"},{"line_number":54,"context_line":"        # All valid Service Provider object should have an auth_url attribute"},{"line_number":55,"context_line":"        return self.get_service_provider(sp_id)[\u0027auth_url\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"3afb71cf_fd6a4bb2","line":55,"updated":"2015-06-09 08:30:08.000000000","message":"these should return None if nothing is found. you can use the missingproperty decorator from access.py","commit_id":"9b9bdb6139c0603539d815300f7cd1da76194408"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"2a8824ca96dbd42ebcaf15fc32993f69333a20f5","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def get_auth_url(self, sp_id):"},{"line_number":54,"context_line":"        # All valid Service Provider object should have an auth_url attribute"},{"line_number":55,"context_line":"        return self.get_service_provider(sp_id)[\u0027auth_url\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"3afb71cf_c8b7cf38","line":55,"in_reply_to":"3afb71cf_fd6a4bb2","updated":"2015-06-09 09:39:40.000000000","message":"Done","commit_id":"9b9bdb6139c0603539d815300f7cd1da76194408"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"eec8be64ce7c03f6bf7937a5e292652094cd7284","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def get_auth_url(self, sp_id):"},{"line_number":54,"context_line":"        # All valid Service Provider object should have an auth_url attribute"},{"line_number":55,"context_line":"        return self.get_service_provider(sp_id)[\u0027auth_url\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"3afb71cf_7d065b87","line":55,"in_reply_to":"3afb71cf_fd6a4bb2","updated":"2015-06-09 08:35:41.000000000","message":"oh, these are functions not properties. not sure on exception vs None.","commit_id":"9b9bdb6139c0603539d815300f7cd1da76194408"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"99ad893014b52ae5166830895d87b821d02e4ab5","unresolved":false,"context_lines":[{"line_number":23,"context_line":"        return cls(token[\u0027token\u0027].get(\u0027service_providers\u0027, []))"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def _normalize_service_providers(self, service_providers_list):"},{"line_number":26,"context_line":"        return {sp[\u0027id\u0027]: sp for sp in service_providers_list if \u0027id\u0027 in sp}"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def __init__(self, service_providers):"},{"line_number":29,"context_line":"        self._service_providers \u003d ("}],"source_content_type":"text/x-python","patch_set":5,"id":"3afb71cf_a8e2532d","line":26,"updated":"2015-06-09 08:52:16.000000000","message":"unfortunately {.. for ..} is py27 syntax and we still support py26","commit_id":"e49944b25e04204bafe1be29807bfad7066ac054"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"e1fb5397dc5a8e07a6ea176336df88bc442d7213","unresolved":false,"context_lines":[{"line_number":23,"context_line":"        return cls(token[\u0027token\u0027].get(\u0027service_providers\u0027, []))"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def _normalize_service_providers(self, service_providers_list):"},{"line_number":26,"context_line":"        return {sp[\u0027id\u0027]: sp for sp in service_providers_list if \u0027id\u0027 in sp}"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def __init__(self, service_providers):"},{"line_number":29,"context_line":"        self._service_providers \u003d ("}],"source_content_type":"text/x-python","patch_set":5,"id":"3afb71cf_ee6733e7","line":26,"in_reply_to":"3afb71cf_a8e2532d","updated":"2015-06-09 09:39:19.000000000","message":"Done","commit_id":"e49944b25e04204bafe1be29807bfad7066ac054"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"99ad893014b52ae5166830895d87b821d02e4ab5","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def __init__(self, service_providers):"},{"line_number":29,"context_line":"        self._service_providers \u003d ("},{"line_number":30,"context_line":"            self._normalize_service_providers(service_providers))"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def _get_service_provider(self, sp_id):"},{"line_number":33,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3afb71cf_c8bc6f08","line":30,"updated":"2015-06-09 08:52:16.000000000","message":"might be easier to just inline this.","commit_id":"e49944b25e04204bafe1be29807bfad7066ac054"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"e1fb5397dc5a8e07a6ea176336df88bc442d7213","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def __init__(self, service_providers):"},{"line_number":29,"context_line":"        self._service_providers \u003d ("},{"line_number":30,"context_line":"            self._normalize_service_providers(service_providers))"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def _get_service_provider(self, sp_id):"},{"line_number":33,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3afb71cf_eec3b387","line":30,"in_reply_to":"3afb71cf_c8bc6f08","updated":"2015-06-09 09:39:19.000000000","message":"Done","commit_id":"e49944b25e04204bafe1be29807bfad7066ac054"}],"keystoneauth/tests/unit/auth/test_identity_v3.py":[{"author":{"_account_id":15750,"name":"Julian Edwards","email":"bigjools@gmail.com","username":"bigjools"},"change_message_id":"03dfada60523469004ba72ae542da3df0e32354c","unresolved":false,"context_lines":[{"line_number":432,"context_line":"                         service_providers.get_auth_url(\u0027sp2\u0027))"},{"line_number":433,"context_line":"        self.assertEqual(\u0027https://sp2.com/Shibboleth.sso/SAML2/ECP\u0027,"},{"line_number":434,"context_line":"                         service_providers.get_sp_url(\u0027sp2\u0027))"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"    def test_invalid_auth_response_dict(self):"},{"line_number":437,"context_line":"        self.stub_auth(json\u003d{\u0027hello\u0027: \u0027world\u0027})"},{"line_number":438,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_7974849b","line":435,"updated":"2015-06-05 19:48:56.000000000","message":"This test is asserting output from input that has not been supplied in the test itself, which is a big testing antipattern (poor readability and isolation). I realise the other tests are all doing this too, but I just thought I\u0027d point this out.\n\nKeystone really needs a test object factory.","commit_id":"a0ee3fbf4114bd64c904d9c4a36bcca304f4ec53"}]}
