)]}'
{"keystoneclient/tests/v3/utils.py":[{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"f0c308d2079ba4b8ad6bfe59ef7b4083a710261c","unresolved":false,"context_lines":[{"line_number":247,"context_line":"        # register_uri doesn\u0027t match the querystring component, so we have to"},{"line_number":248,"context_line":"        # explicitly test the querystring component passed by the manager"},{"line_number":249,"context_line":"        qs_args \u003d httpretty.last_request().querystring"},{"line_number":250,"context_line":"        for key, value in expected_qs_args.iteritems():"},{"line_number":251,"context_line":"            self.assertIn(key, qs_args.keys())"},{"line_number":252,"context_line":"            # The httppretty.querystring values are wrapped in a list"},{"line_number":253,"context_line":"            self.assertEqual(unicode(value), qs_args[key][0])"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2Fpl4%3D","line":250,"updated":"2014-01-10 03:52:19.000000000","message":"use six.iteritems()","commit_id":"a1cbc2029c7c3b100ba5815186837ca4191b43ce"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"f0c308d2079ba4b8ad6bfe59ef7b4083a710261c","unresolved":false,"context_lines":[{"line_number":248,"context_line":"        # explicitly test the querystring component passed by the manager"},{"line_number":249,"context_line":"        qs_args \u003d httpretty.last_request().querystring"},{"line_number":250,"context_line":"        for key, value in expected_qs_args.iteritems():"},{"line_number":251,"context_line":"            self.assertIn(key, qs_args.keys())"},{"line_number":252,"context_line":"            # The httppretty.querystring values are wrapped in a list"},{"line_number":253,"context_line":"            self.assertEqual(unicode(value), qs_args[key][0])"},{"line_number":254,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2Fpmc%3D","line":251,"updated":"2014-01-10 03:52:19.000000000","message":"nit: don\u0027t need .keys()","commit_id":"a1cbc2029c7c3b100ba5815186837ca4191b43ce"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"f0c308d2079ba4b8ad6bfe59ef7b4083a710261c","unresolved":false,"context_lines":[{"line_number":250,"context_line":"        for key, value in expected_qs_args.iteritems():"},{"line_number":251,"context_line":"            self.assertIn(key, qs_args.keys())"},{"line_number":252,"context_line":"            # The httppretty.querystring values are wrapped in a list"},{"line_number":253,"context_line":"            self.assertEqual(unicode(value), qs_args[key][0])"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"        self.assertTrue(len(returned_list))"},{"line_number":256,"context_line":"        [self.assertTrue(isinstance(r, self.model)) for r in returned_list]"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2FpmA%3D","line":253,"updated":"2014-01-10 03:52:19.000000000","message":"It does that so that you can have ?a\u003d1\u0026a\u003d2 become { \u0027a\u0027: [1,2] } so maybe: self.assertIn(unicode(value), qs_args[key]) as you are not checking for the exact match of expected_qs_args","commit_id":"a1cbc2029c7c3b100ba5815186837ca4191b43ce"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"dd6ab7519dfff25e00cc8ad470ace64f24578a2b","unresolved":false,"context_lines":[{"line_number":240,"context_line":""},{"line_number":241,"context_line":"        returned_list \u003d self.manager.list(**filter_kwargs)"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        # The expected query string can be passed appended to expected path,"},{"line_number":244,"context_line":"        # otherwise we create the expected path from the filter_kwargs"},{"line_number":245,"context_line":"        if filter_kwargs:"},{"line_number":246,"context_line":"            path_split \u003d urlparse.urlsplit(expected_path)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FPao%3D","line":243,"updated":"2014-01-16 00:54:33.000000000","message":"I think that putting the expected query string on expected_path is making this method\u0027s interface too complicated. The expected path can be built from default values... then how do you specify the expected query string? How about add a new parameter expected_query\u003dNone?\n\nif pass expected_query and no expected_path then build expected_path from defaults and also add ?\u003cexpected_query\u003e.","commit_id":"1a6ee99d24a345d8c234f8e49c6886365780eae1"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"181eb1119a5eda0f14d77b62b4667299efdeb7a9","unresolved":false,"context_lines":[{"line_number":240,"context_line":""},{"line_number":241,"context_line":"        returned_list \u003d self.manager.list(**filter_kwargs)"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        # The expected query string can be passed appended to expected path,"},{"line_number":244,"context_line":"        # otherwise we create the expected path from the filter_kwargs"},{"line_number":245,"context_line":"        if filter_kwargs:"},{"line_number":246,"context_line":"            path_split \u003d urlparse.urlsplit(expected_path)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FDbM%3D","line":243,"in_reply_to":"AAAAUH%2F%2FDfs%3D","updated":"2014-01-17 21:40:13.000000000","message":"ok, I checked the bug and apparently keystoneclient should support extra args.","commit_id":"1a6ee99d24a345d8c234f8e49c6886365780eae1"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0a0e3d3c0871d79427efe8623a0e6870b408e577","unresolved":false,"context_lines":[{"line_number":240,"context_line":""},{"line_number":241,"context_line":"        returned_list \u003d self.manager.list(**filter_kwargs)"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        # The expected query string can be passed appended to expected path,"},{"line_number":244,"context_line":"        # otherwise we create the expected path from the filter_kwargs"},{"line_number":245,"context_line":"        if filter_kwargs:"},{"line_number":246,"context_line":"            path_split \u003d urlparse.urlsplit(expected_path)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FDfs%3D","line":243,"in_reply_to":"AAAAUH%2F%2FHsQ%3D","updated":"2014-01-17 21:28:40.000000000","message":"shardy - you can wait if you want, but since this is fixing a different problem I don\u0027t think it needs to wait. I\u0027m not even sure I agree with https://review.openstack.org/#/c/65381/ -- seems like this should be discussed on openstack-dev first.","commit_id":"1a6ee99d24a345d8c234f8e49c6886365780eae1"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"8c0da37250cae3b031e448b1845d2cfbbcdc0849","unresolved":false,"context_lines":[{"line_number":240,"context_line":""},{"line_number":241,"context_line":"        returned_list \u003d self.manager.list(**filter_kwargs)"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        # The expected query string can be passed appended to expected path,"},{"line_number":244,"context_line":"        # otherwise we create the expected path from the filter_kwargs"},{"line_number":245,"context_line":"        if filter_kwargs:"},{"line_number":246,"context_line":"            path_split \u003d urlparse.urlsplit(expected_path)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FJjM%3D","line":243,"in_reply_to":"AAAAUH%2F%2FJj4%3D","updated":"2014-01-16 23:56:41.000000000","message":"I don\u0027t see any comment in patch set 2 asking for this... curious as to what the reason was, since now you need to repeat the expected path in the tests.","commit_id":"1a6ee99d24a345d8c234f8e49c6886365780eae1"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"a62b8809808c35de1ce0f26793ba397cc9e3af3f","unresolved":false,"context_lines":[{"line_number":240,"context_line":""},{"line_number":241,"context_line":"        returned_list \u003d self.manager.list(**filter_kwargs)"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        # The expected query string can be passed appended to expected path,"},{"line_number":244,"context_line":"        # otherwise we create the expected path from the filter_kwargs"},{"line_number":245,"context_line":"        if filter_kwargs:"},{"line_number":246,"context_line":"            path_split \u003d urlparse.urlsplit(expected_path)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FHsQ%3D","line":243,"in_reply_to":"AAAAUH%2F%2FJjM%3D","updated":"2014-01-17 08:38:31.000000000","message":"\"That way you wouldn\u0027t need the expected_qs argument on test_list ...\"\n\nI interpreted this as a request to remove the argument, but I still needed some way to pass the expected query string to assertQueryStringIs, hence using expected_path.\n\nI\u0027ll wait for https://review.openstack.org/#/c/65381/ mentioned by Jamie to merge then rebase/refactor on top of that, including your suggestions.  Jamie has made it clear he wants that to merge first, so I\u0027m blocked until that happens.","commit_id":"1a6ee99d24a345d8c234f8e49c6886365780eae1"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"80bad274ff4ccf1ad8d4a535670fd1fd35342141","unresolved":false,"context_lines":[{"line_number":240,"context_line":""},{"line_number":241,"context_line":"        returned_list \u003d self.manager.list(**filter_kwargs)"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        # The expected query string can be passed appended to expected path,"},{"line_number":244,"context_line":"        # otherwise we create the expected path from the filter_kwargs"},{"line_number":245,"context_line":"        if filter_kwargs:"},{"line_number":246,"context_line":"            path_split \u003d urlparse.urlsplit(expected_path)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FJj4%3D","line":243,"in_reply_to":"AAAAUH%2F%2FPao%3D","updated":"2014-01-16 23:50:01.000000000","message":"That\u0027s pretty much what I had in patch #2 before JamieLennox asked me to remove it.... I\u0027ll reinstate a similar interface again tomorrow.","commit_id":"1a6ee99d24a345d8c234f8e49c6886365780eae1"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"dd6ab7519dfff25e00cc8ad470ace64f24578a2b","unresolved":false,"context_lines":[{"line_number":241,"context_line":"        returned_list \u003d self.manager.list(**filter_kwargs)"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        # The expected query string can be passed appended to expected path,"},{"line_number":244,"context_line":"        # otherwise we create the expected path from the filter_kwargs"},{"line_number":245,"context_line":"        if filter_kwargs:"},{"line_number":246,"context_line":"            path_split \u003d urlparse.urlsplit(expected_path)"},{"line_number":247,"context_line":"            qs \u003d path_split.query or urlparse.urlencode("}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FPaw%3D","line":244,"updated":"2014-01-16 00:54:33.000000000","message":"\"expected path\" should be \"expected query string\" here.","commit_id":"1a6ee99d24a345d8c234f8e49c6886365780eae1"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"57f9f4763c0c42cdadd99a978da003048a6f30de","unresolved":false,"context_lines":[{"line_number":254,"context_line":"        # register_uri doesn\u0027t match the querystring component, so we have to"},{"line_number":255,"context_line":"        # explicitly test the querystring component passed by the manager"},{"line_number":256,"context_line":"        qs_args \u003d httpretty.last_request().querystring"},{"line_number":257,"context_line":"        for key, value in six.iteritems(expected_query):"},{"line_number":258,"context_line":"            self.assertIn(key, qs_args)"},{"line_number":259,"context_line":"            # The httppretty.querystring value is a list"},{"line_number":260,"context_line":"            self.assertIn(unicode(value), qs_args[key])"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2FHSk%3D","line":257,"updated":"2014-02-17 02:34:31.000000000","message":"nit: could have just been (expected_query or filter_kwargs):","commit_id":"1e9de371e5a8223ea1db413ffe285251ae5f7df0"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"57f9f4763c0c42cdadd99a978da003048a6f30de","unresolved":false,"context_lines":[{"line_number":257,"context_line":"        for key, value in six.iteritems(expected_query):"},{"line_number":258,"context_line":"            self.assertIn(key, qs_args)"},{"line_number":259,"context_line":"            # The httppretty.querystring value is a list"},{"line_number":260,"context_line":"            self.assertIn(unicode(value), qs_args[key])"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    @httpretty.activate"},{"line_number":263,"context_line":"    def test_list_params(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2FHSg%3D","line":260,"updated":"2014-02-17 02:34:31.000000000","message":"i *think* you want six.u() for unicode in py3, strange that it should need converting anyway","commit_id":"1e9de371e5a8223ea1db413ffe285251ae5f7df0"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"a445ff86d00b0ed1e698eb745952be66c7b465ae","unresolved":false,"context_lines":[{"line_number":257,"context_line":"            # Note we convert the value to a string, as the query string"},{"line_number":258,"context_line":"            # is always a string and the filter_kwargs may contain non-string"},{"line_number":259,"context_line":"            # values, for example a boolean, causing the comaprison to fail."},{"line_number":260,"context_line":"            self.assertIn(str(value), qs_args[key])"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    @httpretty.activate"},{"line_number":263,"context_line":"    def test_list_params(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2B9k4%3D","line":260,"updated":"2014-02-18 00:06:48.000000000","message":"do we also need to validate that if there are no extra qs_args? (i.e., values in qs_args not in six.iteritems(expected_query or filter_kwargs)","commit_id":"0f51a84e4c26e8856ec5c909d983163ee7b99fe2"}]}
