)]}'
{"keystone/tests/matchers.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c379217b8e4c1adadbd5b74b235d2924f4753785","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from testtools import matchers"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class XMLEquals(object):"},{"line_number":24,"context_line":"    \"\"\"Parses two XML documents from strings and compares the results.\"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def __init__(self, expected):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FYGY%3D","line":23,"updated":"2013-10-16 23:22:09.000000000","message":"why not subclass of matchers.Matcher?","commit_id":"f743e7c901ad2fb37c62103e229e6742a7b5c53f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2295018c1f558ba7e05786972ffe0aaa37b5a231","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from testtools import matchers"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class XMLEquals(object):"},{"line_number":24,"context_line":"    \"\"\"Parses two XML documents from strings and compares the results.\"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def __init__(self, expected):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FUBQ%3D","line":23,"in_reply_to":"AAAATH%2F%2FYGY%3D","updated":"2013-10-17 22:30:23.000000000","message":"There is really no reason for it.  Also: https://github.com/testing-cabal/testtools/blob/master/testtools/matchers/__init__.py#L111\n\nOriginally I wanted this to be a subclass of Equals, but I wanted a different mismatch.","commit_id":"f743e7c901ad2fb37c62103e229e6742a7b5c53f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c379217b8e4c1adadbd5b74b235d2924f4753785","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        expected \u003d canonical_xml(self.expected)"},{"line_number":44,"context_line":"        other \u003d canonical_xml(other)"},{"line_number":45,"context_line":"        if expected \u003d\u003d other:"},{"line_number":46,"context_line":"            return None"},{"line_number":47,"context_line":"        return XMLMismatch(expected, other)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FYHA%3D","line":46,"updated":"2013-10-16 23:22:09.000000000","message":"suggest just return.","commit_id":"f743e7c901ad2fb37c62103e229e6742a7b5c53f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2295018c1f558ba7e05786972ffe0aaa37b5a231","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        expected \u003d canonical_xml(self.expected)"},{"line_number":44,"context_line":"        other \u003d canonical_xml(other)"},{"line_number":45,"context_line":"        if expected \u003d\u003d other:"},{"line_number":46,"context_line":"            return None"},{"line_number":47,"context_line":"        return XMLMismatch(expected, other)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FT%2Fc%3D","line":46,"in_reply_to":"AAAATH%2F%2FYHA%3D","updated":"2013-10-17 22:30:23.000000000","message":"Done","commit_id":"f743e7c901ad2fb37c62103e229e6742a7b5c53f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6c3740653f292d4854465c72d1c4aa95891c766a","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    \"\"\"Parses two XML documents from strings and compares the results.\"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def __init__(self, expected):"},{"line_number":27,"context_line":"        self.expected \u003d expected"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def match(self, other):"},{"line_number":30,"context_line":"        parser \u003d etree.XMLParser(remove_blank_text\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2FI%2B0%3D","line":27,"updated":"2013-11-13 22:31:43.000000000","message":"Could do \u0027canonical_xml(expected)\u0027 here then don\u0027t need to parse `expected` with every call to match().","commit_id":"5b2298c882191dbf46f151ed8da45d4c311a6ae0"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c7090fd753c8a69aaa1b478dd00ffbf719bd4bf2","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    \"\"\"Parses two XML documents from strings and compares the results.\"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def __init__(self, expected):"},{"line_number":27,"context_line":"        self.expected \u003d expected"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def match(self, other):"},{"line_number":30,"context_line":"        parser \u003d etree.XMLParser(remove_blank_text\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2FIvQ%3D","line":27,"in_reply_to":"AAAATn%2F%2FI%2B0%3D","updated":"2013-11-13 23:49:40.000000000","message":"Match will only happen once.  I try to make it a habit not to do much work in the initializer.","commit_id":"5b2298c882191dbf46f151ed8da45d4c311a6ae0"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"769000bf67f2313343b097935c35e51631973c7e","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    \"\"\"Parses two XML documents from strings and compares the results.\"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def __init__(self, expected):"},{"line_number":27,"context_line":"        self.expected \u003d expected"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def match(self, other):"},{"line_number":30,"context_line":"        parser \u003d etree.XMLParser(remove_blank_text\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2FECo%3D","line":27,"in_reply_to":"AAAATn%2F%2FIvQ%3D","updated":"2013-11-14 23:43:09.000000000","message":"Couldn\u0027t I create an XMLEquals(some_doc) and use it in several different tests?","commit_id":"5b2298c882191dbf46f151ed8da45d4c311a6ae0"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6c3740653f292d4854465c72d1c4aa95891c766a","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        def canonical_xml(s):"},{"line_number":33,"context_line":"            s \u003d s.strip()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"            fp \u003d six.StringIO()"},{"line_number":36,"context_line":"            dom \u003d etree.fromstring(s, parser)"},{"line_number":37,"context_line":"            dom.getroottree().write_c14n(fp)"},{"line_number":38,"context_line":"            s \u003d fp.getvalue()"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2FI9o%3D","line":35,"updated":"2013-11-13 22:31:43.000000000","message":"add a comment before this why we need to do this.","commit_id":"5b2298c882191dbf46f151ed8da45d4c311a6ae0"}],"keystone/tests/test_matchers.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"42ba0b3ae65b0609f9580a3781fd76e8c8441096","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class TestXMLEquals(TestCase):"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    def test_equal_XML_passes(self):"},{"line_number":25,"context_line":"        xml \u003d \"\"\""},{"line_number":26,"context_line":"            \u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e"},{"line_number":27,"context_line":"            \u003ctest xmlns\u003d\"http://docs.openstack.org/identity/api/v2.0\"\u003e"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATH%2F%2F0Do%3D","line":24,"updated":"2013-10-09 14:04:28.000000000","message":"i\u0027d like to see another test that two different serialized representations which represent the same canonical XML would match using the new approach","commit_id":"c4746eca2684ec216a155c3a30e4ec1838058517"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c379217b8e4c1adadbd5b74b235d2924f4753785","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":15,"context_line":"# under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from testtools import TestCase, matchers"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from keystone.tests import matchers as ksmatchers"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FYGM%3D","line":17,"updated":"2013-10-16 23:22:09.000000000","message":"do not import more than one module per line, see https://github.com/openstack-dev/hacking/blame/master/doc/source/index.rst#L53","commit_id":"f743e7c901ad2fb37c62103e229e6742a7b5c53f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2295018c1f558ba7e05786972ffe0aaa37b5a231","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":15,"context_line":"# under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from testtools import TestCase, matchers"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from keystone.tests import matchers as ksmatchers"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FT%2FM%3D","line":17,"in_reply_to":"AAAATH%2F%2FYGM%3D","updated":"2013-10-17 22:30:23.000000000","message":"Done","commit_id":"f743e7c901ad2fb37c62103e229e6742a7b5c53f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c379217b8e4c1adadbd5b74b235d2924f4753785","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        \"\"\""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"        m \u003d ksmatchers.XMLEquals(xml)"},{"line_number":33,"context_line":"        self.assertThat(m.match(xml), matchers.Equals(None))"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def test_equivalent_XML_passes(self):"},{"line_number":36,"context_line":"        xml0 \u003d \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FYF4%3D","line":33,"updated":"2013-10-16 23:22:09.000000000","message":"Use Is for singleton.","commit_id":"f743e7c901ad2fb37c62103e229e6742a7b5c53f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2295018c1f558ba7e05786972ffe0aaa37b5a231","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        \"\"\""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"        m \u003d ksmatchers.XMLEquals(xml)"},{"line_number":33,"context_line":"        self.assertThat(m.match(xml), matchers.Equals(None))"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def test_equivalent_XML_passes(self):"},{"line_number":36,"context_line":"        xml0 \u003d \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FT%2FI%3D","line":33,"in_reply_to":"AAAATH%2F%2FYF4%3D","updated":"2013-10-17 22:30:23.000000000","message":"Done","commit_id":"f743e7c901ad2fb37c62103e229e6742a7b5c53f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c379217b8e4c1adadbd5b74b235d2924f4753785","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        \"\"\""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        m \u003d ksmatchers.XMLEquals(xml0)"},{"line_number":50,"context_line":"        self.assertThat(m.match(xml1), matchers.Equals(None))"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def test_different_XML_fails(self):"},{"line_number":53,"context_line":"        expected_xml \u003d \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FYFw%3D","line":50,"updated":"2013-10-16 23:22:09.000000000","message":"Use Is for singleton.","commit_id":"f743e7c901ad2fb37c62103e229e6742a7b5c53f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2295018c1f558ba7e05786972ffe0aaa37b5a231","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        \"\"\""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        m \u003d ksmatchers.XMLEquals(xml0)"},{"line_number":50,"context_line":"        self.assertThat(m.match(xml1), matchers.Equals(None))"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def test_different_XML_fails(self):"},{"line_number":53,"context_line":"        expected_xml \u003d \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FT%2FE%3D","line":50,"in_reply_to":"AAAATH%2F%2FYFw%3D","updated":"2013-10-17 22:30:23.000000000","message":"Done","commit_id":"f743e7c901ad2fb37c62103e229e6742a7b5c53f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c379217b8e4c1adadbd5b74b235d2924f4753785","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        m \u003d ksmatchers.XMLEquals(expected_xml)"},{"line_number":67,"context_line":"        mismatch \u003d m.match(other_xml)"},{"line_number":68,"context_line":"        self.assertThat(mismatch, matchers.Not(matchers.Equals(None)))"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FYFo%3D","line":68,"updated":"2013-10-16 23:22:09.000000000","message":"Use Is for singleton. Also, seems like it should check IsInstance(ksmatchers.XMLMismatch)","commit_id":"f743e7c901ad2fb37c62103e229e6742a7b5c53f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2295018c1f558ba7e05786972ffe0aaa37b5a231","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        m \u003d ksmatchers.XMLEquals(expected_xml)"},{"line_number":67,"context_line":"        mismatch \u003d m.match(other_xml)"},{"line_number":68,"context_line":"        self.assertThat(mismatch, matchers.Not(matchers.Equals(None)))"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FT%2FA%3D","line":68,"in_reply_to":"AAAATH%2F%2FYFo%3D","updated":"2013-10-17 22:30:23.000000000","message":"Done","commit_id":"f743e7c901ad2fb37c62103e229e6742a7b5c53f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"bab0aa4af9765448ed84f637fc9ed08f804266d5","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        m \u003d ksmatchers.XMLEquals(expected_xml)"},{"line_number":68,"context_line":"        mismatch \u003d m.match(other_xml)"},{"line_number":69,"context_line":"        self.assertThat(mismatch, matchers.Not(matchers.Is(None)))"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATH%2F%2FK%2BQ%3D","line":69,"updated":"2013-10-22 01:55:41.000000000","message":"Should this be more specific and check that the return is a XMLMismatch ?","commit_id":"d7f3422931fb0d49d7e2bde806dadf018477d484"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6c3740653f292d4854465c72d1c4aa95891c766a","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        xml1 \u003d \"\"\""},{"line_number":44,"context_line":"            \u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e"},{"line_number":45,"context_line":"            \u003ctest xmlns\u003d\"http://docs.openstack.org/identity/api/v2.0\"\u003e"},{"line_number":46,"context_line":"                \u003csuccess b\u003d\"b\" a\u003d\"a\"\u003e\u003c/success\u003e"},{"line_number":47,"context_line":"            \u003c/test\u003e"},{"line_number":48,"context_line":"        \"\"\""},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2FI84%3D","line":46,"updated":"2013-11-13 22:31:43.000000000","message":"are 2 XML docs equivalent if an element contains subelements in a different order? Add a test.\n\ne.g.\n\n \u003ctest xmlns\u003d\"http://docs.openstack.org/identity/api/v2.0\"\u003e\n   \u003csuccess b\u003d\"b\" a\u003d\"a\"\u003e\u003c/success\u003e\n   \u003csuccess a\u003d\"b\" b\u003d\"a\"\u003e\u003c/success\u003e\n \u003c/test\u003e\n\n \u003ctest xmlns\u003d\"http://docs.openstack.org/identity/api/v2.0\"\u003e\n   \u003csuccess a\u003d\"b\" b\u003d\"a\"\u003e\u003c/success\u003e\n   \u003csuccess b\u003d\"b\" a\u003d\"a\"\u003e\u003c/success\u003e\n \u003c/test\u003e\n\nSeems like it would have to work this way for the JSON serialization/deserialization to work correctly, since JSON doesn\u0027t care about order.","commit_id":"5b2298c882191dbf46f151ed8da45d4c311a6ae0"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c7090fd753c8a69aaa1b478dd00ffbf719bd4bf2","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        xml1 \u003d \"\"\""},{"line_number":44,"context_line":"            \u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e"},{"line_number":45,"context_line":"            \u003ctest xmlns\u003d\"http://docs.openstack.org/identity/api/v2.0\"\u003e"},{"line_number":46,"context_line":"                \u003csuccess b\u003d\"b\" a\u003d\"a\"\u003e\u003c/success\u003e"},{"line_number":47,"context_line":"            \u003c/test\u003e"},{"line_number":48,"context_line":"        \"\"\""},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2FIs0%3D","line":46,"in_reply_to":"AAAATn%2F%2FI84%3D","updated":"2013-11-13 23:49:40.000000000","message":"I\u0027ll add some elements to this case to show the behavior.","commit_id":"5b2298c882191dbf46f151ed8da45d4c311a6ae0"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"769000bf67f2313343b097935c35e51631973c7e","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        xml1 \u003d \"\"\""},{"line_number":44,"context_line":"            \u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e"},{"line_number":45,"context_line":"            \u003ctest xmlns\u003d\"http://docs.openstack.org/identity/api/v2.0\"\u003e"},{"line_number":46,"context_line":"                \u003csuccess b\u003d\"b\" a\u003d\"a\"\u003e\u003c/success\u003e"},{"line_number":47,"context_line":"            \u003c/test\u003e"},{"line_number":48,"context_line":"        \"\"\""},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2FECg%3D","line":46,"in_reply_to":"AAAATn%2F%2FIpw%3D","updated":"2013-11-14 23:43:09.000000000","message":"Add a test that shows that the order matters.","commit_id":"5b2298c882191dbf46f151ed8da45d4c311a6ae0"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"3fe2112e581c5b13fac4484d364912f57136f00f","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        xml1 \u003d \"\"\""},{"line_number":44,"context_line":"            \u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e"},{"line_number":45,"context_line":"            \u003ctest xmlns\u003d\"http://docs.openstack.org/identity/api/v2.0\"\u003e"},{"line_number":46,"context_line":"                \u003csuccess b\u003d\"b\" a\u003d\"a\"\u003e\u003c/success\u003e"},{"line_number":47,"context_line":"            \u003c/test\u003e"},{"line_number":48,"context_line":"        \"\"\""},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2FIpw%3D","line":46,"in_reply_to":"AAAATn%2F%2FIs0%3D","updated":"2013-11-14 00:05:37.000000000","message":"I took a quick look at this and I do think that order matters. See http://bit.ly/1e4ouhS.\n\nIf the object elements in that example where out of order the test would fail.  The are turned into an ordered list in JSON.","commit_id":"5b2298c882191dbf46f151ed8da45d4c311a6ae0"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6c3740653f292d4854465c72d1c4aa95891c766a","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        \"\"\""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        m \u003d ksmatchers.XMLEquals(xml0)"},{"line_number":51,"context_line":"        self.assertThat(m.match(xml1), matchers.Is(None))"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def test_different_XML_fails(self):"},{"line_number":54,"context_line":"        expected_xml \u003d \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2FI80%3D","line":51,"updated":"2013-11-13 22:31:43.000000000","message":"seems like there should be a matcher for if match succeeds? (could use here and at line 34)\n\n self.assertThat(matchers.Matches(m, xml1))","commit_id":"5b2298c882191dbf46f151ed8da45d4c311a6ae0"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c7090fd753c8a69aaa1b478dd00ffbf719bd4bf2","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        \"\"\""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        m \u003d ksmatchers.XMLEquals(xml0)"},{"line_number":51,"context_line":"        self.assertThat(m.match(xml1), matchers.Is(None))"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def test_different_XML_fails(self):"},{"line_number":54,"context_line":"        expected_xml \u003d \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2FItA%3D","line":51,"in_reply_to":"AAAATn%2F%2FI80%3D","updated":"2013-11-13 23:49:40.000000000","message":"I\u0027m not sure I follow.  This is just testing through the matcher protocol defined by testtools.  If something matches a None is returned, otherwise a object containing data about the mismatch is returned.","commit_id":"5b2298c882191dbf46f151ed8da45d4c311a6ae0"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"769000bf67f2313343b097935c35e51631973c7e","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        \"\"\""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        m \u003d ksmatchers.XMLEquals(xml0)"},{"line_number":51,"context_line":"        self.assertThat(m.match(xml1), matchers.Is(None))"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def test_different_XML_fails(self):"},{"line_number":54,"context_line":"        expected_xml \u003d \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2FECc%3D","line":51,"in_reply_to":"AAAATn%2F%2FItA%3D","updated":"2013-11-14 23:43:09.000000000","message":"This line is the same as line 34... also, it\u0027s kind of non-intuitive (why checking is None?), a named matcher would make it more obvious.","commit_id":"5b2298c882191dbf46f151ed8da45d4c311a6ae0"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6c3740653f292d4854465c72d1c4aa95891c766a","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        m \u003d ksmatchers.XMLEquals(expected_xml)"},{"line_number":68,"context_line":"        mismatch \u003d m.match(other_xml)"},{"line_number":69,"context_line":"        self.assertThat(mismatch, matchers.IsInstance(ksmatchers.XMLMismatch))"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2FI9I%3D","line":69,"updated":"2013-11-13 22:31:43.000000000","message":"should there also be a test for the namespaced attribute problem that Morgan found?","commit_id":"5b2298c882191dbf46f151ed8da45d4c311a6ae0"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c7090fd753c8a69aaa1b478dd00ffbf719bd4bf2","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        m \u003d ksmatchers.XMLEquals(expected_xml)"},{"line_number":68,"context_line":"        mismatch \u003d m.match(other_xml)"},{"line_number":69,"context_line":"        self.assertThat(mismatch, matchers.IsInstance(ksmatchers.XMLMismatch))"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2FIto%3D","line":69,"in_reply_to":"AAAATn%2F%2FI9I%3D","updated":"2013-11-13 23:49:40.000000000","message":"What was the problem? Do you have a link?","commit_id":"5b2298c882191dbf46f151ed8da45d4c311a6ae0"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"769000bf67f2313343b097935c35e51631973c7e","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        m \u003d ksmatchers.XMLEquals(expected_xml)"},{"line_number":68,"context_line":"        mismatch \u003d m.match(other_xml)"},{"line_number":69,"context_line":"        self.assertThat(mismatch, matchers.IsInstance(ksmatchers.XMLMismatch))"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2FECY%3D","line":69,"in_reply_to":"AAAATn%2F%2FIto%3D","updated":"2013-11-14 23:43:09.000000000","message":"Here\u0027s Morgan\u0027s comment from patch set 6:\n\nand as discussed in IRC there is an issue with the namespaced attributes in the matcher:\n\nhttp://paste.openstack.org/show/51730/ ( failure ) http://paste.openstack.org/show/51731/ ( test that was added that causes failure after rebase )","commit_id":"5b2298c882191dbf46f151ed8da45d4c311a6ae0"}],"keystone/tests/test_serializer.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6c3740653f292d4854465c72d1c4aa95891c766a","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from keystone.common import serializer"},{"line_number":22,"context_line":"from keystone import tests"},{"line_number":23,"context_line":"from keystone.tests import matchers as ksmatchers"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class XmlSerializerTestCase(tests.TestCase):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2FI8Y%3D","line":23,"updated":"2013-11-13 22:31:43.000000000","message":"wondering if it would be easier if keystone.tests.matchers exposed all of testtools.matchers.","commit_id":"5b2298c882191dbf46f151ed8da45d4c311a6ae0"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c7090fd753c8a69aaa1b478dd00ffbf719bd4bf2","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from keystone.common import serializer"},{"line_number":22,"context_line":"from keystone import tests"},{"line_number":23,"context_line":"from keystone.tests import matchers as ksmatchers"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class XmlSerializerTestCase(tests.TestCase):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2FIuc%3D","line":23,"in_reply_to":"AAAATn%2F%2FI8Y%3D","updated":"2013-11-13 23:49:40.000000000","message":"As a purest I like them separate as I don\u0027t like the import * pattern. If it\u0027s a deal breaker I would be willing to reconsider.","commit_id":"5b2298c882191dbf46f151ed8da45d4c311a6ae0"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"769000bf67f2313343b097935c35e51631973c7e","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from keystone.common import serializer"},{"line_number":22,"context_line":"from keystone import tests"},{"line_number":23,"context_line":"from keystone.tests import matchers as ksmatchers"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class XmlSerializerTestCase(tests.TestCase):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2FECM%3D","line":23,"in_reply_to":"AAAATn%2F%2FIuc%3D","updated":"2013-11-14 23:43:09.000000000","message":"I\u0027m fine with it either way. I just think ksmatchers is an ugly name and can\u0027t think of a better one so would be nice to only have matchers.","commit_id":"5b2298c882191dbf46f151ed8da45d4c311a6ae0"}]}
