)]}'
{"keystoneauth1/discover.py":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"9ee7b148de195714a3650c14211a903a827fc5d5","unresolved":false,"context_lines":[{"line_number":298,"context_line":"    if candidate is None:"},{"line_number":299,"context_line":"        raise ValueError(\"candidate cannot be None.\")"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"    if min_version is not None and not is_normalized(min_version):"},{"line_number":302,"context_line":"        raise ValueError(\"min_version is not normalized.\")"},{"line_number":303,"context_line":"    if max_version is not None and not is_normalized(max_version):"},{"line_number":304,"context_line":"        raise ValueError(\"max_version is not normalized.\")"},{"line_number":305,"context_line":"    if not is_normalized(candidate):"},{"line_number":306,"context_line":"        raise ValueError(\"candidate is not normalized.\")"},{"line_number":307,"context_line":"    # This is only possible if args weren\u0027t run through _normalize_version_args"},{"line_number":308,"context_line":"    if max_version is None and min_version is not None:"},{"line_number":309,"context_line":"        raise ValueError(\"Can\u0027t use None as an upper bound.\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"1f1a1f67_1921de9f","line":306,"range":{"start_line":301,"start_character":0,"end_line":306,"end_character":56},"updated":"2017-07-18 22:27:16.000000000","message":"Why did this change? I used to be able to take care of normalization.","commit_id":"71b80b73c5083aee2ec5d558a2c51794088b2412"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b7326549588713f194f78b17209819185cfead2e","unresolved":false,"context_lines":[{"line_number":298,"context_line":"    if candidate is None:"},{"line_number":299,"context_line":"        raise ValueError(\"candidate cannot be None.\")"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"    if min_version is not None and not is_normalized(min_version):"},{"line_number":302,"context_line":"        raise ValueError(\"min_version is not normalized.\")"},{"line_number":303,"context_line":"    if max_version is not None and not is_normalized(max_version):"},{"line_number":304,"context_line":"        raise ValueError(\"max_version is not normalized.\")"},{"line_number":305,"context_line":"    if not is_normalized(candidate):"},{"line_number":306,"context_line":"        raise ValueError(\"candidate is not normalized.\")"},{"line_number":307,"context_line":"    # This is only possible if args weren\u0027t run through _normalize_version_args"},{"line_number":308,"context_line":"    if max_version is None and min_version is not None:"},{"line_number":309,"context_line":"        raise ValueError(\"Can\u0027t use None as an upper bound.\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"1f1a1f67_431be471","line":306,"range":{"start_line":301,"start_character":0,"end_line":306,"end_character":56},"in_reply_to":"1f1a1f67_1921de9f","updated":"2017-07-19 13:37:33.000000000","message":"When you say \"used to\" - this method is not in a release yet.\n\nAre you suggesting this method should normalize the args before comparing them?\n\nSince this way is more restrictive, and you\u0027re AFK, I\u0027ll leave it for now and we can loosen it up in a followon if needed.","commit_id":"71b80b73c5083aee2ec5d558a2c51794088b2412"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"1b13e5e8507dcf3c890d864ef22dd1e1ae33045e","unresolved":false,"context_lines":[{"line_number":298,"context_line":"    if candidate is None:"},{"line_number":299,"context_line":"        raise ValueError(\"candidate cannot be None.\")"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"    if min_version is not None and not is_normalized(min_version):"},{"line_number":302,"context_line":"        raise ValueError(\"min_version is not normalized.\")"},{"line_number":303,"context_line":"    if max_version is not None and not is_normalized(max_version):"},{"line_number":304,"context_line":"        raise ValueError(\"max_version is not normalized.\")"},{"line_number":305,"context_line":"    if not is_normalized(candidate):"},{"line_number":306,"context_line":"        raise ValueError(\"candidate is not normalized.\")"},{"line_number":307,"context_line":"    # This is only possible if args weren\u0027t run through _normalize_version_args"},{"line_number":308,"context_line":"    if max_version is None and min_version is not None:"},{"line_number":309,"context_line":"        raise ValueError(\"Can\u0027t use None as an upper bound.\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"1f1a1f67_e71f6a6e","line":306,"range":{"start_line":301,"start_character":0,"end_line":306,"end_character":56},"in_reply_to":"1f1a1f67_431be471","updated":"2017-07-20 07:28:22.000000000","message":"Sorry I meant \"it used to\" not \"I used to\"\n\nNo it\u0027s not released yet, but the patch changes the code from taking care of normalizing the arguments for me to rejecting unnormalized arguments, and I\u0027d like to know the reason for doing that. It seems like an unnecessary user hinderance to me, since this is a public method and a developer could conceivably want to call `discover.version_between(\u0027v2.0\u0027, \u0027v2.25\u0027, \u0027v2.13\u0027)`","commit_id":"71b80b73c5083aee2ec5d558a2c51794088b2412"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7681a018fc154071c02517d7151e398922316c67","unresolved":false,"context_lines":[{"line_number":298,"context_line":"    if candidate is None:"},{"line_number":299,"context_line":"        raise ValueError(\"candidate cannot be None.\")"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"    if min_version is not None and not is_normalized(min_version):"},{"line_number":302,"context_line":"        raise ValueError(\"min_version is not normalized.\")"},{"line_number":303,"context_line":"    if max_version is not None and not is_normalized(max_version):"},{"line_number":304,"context_line":"        raise ValueError(\"max_version is not normalized.\")"},{"line_number":305,"context_line":"    if not is_normalized(candidate):"},{"line_number":306,"context_line":"        raise ValueError(\"candidate is not normalized.\")"},{"line_number":307,"context_line":"    # This is only possible if args weren\u0027t run through _normalize_version_args"},{"line_number":308,"context_line":"    if max_version is None and min_version is not None:"},{"line_number":309,"context_line":"        raise ValueError(\"Can\u0027t use None as an upper bound.\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"1f1a1f67_5dd92f20","line":306,"range":{"start_line":301,"start_character":0,"end_line":306,"end_character":56},"in_reply_to":"1f1a1f67_e71f6a6e","updated":"2017-07-20 21:11:07.000000000","message":"https://review.openstack.org/#/c/485827/","commit_id":"71b80b73c5083aee2ec5d558a2c51794088b2412"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"9ee7b148de195714a3650c14211a903a827fc5d5","unresolved":false,"context_lines":[{"line_number":310,"context_line":""},{"line_number":311,"context_line":"    # Special case: if min is latest, give candidate the benefit of the doubt"},{"line_number":312,"context_line":"    if min_version \u003d\u003d (LATEST, LATEST):"},{"line_number":313,"context_line":"        return True"},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"    # If the candidate is less than the min_version, it\u0027s"},{"line_number":316,"context_line":"    # not a match.  None works here."}],"source_content_type":"text/x-python","patch_set":9,"id":"1f1a1f67_b93e6ab5","line":313,"updated":"2017-07-18 22:27:16.000000000","message":"That doesn\u0027t make sense, if min is latest and candidate is anything except latest then it should be rejected.\n\nWe\u0027re raising ValueError in _normalize_version_args if min is latest and max is not, but this is a public method and the arguments might not have gone through _normalize_version_args.","commit_id":"71b80b73c5083aee2ec5d558a2c51794088b2412"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b7326549588713f194f78b17209819185cfead2e","unresolved":false,"context_lines":[{"line_number":310,"context_line":""},{"line_number":311,"context_line":"    # Special case: if min is latest, give candidate the benefit of the doubt"},{"line_number":312,"context_line":"    if min_version \u003d\u003d (LATEST, LATEST):"},{"line_number":313,"context_line":"        return True"},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"    # If the candidate is less than the min_version, it\u0027s"},{"line_number":316,"context_line":"    # not a match.  None works here."}],"source_content_type":"text/x-python","patch_set":9,"id":"1f1a1f67_833e9cbe","line":313,"in_reply_to":"1f1a1f67_b93e6ab5","updated":"2017-07-19 13:37:33.000000000","message":"You\u0027re right, this does seem odd.  It\u0027s necessary for some of the discovery logic (because we can\u0027t know if a specific version is actually the latest), but I reckon we should pull it out into those cases as an explicit check instead.\n\n[Later] I was wrong about discovery code needing this (or maybe it already has it taken into account.  Removed.","commit_id":"71b80b73c5083aee2ec5d558a2c51794088b2412"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"9ee7b148de195714a3650c14211a903a827fc5d5","unresolved":false,"context_lines":[{"line_number":594,"context_line":"        for data in version_data:"},{"line_number":595,"context_line":"            if url and data[\u0027url\u0027] and data[\u0027url\u0027].rstrip(\u0027/\u0027) + \u0027/\u0027 \u003d\u003d url:"},{"line_number":596,"context_line":"                return data"},{"line_number":597,"context_line":"            if version_between(min_version, max_version, data[\u0027version\u0027]):"},{"line_number":598,"context_line":"                return data"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"        # If there is no version requested and we could not find a matching"}],"source_content_type":"text/x-python","patch_set":9,"id":"1f1a1f67_3dbec5fe","line":597,"updated":"2017-07-18 22:27:16.000000000","message":"There seems to be a logic error here, which you can see if you pass in min_version\u003d\u00272.latest\u0027 with no max_version to the adapter or the session. The latest version, e.g. 2.1, is not between (2, LATEST) and (LATEST, LATEST), and so a get_endpoint() call results in None.\n\nA similar issue appears if you try to pass in version\u003d\u00272.latest\u0027. That should probably get rejected as nonsensical but instead it gets transformed into the min_version and the same problem happens.","commit_id":"71b80b73c5083aee2ec5d558a2c51794088b2412"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b7326549588713f194f78b17209819185cfead2e","unresolved":false,"context_lines":[{"line_number":594,"context_line":"        for data in version_data:"},{"line_number":595,"context_line":"            if url and data[\u0027url\u0027] and data[\u0027url\u0027].rstrip(\u0027/\u0027) + \u0027/\u0027 \u003d\u003d url:"},{"line_number":596,"context_line":"                return data"},{"line_number":597,"context_line":"            if version_between(min_version, max_version, data[\u0027version\u0027]):"},{"line_number":598,"context_line":"                return data"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"        # If there is no version requested and we could not find a matching"}],"source_content_type":"text/x-python","patch_set":9,"id":"1f1a1f67_db5c621a","line":597,"in_reply_to":"1f1a1f67_3dbec5fe","updated":"2017-07-19 13:37:33.000000000","message":"So you can\u0027t pass in version\u003d\u00272.latest\u0027 - at least not here.\n\nIf you say min_version\u003d\u00272.latest\u0027, max_version\u003dNone, a reasonable interpretation is that you\u0027re okay with max_version\u003d\u0027latest\u0027, no?\n\nThat said, you\u0027re right that that doesn\u0027t work.  I added some test cases to demonstrate it.  Will investigate further.","commit_id":"71b80b73c5083aee2ec5d558a2c51794088b2412"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"db88c6359c261c2cb8e0c1f00aa81cafabf354df","unresolved":false,"context_lines":[{"line_number":594,"context_line":"        for data in version_data:"},{"line_number":595,"context_line":"            if url and data[\u0027url\u0027] and data[\u0027url\u0027].rstrip(\u0027/\u0027) + \u0027/\u0027 \u003d\u003d url:"},{"line_number":596,"context_line":"                return data"},{"line_number":597,"context_line":"            if version_between(min_version, max_version, data[\u0027version\u0027]):"},{"line_number":598,"context_line":"                return data"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"        # If there is no version requested and we could not find a matching"}],"source_content_type":"text/x-python","patch_set":9,"id":"1f1a1f67_27769471","line":597,"in_reply_to":"1f1a1f67_db5c621a","updated":"2017-07-19 17:40:08.000000000","message":"This was a great find, cmurphy!  Fixed in PS11.","commit_id":"71b80b73c5083aee2ec5d558a2c51794088b2412"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c19ea5452f0802720b59d1f48080f4c66f063c50","unresolved":false,"context_lines":[{"line_number":345,"context_line":"    return True"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"def _latest_soft_match(required, candidate):"},{"line_number":349,"context_line":"    if not required:"},{"line_number":350,"context_line":"        return False"},{"line_number":351,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_07927857","line":348,"range":{"start_line":348,"start_character":4,"end_line":348,"end_character":22},"updated":"2017-07-19 17:46:36.000000000","message":"Although it\u0027s crystal clear from the way this is used, it wouldn\u0027t hurt to document it (in a followon).","commit_id":"699fac136faa621d756096352850d2ef8507ef79"}],"keystoneauth1/identity/base.py":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"9ee7b148de195714a3650c14211a903a827fc5d5","unresolved":false,"context_lines":[{"line_number":216,"context_line":"                                      but version discovery will be run."},{"line_number":217,"context_line":"                                      Sets allow_version_hack to False"},{"line_number":218,"context_line":"                                      (optional)"},{"line_number":219,"context_line":"        :param kwargs: Ignored."},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"        :raises keystoneauth1.exceptions.http.HttpError: An error from an"},{"line_number":222,"context_line":"                                                         invalid HTTP response."}],"source_content_type":"text/x-python","patch_set":9,"id":"1f1a1f67_f9b742f4","line":219,"updated":"2017-07-18 22:27:16.000000000","message":"While we can still change this method signature we might as well just remove this argument? (in a separate patch)","commit_id":"71b80b73c5083aee2ec5d558a2c51794088b2412"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b7326549588713f194f78b17209819185cfead2e","unresolved":false,"context_lines":[{"line_number":216,"context_line":"                                      but version discovery will be run."},{"line_number":217,"context_line":"                                      Sets allow_version_hack to False"},{"line_number":218,"context_line":"                                      (optional)"},{"line_number":219,"context_line":"        :param kwargs: Ignored."},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"        :raises keystoneauth1.exceptions.http.HttpError: An error from an"},{"line_number":222,"context_line":"                                                         invalid HTTP response."}],"source_content_type":"text/x-python","patch_set":9,"id":"1f1a1f67_440bd828","line":219,"in_reply_to":"1f1a1f67_f9b742f4","updated":"2017-07-19 13:37:33.000000000","message":"It\u0027s here to permit kwargs we don\u0027t actually use in this method, but which tend to get passed along with a kwargs clump that percolates from higher-level methods.  (I already tried removing it previously :)","commit_id":"71b80b73c5083aee2ec5d558a2c51794088b2412"}],"keystoneauth1/session.py":[{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"921a8b917e25dafe5c5e8b4d6f105906d79f8afb","unresolved":false,"context_lines":[{"line_number":420,"context_line":"        # Can\u0027t specify a LATEST microversion"},{"line_number":421,"context_line":"        if discover.LATEST in microversion:"},{"line_number":422,"context_line":"            raise TypeError("},{"line_number":423,"context_line":"                \"Specifying a \u0027latest\u0027 microversion is not allowed.\")"},{"line_number":424,"context_line":"        if not service_type:"},{"line_number":425,"context_line":"            if endpoint_filter and \u0027service_type\u0027 in endpoint_filter:"},{"line_number":426,"context_line":"                service_type \u003d endpoint_filter[\u0027service_type\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"1f1a1f67_000dec8e","line":423,"updated":"2017-07-18 17:34:07.000000000","message":"It actually is:\n\nhttp://specs.openstack.org/openstack/api-wg/guidelines/microversion_specification.html#client-interaction\n\nnovaclient uses this - so if we want to eventually be able to remove specific logic in novaclient and just have ksa handle this, we need to allow it.","commit_id":"8f8faf41b41929a7406adb4b4037473a35b552ff"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9812aca11706c99828707d581fbb4d74f9ff6473","unresolved":false,"context_lines":[{"line_number":420,"context_line":"        # Can\u0027t specify a LATEST microversion"},{"line_number":421,"context_line":"        if discover.LATEST in microversion:"},{"line_number":422,"context_line":"            raise TypeError("},{"line_number":423,"context_line":"                \"Specifying a \u0027latest\u0027 microversion is not allowed.\")"},{"line_number":424,"context_line":"        if not service_type:"},{"line_number":425,"context_line":"            if endpoint_filter and \u0027service_type\u0027 in endpoint_filter:"},{"line_number":426,"context_line":"                service_type \u003d endpoint_filter[\u0027service_type\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"1f1a1f67_17b1afe1","line":423,"in_reply_to":"1f1a1f67_000dec8e","updated":"2017-07-18 18:27:56.000000000","message":"Done","commit_id":"8f8faf41b41929a7406adb4b4037473a35b552ff"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"bbc8a67bb7c9de1b7ee2e6f748161cba23f939f2","unresolved":false,"context_lines":[{"line_number":947,"context_line":"            return kwargs[\u0027endpoint_override\u0027]"},{"line_number":948,"context_line":""},{"line_number":949,"context_line":"        auth \u003d self._auth_required(auth, \u0027determine endpoint URL\u0027)"},{"line_number":950,"context_line":""},{"line_number":951,"context_line":"        return auth.get_endpoint(self, **kwargs)"},{"line_number":952,"context_line":""},{"line_number":953,"context_line":"    def get_endpoint_data(self, auth\u003dNone, **kwargs):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_4a3990ef","line":950,"updated":"2017-07-19 21:09:42.000000000","message":"Unrelated whitespace change?","commit_id":"699fac136faa621d756096352850d2ef8507ef79"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4264fd9c22df96f569c62b5f3685c13a36c918b2","unresolved":false,"context_lines":[{"line_number":947,"context_line":"            return kwargs[\u0027endpoint_override\u0027]"},{"line_number":948,"context_line":""},{"line_number":949,"context_line":"        auth \u003d self._auth_required(auth, \u0027determine endpoint URL\u0027)"},{"line_number":950,"context_line":""},{"line_number":951,"context_line":"        return auth.get_endpoint(self, **kwargs)"},{"line_number":952,"context_line":""},{"line_number":953,"context_line":"    def get_endpoint_data(self, auth\u003dNone, **kwargs):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_809789ec","line":950,"in_reply_to":"1f1a1f67_4a3990ef","updated":"2017-07-19 22:48:34.000000000","message":"Whoops, yeah, sorry.","commit_id":"699fac136faa621d756096352850d2ef8507ef79"}],"keystoneauth1/tests/unit/identity/test_identity_common.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"87c0c2097e4072c732e2890f126ddf4bf0aa2bd7","unresolved":false,"context_lines":[{"line_number":1326,"context_line":"        endpoint \u003d sess.get_endpoint(service_type\u003dself.IDENTITY,"},{"line_number":1327,"context_line":"                                     min_version\u003d\u00271\u0027, max_version\u003d\u00272\u0027)"},{"line_number":1328,"context_line":""},{"line_number":1329,"context_line":"        # We should make no calls - we peek in the cache"},{"line_number":1330,"context_line":"        self.assertFalse(v2_m.called)"},{"line_number":1331,"context_line":"        self.assertFalse(common_m.called)"},{"line_number":1332,"context_line":""},{"line_number":1333,"context_line":"        # And get the v2 url"}],"source_content_type":"text/x-python","patch_set":7,"id":"1f1a1f67_c6d84bf0","line":1330,"range":{"start_line":1329,"start_character":0,"end_line":1330,"end_character":37},"updated":"2017-07-18 02:30:52.000000000","message":"So I\u0027m a bit concerned about this one.  It makes sense to me that the data was already there, since we didn\u0027t reinit the auth or session since the previous get_endpoint(); and the common mock (which we pulled at that time) has both v2 and v3 data.  It\u0027s a change for the better... but it\u0027s a behavior change nevertheless.","commit_id":"67afb6e2d3466e6cc002c224358bee1eb39a0ad5"}],"keystoneauth1/tests/unit/test_discovery.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9a923692eae748a04709eaa19f721bdb7ce660e1","unresolved":false,"context_lines":[{"line_number":610,"context_line":"            self.assertEqual(v[\u0027raw_status\u0027], \u0027stable\u0027)"},{"line_number":611,"context_line":""},{"line_number":612,"context_line":"        for version in (disc.data_for(\u0027v3.0\u0027),"},{"line_number":613,"context_line":"                        disc.data_for(\u00273.latest\u0027),"},{"line_number":614,"context_line":"                        disc.versioned_data_for("},{"line_number":615,"context_line":"                            min_version\u003d\u0027v3.0\u0027, max_version\u003d\u0027v3.latest\u0027),"},{"line_number":616,"context_line":"                        disc.versioned_data_for(min_version\u003d\u00273\u0027),"}],"source_content_type":"text/x-python","patch_set":10,"id":"1f1a1f67_fbb6fe3d","line":613,"updated":"2017-07-19 13:39:01.000000000","message":"These new test cases are busted - need to figure them out.","commit_id":"61a8f54322b11b7c101949279c2bb35aaf0c6d86"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9a923692eae748a04709eaa19f721bdb7ce660e1","unresolved":false,"context_lines":[{"line_number":623,"context_line":"                        disc.data_for(\u00272.latest\u0027),"},{"line_number":624,"context_line":"                        disc.versioned_data_for("},{"line_number":625,"context_line":"                            min_version\u003d2, max_version\u003d(2, discover.LATEST)),"},{"line_number":626,"context_line":"                        disc.versioned_data_for(min_version\u003d2),"},{"line_number":627,"context_line":"                        disc.versioned_data_for(min_version\u003d\u00272.latest\u0027)):"},{"line_number":628,"context_line":"            self.assertEqual((2, 0), version[\u0027version\u0027])"},{"line_number":629,"context_line":"            self.assertEqual(\u0027stable\u0027, version[\u0027raw_status\u0027])"},{"line_number":630,"context_line":"            self.assertEqual(V2_URL, version[\u0027url\u0027])"}],"source_content_type":"text/x-python","patch_set":10,"id":"1f1a1f67_7b7c2e71","line":627,"range":{"start_line":626,"start_character":0,"end_line":627,"end_character":73},"updated":"2017-07-19 13:39:01.000000000","message":"Whoops, these two should be in the 3.0 loop above.","commit_id":"61a8f54322b11b7c101949279c2bb35aaf0c6d86"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c20059ba0d067802f65c3914aa8bb981e2457aa8","unresolved":false,"context_lines":[{"line_number":359,"context_line":"                       (1, 0), (1, discover.LATEST))"},{"line_number":360,"context_line":"        assert_min_max(\u0027latest\u0027, None, None,"},{"line_number":361,"context_line":"                       (discover.LATEST, discover.LATEST),"},{"line_number":362,"context_line":"                       (discover.LATEST, discover.LATEST))"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"        normalize_raises(\u0027v1\u0027, \u0027v2\u0027, None)"},{"line_number":365,"context_line":"        normalize_raises(\u0027v1\u0027, None, \u0027v2\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_d53306f5","line":362,"updated":"2017-07-19 18:43:00.000000000","message":"Breaking these into more granular test cases would help readability quite a bit. That\u0027s something we can do in a follow up, though.","commit_id":"699fac136faa621d756096352850d2ef8507ef79"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c324b7bb45386f7f3e51aab2ad47c62b02535045","unresolved":false,"context_lines":[{"line_number":359,"context_line":"                       (1, 0), (1, discover.LATEST))"},{"line_number":360,"context_line":"        assert_min_max(\u0027latest\u0027, None, None,"},{"line_number":361,"context_line":"                       (discover.LATEST, discover.LATEST),"},{"line_number":362,"context_line":"                       (discover.LATEST, discover.LATEST))"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"        normalize_raises(\u0027v1\u0027, \u0027v2\u0027, None)"},{"line_number":365,"context_line":"        normalize_raises(\u0027v1\u0027, None, \u0027v2\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7f287b81_fb50ff0c","line":362,"in_reply_to":"1f1a1f67_d53306f5","updated":"2017-09-01 22:01:37.000000000","message":"Are you suggesting creating actual separate test methods for each of these cases?  That would add 2LOC per test case and provide what value?  If you\u0027re saying you\u0027d like some descriptive way to tell what is being tested with each scenario, I suppose that could be done with comments.  Is that what you\u0027re getting at?","commit_id":"699fac136faa621d756096352850d2ef8507ef79"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d49dbd928ea962cd9da5d01effebd21c683d92c7","unresolved":false,"context_lines":[{"line_number":359,"context_line":"                       (1, 0), (1, discover.LATEST))"},{"line_number":360,"context_line":"        assert_min_max(\u0027latest\u0027, None, None,"},{"line_number":361,"context_line":"                       (discover.LATEST, discover.LATEST),"},{"line_number":362,"context_line":"                       (discover.LATEST, discover.LATEST))"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"        normalize_raises(\u0027v1\u0027, \u0027v2\u0027, None)"},{"line_number":365,"context_line":"        normalize_raises(\u0027v1\u0027, None, \u0027v2\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7f287b81_c3d64654","line":362,"in_reply_to":"7f287b81_1bcba74a","updated":"2017-09-05 11:58:36.000000000","message":"Yeah, okay, a fair point in theory, but IMO the cure is worse than the disease in this case.","commit_id":"699fac136faa621d756096352850d2ef8507ef79"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"610d2923f68d6a3134d9f31d5805ac0660b41651","unresolved":false,"context_lines":[{"line_number":359,"context_line":"                       (1, 0), (1, discover.LATEST))"},{"line_number":360,"context_line":"        assert_min_max(\u0027latest\u0027, None, None,"},{"line_number":361,"context_line":"                       (discover.LATEST, discover.LATEST),"},{"line_number":362,"context_line":"                       (discover.LATEST, discover.LATEST))"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"        normalize_raises(\u0027v1\u0027, \u0027v2\u0027, None)"},{"line_number":365,"context_line":"        normalize_raises(\u0027v1\u0027, None, \u0027v2\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7f287b81_1bcba74a","line":362,"in_reply_to":"7f287b81_fb50ff0c","updated":"2017-09-04 19:57:50.000000000","message":"testr pretty-prints individual test methods so it is easier so see what is failing, e.g. http://logs.openstack.org/27/485827/6/check/gate-keystoneauth-python27-ubuntu-xenial/42ff68b/testr_results.html.gz\n\nAnd giving the test methods descriptive names helps the reader understand what is being tested and what is expected to happen.","commit_id":"699fac136faa621d756096352850d2ef8507ef79"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c20059ba0d067802f65c3914aa8bb981e2457aa8","unresolved":false,"context_lines":[{"line_number":369,"context_line":""},{"line_number":370,"context_line":"    def test_version_to_string(self):"},{"line_number":371,"context_line":"        def assert_string(inp, out):"},{"line_number":372,"context_line":"            self.assertEqual(out, discover.version_to_string(inp))"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"        assert_string((discover.LATEST,), \u0027latest\u0027)"},{"line_number":375,"context_line":"        assert_string((discover.LATEST, discover.LATEST), \u0027latest\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_d58f8672","line":372,"updated":"2017-07-19 18:43:00.000000000","message":"The fact that the ordering is flipped feels awkward when reading the assertion. Especially since other part of the module take the following pattern:\n\n  assertion(expected, actual)\n\nThe order of assert_string is backwards in that the actual data is first and the expected result it second. Again, this is something we can do in a follow up if necessary.","commit_id":"699fac136faa621d756096352850d2ef8507ef79"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c324b7bb45386f7f3e51aab2ad47c62b02535045","unresolved":false,"context_lines":[{"line_number":369,"context_line":""},{"line_number":370,"context_line":"    def test_version_to_string(self):"},{"line_number":371,"context_line":"        def assert_string(inp, out):"},{"line_number":372,"context_line":"            self.assertEqual(out, discover.version_to_string(inp))"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"        assert_string((discover.LATEST,), \u0027latest\u0027)"},{"line_number":375,"context_line":"        assert_string((discover.LATEST, discover.LATEST), \u0027latest\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7f287b81_fb9ebfb6","line":372,"in_reply_to":"1f1a1f67_3685a007","updated":"2017-09-01 22:01:37.000000000","message":"Done (also for test_version_number): https://review.openstack.org/500204","commit_id":"699fac136faa621d756096352850d2ef8507ef79"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4264fd9c22df96f569c62b5f3685c13a36c918b2","unresolved":false,"context_lines":[{"line_number":369,"context_line":""},{"line_number":370,"context_line":"    def test_version_to_string(self):"},{"line_number":371,"context_line":"        def assert_string(inp, out):"},{"line_number":372,"context_line":"            self.assertEqual(out, discover.version_to_string(inp))"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"        assert_string((discover.LATEST,), \u0027latest\u0027)"},{"line_number":375,"context_line":"        assert_string((discover.LATEST, discover.LATEST), \u0027latest\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_3685a007","line":372,"in_reply_to":"1f1a1f67_d58f8672","updated":"2017-07-19 22:48:34.000000000","message":"FWIW, I started off following the example of assertVersion on L286 and just ran with it.","commit_id":"699fac136faa621d756096352850d2ef8507ef79"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c20059ba0d067802f65c3914aa8bb981e2457aa8","unresolved":false,"context_lines":[{"line_number":380,"context_line":"        assert_string((1, discover.LATEST), \u00271.latest\u0027)"},{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    def test_version_between(self):"},{"line_number":383,"context_line":"        def good(minver, maxver, cand):"},{"line_number":384,"context_line":"            self.assertTrue(discover.version_between(minver, maxver, cand))"},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"        def bad(minver, maxver, cand):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_f5e3a203","line":383,"updated":"2017-07-19 18:43:00.000000000","message":"I\u0027m not convinced masking the assertion with a nested method aids in the readability:\n\n  good((1, 0), (1, 0), (1, 0))\n  # versus\n  self.assertTrue(discover.version_between((1, 0), (1, 0), (1, 0))\n\nbut this is something we can iterate on later if needed.","commit_id":"699fac136faa621d756096352850d2ef8507ef79"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c324b7bb45386f7f3e51aab2ad47c62b02535045","unresolved":false,"context_lines":[{"line_number":380,"context_line":"        assert_string((1, discover.LATEST), \u00271.latest\u0027)"},{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    def test_version_between(self):"},{"line_number":383,"context_line":"        def good(minver, maxver, cand):"},{"line_number":384,"context_line":"            self.assertTrue(discover.version_between(minver, maxver, cand))"},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"        def bad(minver, maxver, cand):"}],"source_content_type":"text/x-python","patch_set":11,"id":"7f287b81_9b969b94","line":383,"in_reply_to":"1f1a1f67_76943837","updated":"2017-09-01 22:01:37.000000000","message":"Gonna leave this alone for now, at least until https://review.openstack.org/#/c/485827 lands (or is abandoned).  If you still think it\u0027s a good idea, I can follow up after that.","commit_id":"699fac136faa621d756096352850d2ef8507ef79"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4264fd9c22df96f569c62b5f3685c13a36c918b2","unresolved":false,"context_lines":[{"line_number":380,"context_line":"        assert_string((1, discover.LATEST), \u00271.latest\u0027)"},{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    def test_version_between(self):"},{"line_number":383,"context_line":"        def good(minver, maxver, cand):"},{"line_number":384,"context_line":"            self.assertTrue(discover.version_between(minver, maxver, cand))"},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"        def bad(minver, maxver, cand):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_76943837","line":383,"in_reply_to":"1f1a1f67_f5e3a203","updated":"2017-07-19 22:48:34.000000000","message":"Yeah, I noodled that a bit.  In the end, I made the call based on saving line breaks (and following the precedent of test_version_number, about which the same could reasonably be said).  I wouldn\u0027t object to unwinding it if that\u0027s preferable.","commit_id":"699fac136faa621d756096352850d2ef8507ef79"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c20059ba0d067802f65c3914aa8bb981e2457aa8","unresolved":false,"context_lines":[{"line_number":622,"context_line":"                        disc.versioned_data_for(min_version\u003d\u0027latest\u0027,"},{"line_number":623,"context_line":"                                                max_version\u003d\u0027latest\u0027),"},{"line_number":624,"context_line":"                        disc.versioned_data_for(min_version\u003d2),"},{"line_number":625,"context_line":"                        disc.versioned_data_for(min_version\u003d\u00272.latest\u0027)):"},{"line_number":626,"context_line":"            self.assertEqual((3, 0), version[\u0027version\u0027])"},{"line_number":627,"context_line":"            self.assertEqual(\u0027stable\u0027, version[\u0027raw_status\u0027])"},{"line_number":628,"context_line":"            self.assertEqual(V3_URL, version[\u0027url\u0027])"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_15ce1e62","line":625,"updated":"2017-07-19 18:43:00.000000000","message":"We could pull the iterable here out into it\u0027s own variable and give it a sensible name:\n\n  valid_v3_versions \u003d (...)\n  for version in valid_v3_versions:\n      # assertions\n\nThis can be done later, too.","commit_id":"699fac136faa621d756096352850d2ef8507ef79"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c324b7bb45386f7f3e51aab2ad47c62b02535045","unresolved":false,"context_lines":[{"line_number":622,"context_line":"                        disc.versioned_data_for(min_version\u003d\u0027latest\u0027,"},{"line_number":623,"context_line":"                                                max_version\u003d\u0027latest\u0027),"},{"line_number":624,"context_line":"                        disc.versioned_data_for(min_version\u003d2),"},{"line_number":625,"context_line":"                        disc.versioned_data_for(min_version\u003d\u00272.latest\u0027)):"},{"line_number":626,"context_line":"            self.assertEqual((3, 0), version[\u0027version\u0027])"},{"line_number":627,"context_line":"            self.assertEqual(\u0027stable\u0027, version[\u0027raw_status\u0027])"},{"line_number":628,"context_line":"            self.assertEqual(V3_URL, version[\u0027url\u0027])"}],"source_content_type":"text/x-python","patch_set":11,"id":"7f287b81_bb44b71c","line":625,"in_reply_to":"1f1a1f67_15ce1e62","updated":"2017-09-01 22:01:37.000000000","message":"Done: https://review.openstack.org/500206","commit_id":"699fac136faa621d756096352850d2ef8507ef79"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c20059ba0d067802f65c3914aa8bb981e2457aa8","unresolved":false,"context_lines":[{"line_number":632,"context_line":"                        disc.versioned_data_for("},{"line_number":633,"context_line":"                            min_version\u003d2, max_version\u003d(2, discover.LATEST)),"},{"line_number":634,"context_line":"                        disc.versioned_data_for("},{"line_number":635,"context_line":"                            min_version\u003d\u00272.latest\u0027, max_version\u003d\u00272.latest\u0027)):"},{"line_number":636,"context_line":"            self.assertEqual((2, 0), version[\u0027version\u0027])"},{"line_number":637,"context_line":"            self.assertEqual(\u0027stable\u0027, version[\u0027raw_status\u0027])"},{"line_number":638,"context_line":"            self.assertEqual(V2_URL, version[\u0027url\u0027])"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_95dfce0b","line":635,"updated":"2017-07-19 18:43:00.000000000","message":"Same comment here.","commit_id":"699fac136faa621d756096352850d2ef8507ef79"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c324b7bb45386f7f3e51aab2ad47c62b02535045","unresolved":false,"context_lines":[{"line_number":632,"context_line":"                        disc.versioned_data_for("},{"line_number":633,"context_line":"                            min_version\u003d2, max_version\u003d(2, discover.LATEST)),"},{"line_number":634,"context_line":"                        disc.versioned_data_for("},{"line_number":635,"context_line":"                            min_version\u003d\u00272.latest\u0027, max_version\u003d\u00272.latest\u0027)):"},{"line_number":636,"context_line":"            self.assertEqual((2, 0), version[\u0027version\u0027])"},{"line_number":637,"context_line":"            self.assertEqual(\u0027stable\u0027, version[\u0027raw_status\u0027])"},{"line_number":638,"context_line":"            self.assertEqual(V2_URL, version[\u0027url\u0027])"}],"source_content_type":"text/x-python","patch_set":11,"id":"7f287b81_9b49fb33","line":635,"in_reply_to":"1f1a1f67_95dfce0b","updated":"2017-09-01 22:01:37.000000000","message":"Ditto","commit_id":"699fac136faa621d756096352850d2ef8507ef79"}],"keystoneauth1/tests/unit/test_session.py":[{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"921a8b917e25dafe5c5e8b4d6f105906d79f8afb","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        # Can\u0027t specify a \u0027latest\u0027 microversion"},{"line_number":116,"context_line":"        self.assertRaises(TypeError,"},{"line_number":117,"context_line":"                          client_session.Session._get_microversion_header,"},{"line_number":118,"context_line":"                          \u00272.latest\u0027, \u0027service_type\u0027, None)"},{"line_number":119,"context_line":"        self.assertRaises(TypeError,"},{"line_number":120,"context_line":"                          client_session.Session._get_microversion_header,"},{"line_number":121,"context_line":"                          (2, discover.LATEST), \u0027service_type\u0027, None)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1f1a1f67_60702009","line":118,"updated":"2017-07-18 17:34:07.000000000","message":"This is fine - I do believe \u00272.latest\u0027 is not supported.","commit_id":"8f8faf41b41929a7406adb4b4037473a35b552ff"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9812aca11706c99828707d581fbb4d74f9ff6473","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        # Can\u0027t specify a \u0027latest\u0027 microversion"},{"line_number":116,"context_line":"        self.assertRaises(TypeError,"},{"line_number":117,"context_line":"                          client_session.Session._get_microversion_header,"},{"line_number":118,"context_line":"                          \u00272.latest\u0027, \u0027service_type\u0027, None)"},{"line_number":119,"context_line":"        self.assertRaises(TypeError,"},{"line_number":120,"context_line":"                          client_session.Session._get_microversion_header,"},{"line_number":121,"context_line":"                          (2, discover.LATEST), \u0027service_type\u0027, None)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1f1a1f67_f7b3d3e7","line":118,"in_reply_to":"1f1a1f67_60702009","updated":"2017-07-18 18:27:56.000000000","message":"Done","commit_id":"8f8faf41b41929a7406adb4b4037473a35b552ff"}]}
