)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"2dfff5c7ce7bbf41ae7ce6a99edf085cde374626","unresolved":false,"context_lines":[{"line_number":11,"context_line":"The matcher returns with a mismatch object design to provide a"},{"line_number":12,"context_line":"useful message in case of failed assertion, which pinpoints the"},{"line_number":13,"context_line":"differences between the two dicts."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Verified via unit tests."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Partially implements: bp/tempest-client-scenarios"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"baada198_7f975c39","line":14,"updated":"2014-08-10 12:17:12.000000000","message":"could you explain why not add assertDictExceptForKeys() in tempest.test.BaseTestCase?\nIt seems less work for you and easier to understand","commit_id":"b99bcf2e88dc71ad00cd64fa197982525bccbbd7"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"7a00004f53d41b4889b988297399aaa637769271","unresolved":false,"context_lines":[{"line_number":11,"context_line":"The matcher returns with a mismatch object design to provide a"},{"line_number":12,"context_line":"useful message in case of failed assertion, which pinpoints the"},{"line_number":13,"context_line":"differences between the two dicts."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Verified via unit tests."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Partially implements: bp/tempest-client-scenarios"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"baada198_f8f5e652","line":14,"in_reply_to":"baada198_7f975c39","updated":"2014-08-12 22:15:27.000000000","message":"Honestly I don\u0027t think this is the biggest deal. The testtools matcher API is designed for this type of complex comparison. If you want to wrap it as a custom assert method you can push that as a separate patch.","commit_id":"b99bcf2e88dc71ad00cd64fa197982525bccbbd7"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"7a00004f53d41b4889b988297399aaa637769271","unresolved":false,"context_lines":[{"line_number":12,"context_line":"useful message in case of failed assertion, which pinpoints the"},{"line_number":13,"context_line":"differences between the two dicts."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Verified via unit tests."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Partially implements: bp/tempest-client-scenarios"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"baada198_b83a8ec3","line":15,"updated":"2014-08-12 22:15:27.000000000","message":"Heh, nice touch.","commit_id":"b99bcf2e88dc71ad00cd64fa197982525bccbbd7"}],"tempest/common/custom_matchers.py":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"7a00004f53d41b4889b988297399aaa637769271","unresolved":false,"context_lines":[{"line_number":177,"context_line":"        return {}"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"class MatchesDictExceptForKeys(object):"},{"line_number":181,"context_line":"    \"\"\"Matches two dictionaries. Verifies all items are equals except for those"},{"line_number":182,"context_line":"    identified by a list of keys."},{"line_number":183,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_cea93c28","line":180,"updated":"2014-08-12 22:15:27.000000000","message":"I think this should probably inherit from testtools.Matcher","commit_id":"b99bcf2e88dc71ad00cd64fa197982525bccbbd7"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"fedc52132377ce1468efb4cfe2b5fe4455b31184","unresolved":false,"context_lines":[{"line_number":177,"context_line":"        return {}"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"class MatchesDictExceptForKeys(object):"},{"line_number":181,"context_line":"    \"\"\"Matches two dictionaries. Verifies all items are equals except for those"},{"line_number":182,"context_line":"    identified by a list of keys."},{"line_number":183,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"7ac7a964_7ced518b","line":180,"in_reply_to":"7ac7a964_bc2289ff","updated":"2014-08-13 22:23:48.000000000","message":"Yes, that does seem a little weird to me, but if that\u0027s the suggested invocation I\u0027m fine with it.","commit_id":"b99bcf2e88dc71ad00cd64fa197982525bccbbd7"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"4af7e75c08036a779fd29d516928917f5a499f39","unresolved":false,"context_lines":[{"line_number":177,"context_line":"        return {}"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"class MatchesDictExceptForKeys(object):"},{"line_number":181,"context_line":"    \"\"\"Matches two dictionaries. Verifies all items are equals except for those"},{"line_number":182,"context_line":"    identified by a list of keys."},{"line_number":183,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"7ac7a964_bc2289ff","line":180,"in_reply_to":"baada198_cea93c28","updated":"2014-08-13 22:21:24.000000000","message":"According to the examples http://testtools.readthedocs.org/en/latest/for-test-authors.html#matchers custom matchers inherit from object","commit_id":"b99bcf2e88dc71ad00cd64fa197982525bccbbd7"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"2dfff5c7ce7bbf41ae7ce6a99edf085cde374626","unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def __init__(self, expected, excluded_keys\u003dNone):"},{"line_number":186,"context_line":"        self.expected \u003d expected"},{"line_number":187,"context_line":"        self.excluded_keys \u003d excluded_keys if excluded_keys is not None else []"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def match(self, actual):"},{"line_number":190,"context_line":"        filtered_expected \u003d helpers.dict_subtract(self.expected,"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_649d1309","line":187,"updated":"2014-08-10 12:17:12.000000000","message":"nit: self.excluded_keys \u003d excluded_keys or []","commit_id":"b99bcf2e88dc71ad00cd64fa197982525bccbbd7"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"48aad06255e4889c5a4747f31eeb63224691b54b","unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def __init__(self, expected, excluded_keys\u003dNone):"},{"line_number":186,"context_line":"        self.expected \u003d expected"},{"line_number":187,"context_line":"        self.excluded_keys \u003d excluded_keys if excluded_keys is not None else []"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def match(self, actual):"},{"line_number":190,"context_line":"        filtered_expected \u003d helpers.dict_subtract(self.expected,"}],"source_content_type":"text/x-python","patch_set":8,"id":"7ac7a964_b55a8181","line":187,"in_reply_to":"baada198_33e85fdf","updated":"2014-08-14 12:33:12.000000000","message":"that\u0027s why it says \"nit\" :)","commit_id":"b99bcf2e88dc71ad00cd64fa197982525bccbbd7"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"7a00004f53d41b4889b988297399aaa637769271","unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def __init__(self, expected, excluded_keys\u003dNone):"},{"line_number":186,"context_line":"        self.expected \u003d expected"},{"line_number":187,"context_line":"        self.excluded_keys \u003d excluded_keys if excluded_keys is not None else []"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def match(self, actual):"},{"line_number":190,"context_line":"        filtered_expected \u003d helpers.dict_subtract(self.expected,"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_33e85fdf","line":187,"in_reply_to":"baada198_649d1309","updated":"2014-08-12 22:15:27.000000000","message":"Yeah that would be a bit clearer, but it\u0027s not the biggest deal.","commit_id":"b99bcf2e88dc71ad00cd64fa197982525bccbbd7"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"7a00004f53d41b4889b988297399aaa637769271","unresolved":false,"context_lines":[{"line_number":195,"context_line":"            return DictMismatch(filtered_expected, filtered_actual)"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"class DictMismatch(object):"},{"line_number":199,"context_line":"    \"\"\"Mismatch between two dicts describes deltas\"\"\""},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    def __init__(self, expected, actual):"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_694caa76","line":198,"updated":"2014-08-12 22:15:27.000000000","message":"Same here but for testtools.Mismatch()","commit_id":"b99bcf2e88dc71ad00cd64fa197982525bccbbd7"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"fedc52132377ce1468efb4cfe2b5fe4455b31184","unresolved":false,"context_lines":[{"line_number":195,"context_line":"            return DictMismatch(filtered_expected, filtered_actual)"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"class DictMismatch(object):"},{"line_number":199,"context_line":"    \"\"\"Mismatch between two dicts describes deltas\"\"\""},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    def __init__(self, expected, actual):"}],"source_content_type":"text/x-python","patch_set":8,"id":"7ac7a964_bcfe0937","line":198,"in_reply_to":"7ac7a964_5c5a5584","updated":"2014-08-13 22:23:48.000000000","message":"Ditto","commit_id":"b99bcf2e88dc71ad00cd64fa197982525bccbbd7"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"4af7e75c08036a779fd29d516928917f5a499f39","unresolved":false,"context_lines":[{"line_number":195,"context_line":"            return DictMismatch(filtered_expected, filtered_actual)"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"class DictMismatch(object):"},{"line_number":199,"context_line":"    \"\"\"Mismatch between two dicts describes deltas\"\"\""},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    def __init__(self, expected, actual):"}],"source_content_type":"text/x-python","patch_set":8,"id":"7ac7a964_5c5a5584","line":198,"in_reply_to":"baada198_694caa76","updated":"2014-08-13 22:21:24.000000000","message":"According to the examples http://testtools.readthedocs.org/en/latest/for-test-authors.html#matchers custom mismatch inherit from object","commit_id":"b99bcf2e88dc71ad00cd64fa197982525bccbbd7"}]}
