)]}'
{"keystone/tests/unit/core.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"2c202fc934d2c63f885d686ddf56ab4357022a02","unresolved":false,"context_lines":[{"line_number":410,"context_line":"def new_totp_credential(user_id, project_id\u003dNone, blob\u003dNone):"},{"line_number":411,"context_line":"    if not blob:"},{"line_number":412,"context_line":"        blob \u003d uuid.uuid4().hex"},{"line_number":413,"context_line":"        if six.PY3:"},{"line_number":414,"context_line":"            blob \u003d base64.b32encode(blob.encode(\u0027ascii\u0027)).decode(\u0027ascii\u0027)"},{"line_number":415,"context_line":"        else:"},{"line_number":416,"context_line":"            blob \u003d base64.b32encode(blob)"},{"line_number":417,"context_line":"        blob \u003d blob.rstrip(\u0027\u003d\u0027)"},{"line_number":418,"context_line":"    credential \u003d new_credential_ref(user_id\u003duser_id,"},{"line_number":419,"context_line":"                                    project_id\u003dproject_id,"}],"source_content_type":"text/x-python","patch_set":4,"id":"dab17558_3ec73e99","line":416,"range":{"start_line":413,"start_character":8,"end_line":416,"end_character":41},"updated":"2016-05-17 00:40:27.000000000","message":"just one suggestion to keep things consistent with other patches:\n\n  if six.PY3:\n    blob \u003d blob.encode(\u0027ascii\u0027).decode(\u0027ascii\u0027)\n  base64.b32encode(blob)","commit_id":"53adaa9dbe999d77179c950861ab887c88f7dbc7"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"3eaf1a8be48852e43e8923aa036f918b516f09a2","unresolved":false,"context_lines":[{"line_number":410,"context_line":"def new_totp_credential(user_id, project_id\u003dNone, blob\u003dNone):"},{"line_number":411,"context_line":"    if not blob:"},{"line_number":412,"context_line":"        blob \u003d uuid.uuid4().hex"},{"line_number":413,"context_line":"        if six.PY3:"},{"line_number":414,"context_line":"            blob \u003d base64.b32encode(blob.encode(\u0027ascii\u0027)).decode(\u0027ascii\u0027)"},{"line_number":415,"context_line":"        else:"},{"line_number":416,"context_line":"            blob \u003d base64.b32encode(blob)"},{"line_number":417,"context_line":"        blob \u003d blob.rstrip(\u0027\u003d\u0027)"},{"line_number":418,"context_line":"    credential \u003d new_credential_ref(user_id\u003duser_id,"},{"line_number":419,"context_line":"                                    project_id\u003dproject_id,"}],"source_content_type":"text/x-python","patch_set":4,"id":"dab17558_8afc1173","line":416,"range":{"start_line":413,"start_character":8,"end_line":416,"end_character":41},"in_reply_to":"dab17558_3ec73e99","updated":"2016-05-17 10:03:40.000000000","message":"Your code is different than mine, it\u0027s the result of b32encode() which should be decoded, not the input blob string.\n\nIMHO the code is simpler as I wrote it.","commit_id":"53adaa9dbe999d77179c950861ab887c88f7dbc7"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"3b24d4ed73a858c1189a78038848401a87cc1a85","unresolved":false,"context_lines":[{"line_number":410,"context_line":"def new_totp_credential(user_id, project_id\u003dNone, blob\u003dNone):"},{"line_number":411,"context_line":"    if not blob:"},{"line_number":412,"context_line":"        blob \u003d uuid.uuid4().hex"},{"line_number":413,"context_line":"        if six.PY3:"},{"line_number":414,"context_line":"            blob \u003d base64.b32encode(blob.encode(\u0027ascii\u0027)).decode(\u0027ascii\u0027)"},{"line_number":415,"context_line":"        else:"},{"line_number":416,"context_line":"            blob \u003d base64.b32encode(blob)"},{"line_number":417,"context_line":"        blob \u003d blob.rstrip(\u0027\u003d\u0027)"},{"line_number":418,"context_line":"    credential \u003d new_credential_ref(user_id\u003duser_id,"},{"line_number":419,"context_line":"                                    project_id\u003dproject_id,"}],"source_content_type":"text/x-python","patch_set":4,"id":"dab17558_a40ae176","line":416,"range":{"start_line":413,"start_character":8,"end_line":416,"end_character":41},"in_reply_to":"dab17558_8afc1173","updated":"2016-05-17 12:55:46.000000000","message":"whoops, yeah. anyway, i\u0027m good as is","commit_id":"53adaa9dbe999d77179c950861ab887c88f7dbc7"}],"keystone/tests/unit/test_v3_auth.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7da3026d7fdb9097c8bbfefc6e394792120150c9","unresolved":false,"context_lines":[{"line_number":592,"context_line":"        # of the expected timestamp"},{"line_number":593,"context_line":"        self.assertIn(expected.partition(\".\")[0],"},{"line_number":594,"context_line":"                      value,"},{"line_number":595,"context_line":"                      \"%s !\u003d %s\" % (expected, value))"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"    def test_v3_v2_unscoped_token_intermix(self):"},{"line_number":598,"context_line":"        r \u003d self.v3_create_token(self.build_authentication_request("}],"source_content_type":"text/x-python","patch_set":2,"id":"dab17558_a2bcd1dc","line":595,"updated":"2016-05-10 14:00:51.000000000","message":"Wouldn\u0027t something like this (https://github.com/openstack/keystone/blob/02562069d8e48eadcec8ab66fb82d6427a6a749c/keystone/tests/unit/core.py#L828-L839) work here?","commit_id":"f7a01fc86bd834f398064c77809270083e51f661"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"23e737489268044f5b4547fe827a91377134b9e0","unresolved":false,"context_lines":[{"line_number":592,"context_line":"        # of the expected timestamp"},{"line_number":593,"context_line":"        self.assertIn(expected.partition(\".\")[0],"},{"line_number":594,"context_line":"                      value,"},{"line_number":595,"context_line":"                      \"%s !\u003d %s\" % (expected, value))"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"    def test_v3_v2_unscoped_token_intermix(self):"},{"line_number":598,"context_line":"        r \u003d self.v3_create_token(self.build_authentication_request("}],"source_content_type":"text/x-python","patch_set":2,"id":"dab17558_3dada3e9","line":595,"in_reply_to":"dab17558_a2bcd1dc","updated":"2016-05-16 13:47:43.000000000","message":"Oh nice, I didn\u0027t know assertCloseEnoughForGovernmentWork(). Sadly, this function expects a datetime.datetime object, whereas my function expects strings. I just moved existing code.","commit_id":"f7a01fc86bd834f398064c77809270083e51f661"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"05739103baa28204d45e57c36fbd122890d68fa3","unresolved":false,"context_lines":[{"line_number":589,"context_line":""},{"line_number":590,"context_line":"    def assertTimestampEqual(self, expected, value):"},{"line_number":591,"context_line":"        # Compare two timestamps but ignore the microseconds part"},{"line_number":592,"context_line":"        # of the expected timestamp"},{"line_number":593,"context_line":"        self.assertIn(expected.partition(\".\")[0],"},{"line_number":594,"context_line":"                      value,"},{"line_number":595,"context_line":"                      \"%s !\u003d %s\" % (expected, value))"}],"source_content_type":"text/x-python","patch_set":4,"id":"dab17558_c1ef09e7","line":592,"updated":"2016-05-17 16:03:22.000000000","message":"nit: we should add to the comment explaining *why* we want to ignore the microseconds part of the timestamp.","commit_id":"53adaa9dbe999d77179c950861ab887c88f7dbc7"}]}
