)]}'
{"keystoneauth1/discover.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0d757aee66b710310a6003c70579063b537c5f65","unresolved":false,"context_lines":[{"line_number":421,"context_line":"                    \u0027Failed to contact the endpoint at %s for \u0027"},{"line_number":422,"context_line":"                    \u0027discovery. Fallback to using that endpoint as \u0027"},{"line_number":423,"context_line":"                    \u0027the base url.\u0027, self.url)"},{"line_number":424,"context_line":"                return"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"            else:"},{"line_number":427,"context_line":"                # NOTE(jamielennox): If you\u0027ve said no to allow_version_hack"}],"source_content_type":"text/x-python","patch_set":1,"id":"df140735_cdcfc027","line":424,"range":{"start_line":424,"start_character":16,"end_line":424,"end_character":22},"updated":"2017-06-07 17:45:22.000000000","message":"At a glance, this looks like a change in behavior.","commit_id":"27a0c8e0cf4e20af367d4e6a746132c3f3a95712"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"f056189f378cc22f368e1f1cd15719d5a59fc165","unresolved":false,"context_lines":[{"line_number":421,"context_line":"                    \u0027Failed to contact the endpoint at %s for \u0027"},{"line_number":422,"context_line":"                    \u0027discovery. Fallback to using that endpoint as \u0027"},{"line_number":423,"context_line":"                    \u0027the base url.\u0027, self.url)"},{"line_number":424,"context_line":"                return"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"            else:"},{"line_number":427,"context_line":"                # NOTE(jamielennox): If you\u0027ve said no to allow_version_hack"}],"source_content_type":"text/x-python","patch_set":1,"id":"bf091321_e8271f64","line":424,"range":{"start_line":424,"start_character":16,"end_line":424,"end_character":22},"in_reply_to":"df140735_cdcfc027","updated":"2017-06-08 16:05:22.000000000","message":"It\u0027s not- in the previous version this fell out of the end of the two else clauses and hit the implied return at the end of the method. Since there is now new logic after the else\u0027s we have to return here to keep the behavior.","commit_id":"27a0c8e0cf4e20af367d4e6a746132c3f3a95712"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f49e3a9d007e01c14e4f835b56fb5db7bfe40702","unresolved":false,"context_lines":[{"line_number":352,"context_line":"        :type session: keystoneauth1.session.Session"},{"line_number":353,"context_line":"        :param tuple version: The minimum version number required for this"},{"line_number":354,"context_line":"                              endpoint. (optional)"},{"line_number":355,"context_line":"        :param string project_id: ID of the currently scoped project. Used for"},{"line_number":356,"context_line":"                                  removing project_id components of URLs from"},{"line_number":357,"context_line":"                                  the catalog. (optional)"},{"line_number":358,"context_line":"        :param dict allow: Extra filters to pass when discovering API"},{"line_number":359,"context_line":"                           versions. (optional)"},{"line_number":360,"context_line":"        :param bool allow_version_hack: Allow keystoneauth to hack up catalog"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_db6967f9","line":357,"range":{"start_line":355,"start_character":0,"end_line":357,"end_character":57},"updated":"2017-06-14 16:50:26.000000000","message":"I would like to see tests (see previous patch notes) that are expanded for this interface to cover now project_id.","commit_id":"4cecb1beac82a0e61901f7217ae6ddfda69eff4b"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"7a9f6223c04a9dbc3d070c5a26116e2d51eddaa8","unresolved":false,"context_lines":[{"line_number":474,"context_line":"            if url_parts[-1].startswith(\u0027v\u0027):"},{"line_number":475,"context_line":"                try:"},{"line_number":476,"context_line":"                    url_version \u003d normalize_version_number(url_parts[-1])"},{"line_number":477,"context_line":"                except Exception:"},{"line_number":478,"context_line":"                    pass"},{"line_number":479,"context_line":"            if url_version:"},{"line_number":480,"context_line":"                if version_match(version, url_version):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_3f3da08e","line":477,"updated":"2017-06-16 16:15:32.000000000","message":"There\u0027s not something a little more specific to catch here? e.g. TypeError?","commit_id":"4cecb1beac82a0e61901f7217ae6ddfda69eff4b"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"7a9f6223c04a9dbc3d070c5a26116e2d51eddaa8","unresolved":false,"context_lines":[{"line_number":516,"context_line":""},{"line_number":517,"context_line":"        :param str endpoint_data: the endpoint_data in question"},{"line_number":518,"context_line":"        :param bool allow_version_hack: Whether or not to allow version hacks"},{"line_number":519,"context_line":"                                        to be applied. (defaults to True)"},{"line_number":520,"context_line":""},{"line_number":521,"context_line":"        :returns: A potential unversioned url"},{"line_number":522,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_84534739","line":519,"updated":"2017-06-16 16:15:32.000000000","message":"It looks like both of these parameters got dropped","commit_id":"4cecb1beac82a0e61901f7217ae6ddfda69eff4b"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"7a9f6223c04a9dbc3d070c5a26116e2d51eddaa8","unresolved":false,"context_lines":[{"line_number":518,"context_line":"        :param bool allow_version_hack: Whether or not to allow version hacks"},{"line_number":519,"context_line":"                                        to be applied. (defaults to True)"},{"line_number":520,"context_line":""},{"line_number":521,"context_line":"        :returns: A potential unversioned url"},{"line_number":522,"context_line":"        \"\"\""},{"line_number":523,"context_line":"        return _VERSION_HACKS.get_discover_hack(self.service_type, self.url)"},{"line_number":524,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_6434abfc","line":521,"updated":"2017-06-16 16:15:32.000000000","message":"This is not at all clearer than the description before.","commit_id":"4cecb1beac82a0e61901f7217ae6ddfda69eff4b"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"cc8ed5eb0d956a5e3e7a12ca023dd61e4fb604db","unresolved":false,"context_lines":[{"line_number":86,"context_line":"            # a stringified version with a .0 added. If it\u0027s any other number,"},{"line_number":87,"context_line":"            # such as \u00271.1\u0027 - int(version) raises an Exception"},{"line_number":88,"context_line":"            version \u003d str(float(int(version)))"},{"line_number":89,"context_line":"        except Exception:"},{"line_number":90,"context_line":"            pass"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    # If it\u0027s an int, turn it into a float"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_cb2e3991","line":89,"range":{"start_line":89,"start_character":15,"end_line":89,"end_character":24},"updated":"2017-06-24 11:36:40.000000000","message":"not that important here but would be better practice to catch ValueError for all of these","commit_id":"34f62f85a0bb94e0f2bf27b75df23362e7b69896"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"820a4e75cb1aae8d086e671400776bccad65c204","unresolved":false,"context_lines":[{"line_number":86,"context_line":"            # a stringified version with a .0 added. If it\u0027s any other number,"},{"line_number":87,"context_line":"            # such as \u00271.1\u0027 - int(version) raises an Exception"},{"line_number":88,"context_line":"            version \u003d str(float(int(version)))"},{"line_number":89,"context_line":"        except Exception:"},{"line_number":90,"context_line":"            pass"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    # If it\u0027s an int, turn it into a float"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_eebfc35e","line":89,"range":{"start_line":89,"start_character":15,"end_line":89,"end_character":24},"in_reply_to":"5f201791_cb2e3991","updated":"2017-06-24 14:34:19.000000000","message":"Done","commit_id":"34f62f85a0bb94e0f2bf27b75df23362e7b69896"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"076e80c4e35f2a3eb0f15e42294edc6bbb7aac4d","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    # or something decidedly else."},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    # if it\u0027s a string from above break it on ."},{"line_number":103,"context_line":"    try:"},{"line_number":104,"context_line":"        return tuple(map(int, version.split(\u0027.\u0027)))"},{"line_number":105,"context_line":"    except Exception:"},{"line_number":106,"context_line":"        pass"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    # last attempt, maybe it\u0027s a list or iterable. Try it last because string"},{"line_number":109,"context_line":"    # is an iterable, so version\u003d\u003d\u002722\u0027 would become (\u00272\u0027, \u00272\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_673cffbe","line":106,"range":{"start_line":103,"start_character":0,"end_line":106,"end_character":12},"updated":"2017-06-23 23:09:30.000000000","message":"NIT this could be combined with the below logic, just split and let the next try/except block do it\u0027s work","commit_id":"34f62f85a0bb94e0f2bf27b75df23362e7b69896"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"820a4e75cb1aae8d086e671400776bccad65c204","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    # or something decidedly else."},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    # if it\u0027s a string from above break it on ."},{"line_number":103,"context_line":"    try:"},{"line_number":104,"context_line":"        return tuple(map(int, version.split(\u0027.\u0027)))"},{"line_number":105,"context_line":"    except Exception:"},{"line_number":106,"context_line":"        pass"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    # last attempt, maybe it\u0027s a list or iterable. Try it last because string"},{"line_number":109,"context_line":"    # is an iterable, so version\u003d\u003d\u002722\u0027 would become (\u00272\u0027, \u00272\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_0e8d5fd2","line":106,"range":{"start_line":103,"start_character":0,"end_line":106,"end_character":12},"in_reply_to":"5f201791_673cffbe","updated":"2017-06-24 14:34:19.000000000","message":"Done","commit_id":"34f62f85a0bb94e0f2bf27b75df23362e7b69896"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3600ffa5d46e481d0ef463901c0828bf619617d9","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    # if it\u0027s a string from above break it on ."},{"line_number":104,"context_line":"    if hasattr(version, \u0027split\u0027):"},{"line_number":105,"context_line":"        version \u003d version.split(\u0027.\u0027)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    # It\u0027s either an interable, or something else that makes us sad."},{"line_number":108,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_92833705","line":105,"range":{"start_line":105,"start_character":26,"end_line":105,"end_character":36},"updated":"2017-06-29 22:44:58.000000000","message":"Unless things like \u0027v1.2.3\u0027 are allowed, suggest .split(\u0027.\u0027, 1)","commit_id":"a4066a86b5658926c2d5a11726a3671ee7bfa034"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3600ffa5d46e481d0ef463901c0828bf619617d9","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    if hasattr(version, \u0027split\u0027):"},{"line_number":105,"context_line":"        version \u003d version.split(\u0027.\u0027)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    # It\u0027s either an interable, or something else that makes us sad."},{"line_number":108,"context_line":"    try:"},{"line_number":109,"context_line":"        return tuple(map(int, version))"},{"line_number":110,"context_line":"    except (TypeError, ValueError):"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_f2c5cb5c","line":107,"range":{"start_line":107,"start_character":21,"end_line":107,"end_character":30},"updated":"2017-06-29 22:44:58.000000000","message":"interable - an iterable of int()-ables?","commit_id":"a4066a86b5658926c2d5a11726a3671ee7bfa034"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3600ffa5d46e481d0ef463901c0828bf619617d9","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    # It\u0027s either an interable, or something else that makes us sad."},{"line_number":108,"context_line":"    try:"},{"line_number":109,"context_line":"        return tuple(map(int, version))"},{"line_number":110,"context_line":"    except (TypeError, ValueError):"},{"line_number":111,"context_line":"        pass"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_b20ab387","line":109,"range":{"start_line":109,"start_character":30,"end_line":109,"end_character":37},"updated":"2017-06-29 22:44:58.000000000","message":"If an \"interable\" `version` was passed into the method, we\u0027ll return its tuple here without checking its length.  E.g. (1,) or (1, 2, 3) could be returned, which I gather from above aren\u0027t supposed to be valid.","commit_id":"a4066a86b5658926c2d5a11726a3671ee7bfa034"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3600ffa5d46e481d0ef463901c0828bf619617d9","unresolved":false,"context_lines":[{"line_number":249,"context_line":"            min_microversion \u003d v.get(\u0027min_version\u0027) or None"},{"line_number":250,"context_line":"            if min_microversion:"},{"line_number":251,"context_line":"                min_microversion \u003d normalize_version_number(min_microversion)"},{"line_number":252,"context_line":"            max_microversion \u003d v.get(\u0027max_version\u0027, v.get(\u0027version\u0027)) or None"},{"line_number":253,"context_line":"            if max_microversion:"},{"line_number":254,"context_line":"                max_microversion \u003d normalize_version_number(max_microversion)"},{"line_number":255,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_f8512d10","line":252,"range":{"start_line":252,"start_character":37,"end_line":252,"end_character":67},"updated":"2017-06-29 22:44:58.000000000","message":"Will result in None if e.g.\n\n \"max_version\": \"\",\n \"version\": \"1.2\"","commit_id":"a4066a86b5658926c2d5a11726a3671ee7bfa034"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3600ffa5d46e481d0ef463901c0828bf619617d9","unresolved":false,"context_lines":[{"line_number":391,"context_line":""},{"line_number":392,"context_line":"        :param session: A session object that can be used for communication."},{"line_number":393,"context_line":"        :type session: keystoneauth1.session.Session"},{"line_number":394,"context_line":"        :param tuple version: The minimum major version required for this"},{"line_number":395,"context_line":"                              endpoint."},{"line_number":396,"context_line":"        :param string project_id: ID of the currently scoped project. Used for"},{"line_number":397,"context_line":"                                  removing project_id components of URLs from"},{"line_number":398,"context_line":"                                  the catalog. (optional)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_b804d57c","line":395,"range":{"start_line":394,"start_character":30,"end_line":395,"end_character":39},"updated":"2017-06-29 22:44:58.000000000","message":"So version ranges aren\u0027t handled yet?  https://review.openstack.org/#/c/459405/26/guidelines/consuming-catalog.rst@99","commit_id":"a4066a86b5658926c2d5a11726a3671ee7bfa034"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3600ffa5d46e481d0ef463901c0828bf619617d9","unresolved":false,"context_lines":[{"line_number":393,"context_line":"        :type session: keystoneauth1.session.Session"},{"line_number":394,"context_line":"        :param tuple version: The minimum major version required for this"},{"line_number":395,"context_line":"                              endpoint."},{"line_number":396,"context_line":"        :param string project_id: ID of the currently scoped project. Used for"},{"line_number":397,"context_line":"                                  removing project_id components of URLs from"},{"line_number":398,"context_line":"                                  the catalog. (optional)"},{"line_number":399,"context_line":"        :param dict allow: Extra filters to pass when discovering API"},{"line_number":400,"context_line":"                           versions. (optional)"},{"line_number":401,"context_line":"        :param bool allow_version_hack: Allow keystoneauth to hack up catalog"},{"line_number":402,"context_line":"                                        URLS to support older schemes."},{"line_number":403,"context_line":"                                        (optional, default True)"},{"line_number":404,"context_line":"        :param dict cache: A dict to be used for caching results in"},{"line_number":405,"context_line":"                           addition to caching them on the Session."},{"line_number":406,"context_line":"                           (optional)"},{"line_number":407,"context_line":"        :param bool authenticated: Include a token in the discovery call."},{"line_number":408,"context_line":"                                   (optional) Defaults to False."},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"        :raises keystoneauth1.exceptions.http.HttpError: An error from an"},{"line_number":411,"context_line":"                                                         invalid HTTP response."}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_38b56532","line":408,"range":{"start_line":396,"start_character":0,"end_line":408,"end_character":64},"updated":"2017-06-29 22:44:58.000000000","message":"Any reason these are in random order?","commit_id":"a4066a86b5658926c2d5a11726a3671ee7bfa034"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3600ffa5d46e481d0ef463901c0828bf619617d9","unresolved":false,"context_lines":[{"line_number":406,"context_line":"                           (optional)"},{"line_number":407,"context_line":"        :param bool authenticated: Include a token in the discovery call."},{"line_number":408,"context_line":"                                   (optional) Defaults to False."},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"        :raises keystoneauth1.exceptions.http.HttpError: An error from an"},{"line_number":411,"context_line":"                                                         invalid HTTP response."},{"line_number":412,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_1884e95d","line":409,"updated":"2017-06-29 22:44:58.000000000","message":"doc :return: value","commit_id":"a4066a86b5658926c2d5a11726a3671ee7bfa034"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3600ffa5d46e481d0ef463901c0828bf619617d9","unresolved":false,"context_lines":[{"line_number":407,"context_line":"        :param bool authenticated: Include a token in the discovery call."},{"line_number":408,"context_line":"                                   (optional) Defaults to False."},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"        :raises keystoneauth1.exceptions.http.HttpError: An error from an"},{"line_number":411,"context_line":"                                                         invalid HTTP response."},{"line_number":412,"context_line":"        \"\"\""},{"line_number":413,"context_line":"        if not allow:"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_f8a5adb6","line":410,"range":{"start_line":410,"start_character":46,"end_line":410,"end_character":55},"updated":"2017-06-29 22:44:58.000000000","message":"DiscoveryFailure","commit_id":"a4066a86b5658926c2d5a11726a3671ee7bfa034"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3600ffa5d46e481d0ef463901c0828bf619617d9","unresolved":false,"context_lines":[{"line_number":442,"context_line":""},{"line_number":443,"context_line":"            if vers_url in tried:"},{"line_number":444,"context_line":"                continue"},{"line_number":445,"context_line":"            tried.update(vers_url)"},{"line_number":446,"context_line":"            try:"},{"line_number":447,"context_line":"                disc \u003d get_discovery(session, vers_url,"},{"line_number":448,"context_line":"                                     cache\u003dcache,"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_78f51dcb","line":445,"range":{"start_line":445,"start_character":12,"end_line":445,"end_character":34},"updated":"2017-06-29 22:44:58.000000000","message":"If `vers_url` is a string, `tried` will wind up being a set of individual characters, and `vers_url in tried` will only be True for one-character URLs (read: never).  I think you wanted tried.add(vers_url).  (And a unit test for same.)","commit_id":"a4066a86b5658926c2d5a11726a3671ee7bfa034"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3600ffa5d46e481d0ef463901c0828bf619617d9","unresolved":false,"context_lines":[{"line_number":451,"context_line":"            except (exceptions.DiscoveryFailure,"},{"line_number":452,"context_line":"                    exceptions.HttpError,"},{"line_number":453,"context_line":"                    exceptions.ConnectionError):"},{"line_number":454,"context_line":"                continue"},{"line_number":455,"context_line":"        if not disc:"},{"line_number":456,"context_line":"            # We couldn\u0027t find a version discovery document anywhere."},{"line_number":457,"context_line":"            if self._catalog_matches_version:"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_78e3dd06","line":454,"range":{"start_line":454,"start_character":16,"end_line":454,"end_character":24},"updated":"2017-06-29 22:44:58.000000000","message":"or `pass`","commit_id":"a4066a86b5658926c2d5a11726a3671ee7bfa034"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3600ffa5d46e481d0ef463901c0828bf619617d9","unresolved":false,"context_lines":[{"line_number":532,"context_line":"                if version_match(version, url_version):"},{"line_number":533,"context_line":"                    self._catalog_matches_version \u003d True"},{"line_number":534,"context_line":"                    # This endpoint matches the version request, try it first"},{"line_number":535,"context_line":"                    yield urllib.parse.ParseResult("},{"line_number":536,"context_line":"                        url.scheme,"},{"line_number":537,"context_line":"                        url.netloc,"},{"line_number":538,"context_line":"                        \u0027/\u0027.join(url_parts),"},{"line_number":539,"context_line":"                        url.params,"},{"line_number":540,"context_line":"                        url.query,"},{"line_number":541,"context_line":"                        url.fragment).geturl()"},{"line_number":542,"context_line":"                url_parts.pop()"},{"line_number":543,"context_line":""},{"line_number":544,"context_line":"            # If there were projects or versions in the url they are now gone."}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_b8605534","line":541,"range":{"start_line":535,"start_character":0,"end_line":541,"end_character":46},"updated":"2017-06-29 22:44:58.000000000","message":"Seems worth refactoring into a helper method, since it\u0027s used more than once (thrice in the latest patch).","commit_id":"a4066a86b5658926c2d5a11726a3671ee7bfa034"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3600ffa5d46e481d0ef463901c0828bf619617d9","unresolved":false,"context_lines":[{"line_number":554,"context_line":"            # NOTE(mordred): For backwards compatibility people might have"},{"line_number":555,"context_line":"            # added version hacks using the version hack system. The logic"},{"line_number":556,"context_line":"            # above should handle most cases, so by the time we get here it\u0027s"},{"line_number":557,"context_line":"            # most likely to be a no-op"},{"line_number":558,"context_line":"            yield self._get_catalog_discover_hack()"},{"line_number":559,"context_line":""},{"line_number":560,"context_line":"        # As a final fallthrough case, add the url from the catalog. If hacks"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_38044517","line":557,"range":{"start_line":557,"start_character":34,"end_line":557,"end_character":39},"updated":"2017-06-29 22:44:58.000000000","message":"Well... not a no-op.  From what I can tell, self._get_catalog_discover_hack() will return self.url in the degenerative case.  If there wasn\u0027t a project_id or url_version, that\u0027ll duplicate the last geturl() block above.  I guess it would get filtered out on L445 in that case (once the set logic is fixed).  But you could also say\n\n hacked \u003d self._get_catalog_discover_hack()\n if hacked !\u003d self.url:\n     yield hacked","commit_id":"a4066a86b5658926c2d5a11726a3671ee7bfa034"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"ce7665be7cac946fba0e50e579476b0996fbc99d","unresolved":false,"context_lines":[{"line_number":569,"context_line":"        :param bool allow_version_hack: Whether or not to allow version hacks"},{"line_number":570,"context_line":"                                        to be applied. (defaults to True)"},{"line_number":571,"context_line":""},{"line_number":572,"context_line":"        :returns: A potential unversioned url"},{"line_number":573,"context_line":"        \"\"\""},{"line_number":574,"context_line":"        return _VERSION_HACKS.get_discover_hack(self.service_type, self.url)"},{"line_number":575,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"5f201791_321f3d5c","line":572,"range":{"start_line":572,"start_character":18,"end_line":572,"end_character":45},"updated":"2017-06-26 19:18:46.000000000","message":"this is still not very descriptive","commit_id":"a4066a86b5658926c2d5a11726a3671ee7bfa034"}],"keystoneauth1/fixture/discovery.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3600ffa5d46e481d0ef463901c0828bf619617d9","unresolved":false,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"class MicroversionDiscovery(DiscoveryBase):"},{"line_number":117,"context_line":"    \"\"\"A Version element for that has microversions."},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    Provides some default values and helper methods for creating a microversion"},{"line_number":120,"context_line":"    endpoint version structure. Clients should use this instead of creating"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_1bff4302","line":117,"range":{"start_line":117,"start_character":25,"end_line":117,"end_character":28},"updated":"2017-06-29 22:44:58.000000000","message":"strike","commit_id":"a4066a86b5658926c2d5a11726a3671ee7bfa034"}],"keystoneauth1/tests/unit/identity/test_identity_common.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"076e80c4e35f2a3eb0f15e42294edc6bbb7aac4d","unresolved":false,"context_lines":[{"line_number":447,"context_line":"            href\u003dself.TEST_VOLUME_V3_SERVICE_PUBLIC,"},{"line_number":448,"context_line":"            id\u003d\u0027v3.0\u0027, status\u003d\u0027CURRENT\u0027,"},{"line_number":449,"context_line":"            min_version\u003d\u00273.0\u0027, max_version\u003d\u00273.20\u0027)"},{"line_number":450,"context_line":"        # Don\u0027t be surprised, this, is actually a real thing"},{"line_number":451,"context_line":"        v2 \u003d fixture.VersionDiscovery("},{"line_number":452,"context_line":"            href\u003dself.TEST_VOLUME_V2_SERVICE_PUBLIC,"},{"line_number":453,"context_line":"            id\u003d\u0027v2.0\u0027, status\u003d\u0027SUPPORTED\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_e7500f0d","line":450,"range":{"start_line":450,"start_character":10,"end_line":450,"end_character":60},"updated":"2017-06-23 23:09:30.000000000","message":"(NIT): This is not a useful comment.","commit_id":"34f62f85a0bb94e0f2bf27b75df23362e7b69896"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"820a4e75cb1aae8d086e671400776bccad65c204","unresolved":false,"context_lines":[{"line_number":447,"context_line":"            href\u003dself.TEST_VOLUME_V3_SERVICE_PUBLIC,"},{"line_number":448,"context_line":"            id\u003d\u0027v3.0\u0027, status\u003d\u0027CURRENT\u0027,"},{"line_number":449,"context_line":"            min_version\u003d\u00273.0\u0027, max_version\u003d\u00273.20\u0027)"},{"line_number":450,"context_line":"        # Don\u0027t be surprised, this, is actually a real thing"},{"line_number":451,"context_line":"        v2 \u003d fixture.VersionDiscovery("},{"line_number":452,"context_line":"            href\u003dself.TEST_VOLUME_V2_SERVICE_PUBLIC,"},{"line_number":453,"context_line":"            id\u003d\u0027v2.0\u0027, status\u003d\u0027SUPPORTED\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_4e5eb744","line":450,"range":{"start_line":450,"start_character":10,"end_line":450,"end_character":60},"in_reply_to":"5f201791_e7500f0d","updated":"2017-06-24 14:34:19.000000000","message":"Done","commit_id":"34f62f85a0bb94e0f2bf27b75df23362e7b69896"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"ce7665be7cac946fba0e50e579476b0996fbc99d","unresolved":false,"context_lines":[{"line_number":543,"context_line":"        resps \u003d [{\u0027json\u0027: disc}, {\u0027status_code\u0027: 500}]"},{"line_number":544,"context_line":"        self.requests_mock.get(self.TEST_VOLUME_V3_SERVICE_PUBLIC, resps)"},{"line_number":545,"context_line":""},{"line_number":546,"context_line":"        body \u003d \u0027SUCCESS\u0027"},{"line_number":547,"context_line":"        self.stub_url(\u0027GET\u0027, [\u0027path\u0027], text\u003dbody)"},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"        a \u003d self.create_auth_plugin()"},{"line_number":550,"context_line":"        s \u003d session.Session(auth\u003da)"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f201791_bede79d7","line":547,"range":{"start_line":546,"start_character":8,"end_line":547,"end_character":49},"updated":"2017-06-26 19:18:46.000000000","message":"not needed","commit_id":"a4066a86b5658926c2d5a11726a3671ee7bfa034"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"7cff602cd5d21cc9c518fc1bdef5dcc5cb161d87","unresolved":false,"context_lines":[{"line_number":543,"context_line":"        resps \u003d [{\u0027json\u0027: disc}, {\u0027status_code\u0027: 500}]"},{"line_number":544,"context_line":"        self.requests_mock.get(self.TEST_VOLUME_V3_SERVICE_PUBLIC, resps)"},{"line_number":545,"context_line":""},{"line_number":546,"context_line":"        body \u003d \u0027SUCCESS\u0027"},{"line_number":547,"context_line":"        self.stub_url(\u0027GET\u0027, [\u0027path\u0027], text\u003dbody)"},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"        a \u003d self.create_auth_plugin()"},{"line_number":550,"context_line":"        s \u003d session.Session(auth\u003da)"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f201791_12ba016d","line":547,"range":{"start_line":546,"start_character":8,"end_line":547,"end_character":49},"in_reply_to":"5f201791_bede79d7","updated":"2017-06-26 19:53:11.000000000","message":"Done","commit_id":"a4066a86b5658926c2d5a11726a3671ee7bfa034"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"ce7665be7cac946fba0e50e579476b0996fbc99d","unresolved":false,"context_lines":[{"line_number":599,"context_line":"        resps \u003d [{\u0027json\u0027: disc}, {\u0027status_code\u0027: 500}]"},{"line_number":600,"context_line":"        self.requests_mock.get(self.TEST_VOLUME_V3_SERVICE_PUBLIC, resps)"},{"line_number":601,"context_line":""},{"line_number":602,"context_line":"        body \u003d \u0027SUCCESS\u0027"},{"line_number":603,"context_line":"        self.stub_url(\u0027GET\u0027, [\u0027path\u0027], text\u003dbody)"},{"line_number":604,"context_line":""},{"line_number":605,"context_line":"        a \u003d self.create_auth_plugin()"},{"line_number":606,"context_line":"        s \u003d session.Session(auth\u003da)"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f201791_5eb5257d","line":603,"range":{"start_line":602,"start_character":8,"end_line":603,"end_character":49},"updated":"2017-06-26 19:18:46.000000000","message":"not needed","commit_id":"a4066a86b5658926c2d5a11726a3671ee7bfa034"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"7cff602cd5d21cc9c518fc1bdef5dcc5cb161d87","unresolved":false,"context_lines":[{"line_number":599,"context_line":"        resps \u003d [{\u0027json\u0027: disc}, {\u0027status_code\u0027: 500}]"},{"line_number":600,"context_line":"        self.requests_mock.get(self.TEST_VOLUME_V3_SERVICE_PUBLIC, resps)"},{"line_number":601,"context_line":""},{"line_number":602,"context_line":"        body \u003d \u0027SUCCESS\u0027"},{"line_number":603,"context_line":"        self.stub_url(\u0027GET\u0027, [\u0027path\u0027], text\u003dbody)"},{"line_number":604,"context_line":""},{"line_number":605,"context_line":"        a \u003d self.create_auth_plugin()"},{"line_number":606,"context_line":"        s \u003d session.Session(auth\u003da)"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f201791_f2b2e593","line":603,"range":{"start_line":602,"start_character":8,"end_line":603,"end_character":49},"in_reply_to":"5f201791_5eb5257d","updated":"2017-06-26 19:53:11.000000000","message":"Done","commit_id":"a4066a86b5658926c2d5a11726a3671ee7bfa034"}],"keystoneauth1/tests/unit/test_discovery.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"076e80c4e35f2a3eb0f15e42294edc6bbb7aac4d","unresolved":false,"context_lines":[{"line_number":277,"context_line":"        assertVersion(\u00271\u0027, (1, 0))"},{"line_number":278,"context_line":"        assertVersion(1, (1, 0))"},{"line_number":279,"context_line":"        assertVersion(5.2, (5, 2))"},{"line_number":280,"context_line":"        assertVersion(\u00273.20\u0027, (3, 20))"},{"line_number":281,"context_line":"        assertVersion((6, 1), (6, 1))"},{"line_number":282,"context_line":"        assertVersion([1, 4], (1, 4))"},{"line_number":283,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_a75a1727","line":280,"range":{"start_line":280,"start_character":8,"end_line":280,"end_character":38},"updated":"2017-06-23 23:09:30.000000000","message":"Good!","commit_id":"34f62f85a0bb94e0f2bf27b75df23362e7b69896"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"80c30f5130ceebdead6dfc01666f1c6fb0ed5b67","unresolved":false,"context_lines":[{"line_number":153,"context_line":"            \"status\": \"CURRENT\","},{"line_number":154,"context_line":"            \"updated\": \"2012-11-21T11:33:21Z\","},{"line_number":155,"context_line":"            \"id\": \"v3.0\","},{"line_number":156,"context_line":"            \"max_version\": \"3.27\","},{"line_number":157,"context_line":"            \"min_version\": \"3.0\","},{"line_number":158,"context_line":"            \"links\": ["},{"line_number":159,"context_line":"                {"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f201791_194feb34","line":156,"range":{"start_line":156,"start_character":13,"end_line":156,"end_character":24},"updated":"2017-06-24 15:19:16.000000000","message":"The real cinder just uses \"version\", would it not be better to follow that here? (and demonstrate that this feature works even when the versions API doesn\u0027t conform to the api-wg spec)","commit_id":"6f9c62b8b9cb9b5bdadea447966e18bd0469fbb4"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"08f751ae7b25971173e1b36d2ef1712fdb21a70c","unresolved":false,"context_lines":[{"line_number":153,"context_line":"            \"status\": \"CURRENT\","},{"line_number":154,"context_line":"            \"updated\": \"2012-11-21T11:33:21Z\","},{"line_number":155,"context_line":"            \"id\": \"v3.0\","},{"line_number":156,"context_line":"            \"max_version\": \"3.27\","},{"line_number":157,"context_line":"            \"min_version\": \"3.0\","},{"line_number":158,"context_line":"            \"links\": ["},{"line_number":159,"context_line":"                {"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f201791_94ce22b2","line":156,"range":{"start_line":156,"start_character":13,"end_line":156,"end_character":24},"in_reply_to":"5f201791_194feb34","updated":"2017-06-24 19:06:27.000000000","message":"Yes. Yes it would.","commit_id":"6f9c62b8b9cb9b5bdadea447966e18bd0469fbb4"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3600ffa5d46e481d0ef463901c0828bf619617d9","unresolved":false,"context_lines":[{"line_number":290,"context_line":"        assertVersion(\u0027v1.2\u0027, (1, 2))"},{"line_number":291,"context_line":"        assertVersion(\u0027v11\u0027, (11, 0))"},{"line_number":292,"context_line":"        assertVersion(\u00271.2\u0027, (1, 2))"},{"line_number":293,"context_line":"        assertVersion(\u00271.5.1\u0027, (1, 5, 1))"},{"line_number":294,"context_line":"        assertVersion(\u00271\u0027, (1, 0))"},{"line_number":295,"context_line":"        assertVersion(1, (1, 0))"},{"line_number":296,"context_line":"        assertVersion(5.2, (5, 2))"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_db6f8bc3","line":293,"range":{"start_line":293,"start_character":22,"end_line":293,"end_character":40},"updated":"2017-06-29 22:44:58.000000000","message":"hmph, I guess this is allowed?","commit_id":"a4066a86b5658926c2d5a11726a3671ee7bfa034"}]}
