)]}'
{"nova/api/validation/parameter_types.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"b32121122bcb62c5246a3f567b3b7a5e961ce550","unresolved":false,"context_lines":[{"line_number":48,"context_line":"# empty string is tested. Otherwise it is not deterministic which"},{"line_number":49,"context_line":"# constraint fails and this causes issues for some unittests when"},{"line_number":50,"context_line":"# PYTHONHASHSEED is set randomly."},{"line_number":51,"context_line":"def _get_printable(exclude\u003dNone):"},{"line_number":52,"context_line":"    if exclude is None:"},{"line_number":53,"context_line":"        exclude \u003d []"},{"line_number":54,"context_line":"    return \u0027\u0027.join(c for c in _get_all_chars()"},{"line_number":55,"context_line":"                       if _is_printable(c) and c not in exclude)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"_printable_ws \u003d \u0027\u0027.join(c for c in _get_all_chars()"},{"line_number":59,"context_line":"                        if unicodedata.category(c) \u003d\u003d \"Zs\")"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"def _get_printable_no_ws(exclude\u003dNone):"},{"line_number":63,"context_line":"    if exclude is None:"},{"line_number":64,"context_line":"        exclude \u003d []"},{"line_number":65,"context_line":"    return \u0027\u0027.join(c for c in _get_all_chars()"},{"line_number":66,"context_line":"                   if _is_printable(c) and"},{"line_number":67,"context_line":"                       unicodedata.category(c) !\u003d \"Zs\" and"},{"line_number":68,"context_line":"                       c not in exclude)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"def _build_regex_range(ws\u003dTrue, invert\u003dFalse, exclude\u003dNone):"}],"source_content_type":"text/x-python","patch_set":1,"id":"dae33548_bc433812","line":68,"range":{"start_line":51,"start_character":0,"end_line":68,"end_character":40},"updated":"2016-02-18 08:03:15.000000000","message":"Those are useless anymore, so we can get rid of them.","commit_id":"0e67963cde0466b719ab2f2d3a84ef6d7bb9c279"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"b32121122bcb62c5246a3f567b3b7a5e961ce550","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                       c not in exclude)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"def _build_regex_range(ws\u003dTrue, invert\u003dFalse, exclude\u003dNone):"},{"line_number":72,"context_line":"    \"\"\"Build a range regex for a set of characters in utf8."},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    This builds a valid range regex for characters in utf8 by"}],"source_content_type":"text/x-python","patch_set":1,"id":"dae33548_fc702074","line":71,"updated":"2016-02-18 08:03:15.000000000","message":"probably add some unittests for this","commit_id":"0e67963cde0466b719ab2f2d3a84ef6d7bb9c279"}],"nova/tests/unit/test_api_validation.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"5942b492d9143d19b629941390e92a648a6a3648","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        r \u003d parameter_types._build_regex_range(ws\u003dFalse)"},{"line_number":60,"context_line":"        self.assertEqual(r, re.escape(\u0027!\u0027) + \u0027-\u0027 + re.escape(\u0027~\u0027))"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        # if we allow whitespace the range starts earlier"},{"line_number":63,"context_line":"        r \u003d parameter_types._build_regex_range(ws\u003dTrue)"},{"line_number":64,"context_line":"        self.assertEqual(r, re.escape(\u0027 \u0027) + \u0027-\u0027 + re.escape(\u0027~\u0027))"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bae84128_810cc643","line":62,"updated":"2016-02-19 14:54:14.000000000","message":"Nit: I have a preference for separate tests for these things.","commit_id":"f467af7c55af7807603e77effd709a53fba9b8dd"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"0a6d7ad628b6130a49391fca763ad734647d0c94","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        r \u003d parameter_types._build_regex_range(ws\u003dFalse)"},{"line_number":60,"context_line":"        self.assertEqual(r, re.escape(\u0027!\u0027) + \u0027-\u0027 + re.escape(\u0027~\u0027))"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        # if we allow whitespace the range starts earlier"},{"line_number":63,"context_line":"        r \u003d parameter_types._build_regex_range(ws\u003dTrue)"},{"line_number":64,"context_line":"        self.assertEqual(r, re.escape(\u0027 \u0027) + \u0027-\u0027 + re.escape(\u0027~\u0027))"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bae84128_10747033","line":62,"in_reply_to":"bae84128_234df772","updated":"2016-02-19 18:59:06.000000000","message":"yeah, its a more purist thing, for when a test fails its easy to know which one caused the failure. But honestly our test framework makes that dam easy anyway, so I should really got over that purist point of view.","commit_id":"f467af7c55af7807603e77effd709a53fba9b8dd"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"99bdae9efea25708027043fabb3caa49ce8a573e","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        r \u003d parameter_types._build_regex_range(ws\u003dFalse)"},{"line_number":60,"context_line":"        self.assertEqual(r, re.escape(\u0027!\u0027) + \u0027-\u0027 + re.escape(\u0027~\u0027))"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        # if we allow whitespace the range starts earlier"},{"line_number":63,"context_line":"        r \u003d parameter_types._build_regex_range(ws\u003dTrue)"},{"line_number":64,"context_line":"        self.assertEqual(r, re.escape(\u0027 \u0027) + \u0027-\u0027 + re.escape(\u0027~\u0027))"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bae84128_234df772","line":62,"in_reply_to":"bae84128_810cc643","updated":"2016-02-19 16:57:46.000000000","message":"hmmm... there is so much done in nova/test.py setUp that making these all dedicated test functions seems quite overkill.","commit_id":"f467af7c55af7807603e77effd709a53fba9b8dd"}]}
