)]}'
{"keystoneclient/access.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"41fb9e496262d7b58ec4755c1f7c2ae5a96f0b06","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        \"\"\"Create AccessInfo object given a successful auth response \u0026 body"},{"line_number":38,"context_line":"           or a user-provided dict."},{"line_number":39,"context_line":"        \"\"\""},{"line_number":40,"context_line":"        # TODO(jamielennox): region_name doesn\u0027t belong in access. Deprecate."},{"line_number":41,"context_line":"        # It should also not be passed via body, but tests and compat relies"},{"line_number":42,"context_line":"        # on it being passed this way."},{"line_number":43,"context_line":"        if body is not None or len(kwargs):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAS3%2F%2FH2M%3D","line":40,"updated":"2013-10-07 16:59:51.000000000","message":"log a warning to actually deprecate it. this also reads like it should be a FIXME","commit_id":"a21cf73b7bda8cb069cb7e5d2572d138863348ec"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"41fb9e496262d7b58ec4755c1f7c2ae5a96f0b06","unresolved":false,"context_lines":[{"line_number":284,"context_line":"        (project), this property will return None."},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"        DEPRECATED: this doesn\u0027t consider region name. You should fetch it"},{"line_number":287,"context_line":"        from the service catalog yourself."},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"        :returns: tuple of urls"},{"line_number":290,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAS3%2F%2FH2I%3D","line":287,"updated":"2013-10-07 16:59:51.000000000","message":"log a warning in the child classes that there\u0027s a better approach; no one will see this and nothing will be done about it","commit_id":"a21cf73b7bda8cb069cb7e5d2572d138863348ec"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"4a4c72c47e7c45531ba94a62c5d2b77245eee801","unresolved":false,"context_lines":[{"line_number":51,"context_line":"                if body:"},{"line_number":52,"context_line":"                    if region_name:"},{"line_number":53,"context_line":"                        body[\u0027token\u0027][\u0027region_name\u0027] \u003d region_name"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"                    return AccessInfoV3(token, **body[\u0027token\u0027])"},{"line_number":56,"context_line":"                else:"},{"line_number":57,"context_line":"                    return AccessInfoV3(token, **kwargs)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2F4zg%3D","line":54,"updated":"2013-10-08 13:55:41.000000000","message":"blank line","commit_id":"8874f9b4ca2f4d9253abd7e77d9e0dbaeadb2193"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"4a4c72c47e7c45531ba94a62c5d2b77245eee801","unresolved":false,"context_lines":[{"line_number":58,"context_line":"            elif AccessInfoV2.is_valid(body, **kwargs):"},{"line_number":59,"context_line":"                if body:"},{"line_number":60,"context_line":"                    if region_name:"},{"line_number":61,"context_line":"                        body[\u0027access\u0027][\u0027region_name\u0027] \u003d kwargs[\u0027region_name\u0027]"},{"line_number":62,"context_line":"                    return AccessInfoV2(**body[\u0027access\u0027])"},{"line_number":63,"context_line":"                else:"},{"line_number":64,"context_line":"                    return AccessInfoV2(**kwargs)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2F4zA%3D","line":61,"updated":"2013-10-08 13:55:41.000000000","message":"shouldn\u0027t it be region_name instead of kwargs[\u0027region_name\u0027]?","commit_id":"8874f9b4ca2f4d9253abd7e77d9e0dbaeadb2193"}],"keystoneclient/httpclient.py":[{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"4a4c72c47e7c45531ba94a62c5d2b77245eee801","unresolved":false,"context_lines":[{"line_number":249,"context_line":"            self.trust_id \u003d self.auth_ref.trust_id"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"            if self.auth_ref.has_service_catalog():"},{"line_number":252,"context_line":"                self.region_name \u003d self.auth_ref.service_catalog.region_name"},{"line_number":253,"context_line":"        else:"},{"line_number":254,"context_line":"            self.auth_ref \u003d None"},{"line_number":255,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2F4xY%3D","line":252,"updated":"2013-10-08 13:55:41.000000000","message":"service_catalog is a httpclient property so you can make it simpler by changing self.auth_ref.service_catalog.region_name to just self.service_catalog.region_name","commit_id":"8874f9b4ca2f4d9253abd7e77d9e0dbaeadb2193"}],"keystoneclient/service_catalog.py":[{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"1cdb57b96e88d481ab7380ec6bcd6acb14835cd8","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            pass"},{"line_number":157,"context_line":"        return token"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def get_endpoints(self, service_type\u003dNone, endpoint_type\u003dNone,"},{"line_number":160,"context_line":"                      region_name\u003dNone):"},{"line_number":161,"context_line":"        if endpoint_type and \u0027URL\u0027 not in endpoint_type:"},{"line_number":162,"context_line":"            endpoint_type \u003d endpoint_type + \u0027URL\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FRA4%3D","line":159,"updated":"2013-10-01 09:35:44.000000000","message":"Looks good to me. One thing is that methods get_endpoints, get_urls and url_for looks nearly similar in ServiceCatalog V2 and V3. Maybe good idea is to pull out some common code as helper functions?","commit_id":"c2c9ff7d8357b3b65f6e3cdc83667ea1b6e52b2a"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"a973a730b25fcde830a45977c51d3a2e1071b618","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        return dict([(k, _filter(v, attr, filter_value))"},{"line_number":27,"context_line":"                    for k, v in endpoints.iteritems()])"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    if not (attr and filter_value):"},{"line_number":30,"context_line":"        return endpoints"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    return [endpoint for endpoint in endpoints"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAS3%2F%2FNTs%3D","line":29,"updated":"2013-10-02 10:39:45.000000000","message":"I think this if should be the first statement in this function","commit_id":"ca79f4a59b19059fba166560864bab58680ae787"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"a973a730b25fcde830a45977c51d3a2e1071b618","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                      region_name\u003dNone):"},{"line_number":68,"context_line":"        \"\"\"Fetch and filter endpoints for the specified service(s)."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        Returns endpoints for the specified service (or all) and"},{"line_number":71,"context_line":"        that contain the specified type (or all) and region (or all)."},{"line_number":72,"context_line":"        \"\"\""},{"line_number":73,"context_line":"        raise NotImplementedError()"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAS3%2F%2FNTU%3D","line":70,"updated":"2013-10-02 10:39:45.000000000","message":"I think too many \u0027and\u0027","commit_id":"ca79f4a59b19059fba166560864bab58680ae787"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"a973a730b25fcde830a45977c51d3a2e1071b618","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        raise NotImplementedError()"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def _get_region_name(self, default\u003dNone):"},{"line_number":123,"context_line":"        if self.region_name:"},{"line_number":124,"context_line":"            # TODO(jamielennox): This is deprecated. Inform people."},{"line_number":125,"context_line":"            return self.region_name"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAS3%2F%2FNTI%3D","line":123,"updated":"2013-10-02 10:39:45.000000000","message":"Why not just: return self.region_name or default","commit_id":"ca79f4a59b19059fba166560864bab58680ae787"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"a973a730b25fcde830a45977c51d3a2e1071b618","unresolved":false,"context_lines":[{"line_number":207,"context_line":"        if endpoint_type and \u0027URL\u0027 not in endpoint_type:"},{"line_number":208,"context_line":"            endpoint_type \u003d endpoint_type + \u0027URL\u0027"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        if not self.get_data():"},{"line_number":211,"context_line":"            raise exceptions.EmptyCatalog(\u0027The service catalog is empty.\u0027)"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"        region_name \u003d self._get_region_name(region_name)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAS3%2F%2FNS0%3D","line":210,"updated":"2013-10-02 10:39:45.000000000","message":"I think this statement should be the first one in this function.","commit_id":"ca79f4a59b19059fba166560864bab58680ae787"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"41fb9e496262d7b58ec4755c1f7c2ae5a96f0b06","unresolved":false,"context_lines":[{"line_number":23,"context_line":"def _filter(endpoints, attr\u003dNone, filter_value\u003dNone):"},{"line_number":24,"context_line":"    \"\"\"Given the attr and filter_value filter return only the matches.\"\"\""},{"line_number":25,"context_line":"    if not (attr and filter_value):"},{"line_number":26,"context_line":"        return endpoints"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    if isinstance(endpoints, dict):"},{"line_number":29,"context_line":"        return dict([(k, _filter(v, attr, filter_value))"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAS3%2F%2FH2k%3D","line":26,"updated":"2013-10-07 16:59:51.000000000","message":"shouldn\u0027t it raise an exception if attr xor filter_value?","commit_id":"a21cf73b7bda8cb069cb7e5d2572d138863348ec"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"41fb9e496262d7b58ec4755c1f7c2ae5a96f0b06","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def _get_region_name(self, default\u003dNone):"},{"line_number":123,"context_line":"        if self.region_name:"},{"line_number":124,"context_line":"            # TODO(jamielennox): This is deprecated. Inform people."},{"line_number":125,"context_line":"            return self.region_name"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        return default"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAS3%2F%2FH2Y%3D","line":124,"updated":"2013-10-07 16:59:51.000000000","message":"what is deprecated in favor of what? be specific.\n\n\"inform people\" is also useless commentary to anyone reading this... it\u0027s not necessarily a TODO for yourself, so help the next guy out","commit_id":"a21cf73b7bda8cb069cb7e5d2572d138863348ec"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7a0109b3eb42955727412db1b251ea34a1b909ec","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    if filter_value:"},{"line_number":36,"context_line":"        if isinstance(endpoints, dict):"},{"line_number":37,"context_line":"            return dict([(k, _filter(v, attr, filter_value))"},{"line_number":38,"context_line":"                        for k, v in endpoints.iteritems()])"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        return [endpoint for endpoint in endpoints"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATH%2F%2FMYQ%3D","line":37,"updated":"2013-10-21 16:34:14.000000000","message":"What if Attr is None?  Simplify  the logic here:  you are trying too hard to make this a drop in replacement.","commit_id":"a56c811cc530ac6fffe61d3f59f743721ebf4542"}]}
