)]}'
{"os_traits/__init__.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"8b5da41f09b2a358b71ac85cf52cdedd5b0637e4","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        return None"},{"line_number":126,"context_line":"    # Replace non-alphanumeric characters with underscores"},{"line_number":127,"context_line":"    norm_name \u003d re.sub(\u0027[^0-9A-Za-z]+\u0027, \u0027_\u0027, name)"},{"line_number":128,"context_line":"    # Bug #1762789: Do .upper after replacing non alphanumerics."},{"line_number":129,"context_line":"    norm_name \u003d norm_name.upper()"},{"line_number":130,"context_line":"    norm_name \u003d CUSTOM_NAMESPACE + norm_name"},{"line_number":131,"context_line":"    return norm_name"}],"source_content_type":"text/x-python","patch_set":1,"id":"bf659307_8b670852","line":128,"updated":"2018-04-10 18:11:30.000000000","message":"+many\n\nunreasonable to expect upper to mean anything sensible across py versions or character types","commit_id":"123425a7519901b68fb00c6f6ec324fd16a6471e"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"a6fc5225973b8d7a0023c508be9ef087898dc10e","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    # Replace non-alphanumeric characters with underscores"},{"line_number":127,"context_line":"    norm_name \u003d re.sub(\u0027[^0-9A-Za-z]+\u0027, \u0027_\u0027, name)"},{"line_number":128,"context_line":"    # Bug #1762789: Do .upper after replacing non alphanumerics."},{"line_number":129,"context_line":"    norm_name \u003d norm_name.upper()"},{"line_number":130,"context_line":"    norm_name \u003d CUSTOM_NAMESPACE + norm_name"},{"line_number":131,"context_line":"    return norm_name"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf659307_04e3b7d9","line":131,"range":{"start_line":129,"start_character":0,"end_line":131,"end_character":20},"updated":"2018-04-12 06:02:26.000000000","message":"It can be:\n\n  return CUSTOM_NAMESPACE + norm_name.upper()","commit_id":"760131fba8b9424e0051fc135f9adaec05b489a9"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8c2d69b6df1e87bab9407a0bedd60ca6285e6dbb","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    # Replace non-alphanumeric characters with underscores"},{"line_number":127,"context_line":"    norm_name \u003d re.sub(\u0027[^0-9A-Za-z]+\u0027, \u0027_\u0027, name)"},{"line_number":128,"context_line":"    # Bug #1762789: Do .upper after replacing non alphanumerics."},{"line_number":129,"context_line":"    norm_name \u003d norm_name.upper()"},{"line_number":130,"context_line":"    norm_name \u003d CUSTOM_NAMESPACE + norm_name"},{"line_number":131,"context_line":"    return norm_name"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf659307_65b4e682","line":131,"range":{"start_line":129,"start_character":0,"end_line":131,"end_character":20},"in_reply_to":"bf659307_04e3b7d9","updated":"2018-04-12 13:31:57.000000000","message":"It could also be\n\n return None if name is None else (CUSTOM_NAMESPACE + re.sub(...).upper())\n\n:P","commit_id":"760131fba8b9424e0051fc135f9adaec05b489a9"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"ae5b73e9770ac7227048e3b339f156495ff9866a","unresolved":false,"context_lines":[{"line_number":124,"context_line":"    if name is None:"},{"line_number":125,"context_line":"        return None"},{"line_number":126,"context_line":"    # Replace non-alphanumeric characters with underscores"},{"line_number":127,"context_line":"    norm_name \u003d re.sub(\u0027[^0-9A-Za-z]+\u0027, \u0027_\u0027, name)"},{"line_number":128,"context_line":"    # Bug #1762789: Do .upper after replacing non alphanumerics."},{"line_number":129,"context_line":"    return CUSTOM_NAMESPACE + norm_name.upper()"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_9dc13083","line":127,"range":{"start_line":127,"start_character":3,"end_line":127,"end_character":50},"updated":"2018-06-13 09:25:16.000000000","message":"We should trip the \u0027_\u0027 in the beginning and the end.","commit_id":"19c3c098c7e53da6c9d2ef943177f7c3c49fc842"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c48935c238fff2c4a14359d47d276c870df44aa2","unresolved":false,"context_lines":[{"line_number":124,"context_line":"    if name is None:"},{"line_number":125,"context_line":"        return None"},{"line_number":126,"context_line":"    # Replace non-alphanumeric characters with underscores"},{"line_number":127,"context_line":"    norm_name \u003d re.sub(\u0027[^0-9A-Za-z]+\u0027, \u0027_\u0027, name)"},{"line_number":128,"context_line":"    # Bug #1762789: Do .upper after replacing non alphanumerics."},{"line_number":129,"context_line":"    return CUSTOM_NAMESPACE + norm_name.upper()"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_d1bb10c1","line":127,"range":{"start_line":127,"start_character":3,"end_line":127,"end_character":50},"in_reply_to":"5f7c97a3_9dc13083","updated":"2018-06-13 13:18:14.000000000","message":"Why, is that illegal?  I don\u0027t see why it should be.","commit_id":"19c3c098c7e53da6c9d2ef943177f7c3c49fc842"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"45d2d33b439bedeffa4a09c339145a805a6bf9c8","unresolved":false,"context_lines":[{"line_number":124,"context_line":"    if name is None:"},{"line_number":125,"context_line":"        return None"},{"line_number":126,"context_line":"    # Replace non-alphanumeric characters with underscores"},{"line_number":127,"context_line":"    norm_name \u003d re.sub(\u0027[^0-9A-Za-z]+\u0027, \u0027_\u0027, name)"},{"line_number":128,"context_line":"    # Bug #1762789: Do .upper after replacing non alphanumerics."},{"line_number":129,"context_line":"    return CUSTOM_NAMESPACE + norm_name.upper()"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_f14bacad","line":127,"range":{"start_line":127,"start_character":3,"end_line":127,"end_character":50},"in_reply_to":"5f7c97a3_d1bb10c1","updated":"2018-06-13 13:21:13.000000000","message":"Accepted by the API, so no reason to restrict it:\n\n In [3]: adap.put(\u0027/traits/CUSTOM__FOO_\u0027)\n Out[3]: \u003cResponse [201]\u003e\n \n In [4]: adap.get(\u0027/traits/CUSTOM__FOO_\u0027)\n Out[4]: \u003cResponse [204]\u003e","commit_id":"19c3c098c7e53da6c9d2ef943177f7c3c49fc842"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"646be9cb211b717a61ba2925746ba2c825736c24","unresolved":false,"context_lines":[{"line_number":124,"context_line":"    if name is None:"},{"line_number":125,"context_line":"        return None"},{"line_number":126,"context_line":"    # Replace non-alphanumeric characters with underscores"},{"line_number":127,"context_line":"    norm_name \u003d re.sub(\u0027[^0-9A-Za-z]+\u0027, \u0027_\u0027, name)"},{"line_number":128,"context_line":"    # Bug #1762789: Do .upper after replacing non alphanumerics."},{"line_number":129,"context_line":"    return CUSTOM_NAMESPACE + norm_name.upper()"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_943a66e3","line":127,"range":{"start_line":127,"start_character":3,"end_line":127,"end_character":50},"in_reply_to":"5f7c97a3_f14bacad","updated":"2018-06-13 14:15:55.000000000","message":"oops, sorry, I missed that.","commit_id":"19c3c098c7e53da6c9d2ef943177f7c3c49fc842"}],"os_traits/tests/test_os_traits.py":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"a6fc5225973b8d7a0023c508be9ef087898dc10e","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def test_normalize_name(self):"},{"line_number":101,"context_line":"        values \u003d ["},{"line_number":102,"context_line":"            (\"foo\", \"CUSTOM_FOO\"),"},{"line_number":103,"context_line":"            (\"VCPU\", \"CUSTOM_VCPU\"),"},{"line_number":104,"context_line":"            (\"CUSTOM_BOB\", \"CUSTOM_CUSTOM_BOB\"),"},{"line_number":105,"context_line":"            (\"CUSTM_BOB\", \"CUSTOM_CUSTM_BOB\"),"},{"line_number":106,"context_line":"            (u\"Fu\\xdfball\", u\"CUSTOM_FU_BALL\")"},{"line_number":107,"context_line":"        ]"},{"line_number":108,"context_line":"        for test_value, expected in values:"},{"line_number":109,"context_line":"            result \u003d ot.normalize_name(test_value)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf659307_e424830f","line":106,"range":{"start_line":102,"start_character":0,"end_line":106,"end_character":46},"updated":"2018-04-12 06:02:26.000000000","message":"A test case including number (0-9) should be added.","commit_id":"760131fba8b9424e0051fc135f9adaec05b489a9"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8c2d69b6df1e87bab9407a0bedd60ca6285e6dbb","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def test_normalize_name(self):"},{"line_number":101,"context_line":"        values \u003d ["},{"line_number":102,"context_line":"            (\"foo\", \"CUSTOM_FOO\"),"},{"line_number":103,"context_line":"            (\"VCPU\", \"CUSTOM_VCPU\"),"},{"line_number":104,"context_line":"            (\"CUSTOM_BOB\", \"CUSTOM_CUSTOM_BOB\"),"},{"line_number":105,"context_line":"            (\"CUSTM_BOB\", \"CUSTOM_CUSTM_BOB\"),"},{"line_number":106,"context_line":"            (u\"Fu\\xdfball\", u\"CUSTOM_FU_BALL\")"},{"line_number":107,"context_line":"        ]"},{"line_number":108,"context_line":"        for test_value, expected in values:"},{"line_number":109,"context_line":"            result \u003d ot.normalize_name(test_value)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf659307_25b26e95","line":106,"range":{"start_line":102,"start_character":0,"end_line":106,"end_character":46},"in_reply_to":"bf659307_e424830f","updated":"2018-04-12 13:31:57.000000000","message":"Done.  Some punctuation too.","commit_id":"760131fba8b9424e0051fc135f9adaec05b489a9"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"ae5b73e9770ac7227048e3b339f156495ff9866a","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            (\"abc-123\", \"CUSTOM_ABC_123\"),"},{"line_number":108,"context_line":"            (\"Hello, world!  This is a test ^_^\","},{"line_number":109,"context_line":"             \"CUSTOM_HELLO_WORLD_THIS_IS_A_TEST_\"),"},{"line_number":110,"context_line":"        ]"},{"line_number":111,"context_line":"        for test_value, expected in values:"},{"line_number":112,"context_line":"            result \u003d ot.normalize_name(test_value)"},{"line_number":113,"context_line":"            self.assertEqual(expected, result)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_fd3704af","line":110,"updated":"2018-06-13 09:25:16.000000000","message":"One more case, like \u0027       foo        \u0027","commit_id":"19c3c098c7e53da6c9d2ef943177f7c3c49fc842"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c48935c238fff2c4a14359d47d276c870df44aa2","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            (\"abc-123\", \"CUSTOM_ABC_123\"),"},{"line_number":108,"context_line":"            (\"Hello, world!  This is a test ^_^\","},{"line_number":109,"context_line":"             \"CUSTOM_HELLO_WORLD_THIS_IS_A_TEST_\"),"},{"line_number":110,"context_line":"        ]"},{"line_number":111,"context_line":"        for test_value, expected in values:"},{"line_number":112,"context_line":"            result \u003d ot.normalize_name(test_value)"},{"line_number":113,"context_line":"            self.assertEqual(expected, result)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_31d124fc","line":110,"in_reply_to":"5f7c97a3_fd3704af","updated":"2018-06-13 13:18:14.000000000","message":"Done","commit_id":"19c3c098c7e53da6c9d2ef943177f7c3c49fc842"}]}
