)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"05b4485449a0939550487789d1cf6dc99716e965","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Set the base views mechanism in place and convert the credentials"},{"line_number":10,"context_line":"controller to use views instead of the controller."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Implements: bp views"},{"line_number":13,"context_line":"Change-Id: I1d81172f5f9a1372b352c097a1a78ff89f1865dc"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"1aa78d24_2406a420","line":12,"range":{"start_line":12,"start_character":0,"end_line":12,"end_character":20},"updated":"2016-07-08 14:16:34.000000000","message":"Does not exist for keystone","commit_id":"bc7822789e04da95c7d3560670ace2b48819f1c6"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"47728a3dfc7b02eacebce8d674df4f95b08e8546","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Set the base views mechanism in place and convert the credentials"},{"line_number":10,"context_line":"controller to use views instead of the controller."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Implements: bp views"},{"line_number":13,"context_line":"Change-Id: I1d81172f5f9a1372b352c097a1a78ff89f1865dc"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"1aa78d24_49aacdd3","line":12,"range":{"start_line":12,"start_character":0,"end_line":12,"end_character":20},"in_reply_to":"1aa78d24_2406a420","updated":"2016-07-08 23:28:11.000000000","message":"I\u0027m not sure how else to link it: https://blueprints.launchpad.net/keystone/+spec/views","commit_id":"bc7822789e04da95c7d3560670ace2b48819f1c6"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"12c0151de36da76627d17f02b320a24747188f47","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Set the base views mechanism in place and convert the credentials"},{"line_number":10,"context_line":"controller to use views instead of the controller."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Implements: bp views"},{"line_number":13,"context_line":"Change-Id: I1d81172f5f9a1372b352c097a1a78ff89f1865dc"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"fad55976_8358df33","line":12,"range":{"start_line":12,"start_character":0,"end_line":12,"end_character":20},"in_reply_to":"1aa78d24_49aacdd3","updated":"2016-07-16 20:21:10.000000000","message":"just drop the whole url in addition i suppose:\n\n  implements bp views\n  \n  url: https://blueprints.launchpad.net/keystone/+spec/views\n\nor try renaming it?  api-views?","commit_id":"bc7822789e04da95c7d3560670ace2b48819f1c6"}],"keystone/api/views/base.py":[{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"3e39b7b575f01d26518e133e673d745bd6735d47","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        :rtype: str"},{"line_number":87,"context_line":"        \"\"\""},{"line_number":88,"context_line":"        # FIXME(jamielennox): we shouldn\u0027t assume v3 is mounted at /v3"},{"line_number":89,"context_line":"        return \u0027%s/v3/%s\u0027 % (self.host_url, self.member_path(obj).lstrip(\u0027/\u0027))"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def render(self, obj):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a89bdaa_e69605ef","line":88,"updated":"2016-09-07 18:05:17.000000000","message":"Agreed: this better be more flexible.","commit_id":"6971c7783fa7e03f31bb779b2aeb62afea05f843"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a5a26c9a792c66d1d42b7a2a41192d982d5f59e9","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        :rtype: str"},{"line_number":87,"context_line":"        \"\"\""},{"line_number":88,"context_line":"        # FIXME(jamielennox): we shouldn\u0027t assume v3 is mounted at /v3"},{"line_number":89,"context_line":"        return \u0027%s/v3/%s\u0027 % (self.host_url, self.member_path(obj).lstrip(\u0027/\u0027))"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def render(self, obj):"},{"line_number":92,"context_line":"        \"\"\"Render a single object either on its own or part of a list."}],"source_content_type":"text/x-python","patch_set":8,"id":"bacf61ea_52b81ac8","line":89,"updated":"2016-08-05 18:54:48.000000000","message":"It looks like this will only work for v3 initially? Can we take all the common stuff here and move it into a true base view that can be used by both v2.0 and v3?","commit_id":"6971c7783fa7e03f31bb779b2aeb62afea05f843"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"3e39b7b575f01d26518e133e673d745bd6735d47","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        return \u0027%s/v3/%s\u0027 % (self.host_url, self.member_path(obj).lstrip(\u0027/\u0027))"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def render(self, obj):"},{"line_number":92,"context_line":"        \"\"\"Render a single object either on its own or part of a list."},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        This function takes the objects that have been retrieved from the"},{"line_number":95,"context_line":"        backend and converts it into the format that is to be returned to the"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a89bdaa_29f19e01","line":92,"updated":"2016-09-07 18:05:17.000000000","message":"All this \"part of a list\" thing is quite confusing. IMHO either rename obj to item/list_item or just change the doc not to mention list stuff.","commit_id":"6971c7783fa7e03f31bb779b2aeb62afea05f843"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"3e39b7b575f01d26518e133e673d745bd6735d47","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    def render(self, obj):"},{"line_number":92,"context_line":"        \"\"\"Render a single object either on its own or part of a list."},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        This function takes the objects that have been retrieved from the"},{"line_number":95,"context_line":"        backend and converts it into the format that is to be returned to the"},{"line_number":96,"context_line":"        api."},{"line_number":97,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9a89bdaa_4944221a","line":94,"range":{"start_line":94,"start_character":28,"end_line":94,"end_character":39},"updated":"2016-09-07 18:05:17.000000000","message":"m.b. \u0027the object\u0027 ?","commit_id":"6971c7783fa7e03f31bb779b2aeb62afea05f843"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"3e39b7b575f01d26518e133e673d745bd6735d47","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        backend and converts it into the format that is to be returned to the"},{"line_number":96,"context_line":"        api."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        This output should be independant of the expected output mime type."},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        :param obj: the backend object to transform."},{"line_number":101,"context_line":"        :type ob: dict"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a89bdaa_a9012eb1","line":98,"range":{"start_line":98,"start_character":30,"end_line":98,"end_character":41},"updated":"2016-09-07 18:05:17.000000000","message":"independent?","commit_id":"6971c7783fa7e03f31bb779b2aeb62afea05f843"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"3e39b7b575f01d26518e133e673d745bd6735d47","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            for p in self.required_params or []:"},{"line_number":108,"context_line":"                if p not in obj:"},{"line_number":109,"context_line":"                    # do something better here"},{"line_number":110,"context_line":"                    raise RuntimeError()"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"            output \u003d copy.deepcopy(obj)"},{"line_number":113,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9a89bdaa_c9ecb2f5","line":110,"updated":"2016-09-07 18:05:17.000000000","message":"Yes, if it\u0027s caught, it should be handled.","commit_id":"6971c7783fa7e03f31bb779b2aeb62afea05f843"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"3e39b7b575f01d26518e133e673d745bd6735d47","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        try:"},{"line_number":215,"context_line":"            render_func \u003d getattr(self, render_func_name)"},{"line_number":216,"context_line":"        except AttributeError:"},{"line_number":217,"context_line":"            msg \u003d _(\u0027View expects to render %(type)s with the %(name)s \u0027"},{"line_number":218,"context_line":"                    \u0027renderer. This function was not found. This is an \u0027"},{"line_number":219,"context_line":"                    \u0027implementation Error, please implement %(func)s.\u0027)"},{"line_number":220,"context_line":"            raise NotImplementedError(msg % {\u0027type\u0027: render_type,"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a89bdaa_e9197689","line":217,"updated":"2016-09-07 18:05:17.000000000","message":"Is i18n needed for internal error messages?","commit_id":"6971c7783fa7e03f31bb779b2aeb62afea05f843"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"3e39b7b575f01d26518e133e673d745bd6735d47","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        response.content_type \u003d best_match"},{"line_number":225,"context_line":"        return render_func(*args, **kwargs)"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    def show(self, obj, **kwargs):"},{"line_number":228,"context_line":"        \"\"\"Create a response that displays an object."},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        :param obj: The object to show."}],"source_content_type":"text/x-python","patch_set":8,"id":"9a89bdaa_dc9c6ec2","line":227,"updated":"2016-09-07 18:05:17.000000000","message":"Naming nit: I\u0027d suggest names like item_list, item_show, item_created, item_deleted.\n\nCurrently naming mimics CRUD, but update is missing and 2 different retrieval operations are present.","commit_id":"6971c7783fa7e03f31bb779b2aeb62afea05f843"}],"keystone/api/views/v3/base.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"12c0151de36da76627d17f02b320a24747188f47","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        response.content_type \u003d best_match"},{"line_number":224,"context_line":"        return render_func(*args, **kwargs)"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    def show(self, obj, **kwargs):"},{"line_number":227,"context_line":"        \"\"\"Create a response that displays an object."},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"        :param obj: The object to show."},{"line_number":230,"context_line":"        :type obj: dict"},{"line_number":231,"context_line":"        :rtype: :py:class:`webob.Response`"},{"line_number":232,"context_line":"        \"\"\""},{"line_number":233,"context_line":"        response \u003d self.create_response()"},{"line_number":234,"context_line":"        response.status_code \u003d 200"},{"line_number":235,"context_line":"        response.body \u003d self._do_render(\u0027member\u0027, response, obj, **kwargs)"},{"line_number":236,"context_line":"        return response"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"    def create(self, obj, **kwargs):"},{"line_number":239,"context_line":"        \"\"\"Create a response that displays an object that was just created."}],"source_content_type":"text/x-python","patch_set":5,"id":"fad55976_e35efb10","line":236,"range":{"start_line":226,"start_character":4,"end_line":236,"end_character":23},"updated":"2016-07-16 20:21:10.000000000","message":"what about update?","commit_id":"bc7822789e04da95c7d3560670ace2b48819f1c6"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"62ceb214a84f0bf1c480ec1333c0a2c4c1cf5252","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        response.content_type \u003d best_match"},{"line_number":224,"context_line":"        return render_func(*args, **kwargs)"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    def show(self, obj, **kwargs):"},{"line_number":227,"context_line":"        \"\"\"Create a response that displays an object."},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"        :param obj: The object to show."},{"line_number":230,"context_line":"        :type obj: dict"},{"line_number":231,"context_line":"        :rtype: :py:class:`webob.Response`"},{"line_number":232,"context_line":"        \"\"\""},{"line_number":233,"context_line":"        response \u003d self.create_response()"},{"line_number":234,"context_line":"        response.status_code \u003d 200"},{"line_number":235,"context_line":"        response.body \u003d self._do_render(\u0027member\u0027, response, obj, **kwargs)"},{"line_number":236,"context_line":"        return response"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"    def create(self, obj, **kwargs):"},{"line_number":239,"context_line":"        \"\"\"Create a response that displays an object that was just created."}],"source_content_type":"text/x-python","patch_set":5,"id":"dada55a8_a2472b1c","line":236,"range":{"start_line":226,"start_character":4,"end_line":236,"end_character":23},"in_reply_to":"fad55976_e35efb10","updated":"2016-07-22 20:46:02.000000000","message":"is it a different response? \n\nThe individual views can do whatever they like i was just providing the basic information they would probably use.","commit_id":"bc7822789e04da95c7d3560670ace2b48819f1c6"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"672dc88e955ded227aeb6a56507e62a59d157067","unresolved":false,"context_lines":[{"line_number":24,"context_line":"CONF \u003d cfg.CONF"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class View(object):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    required_params \u003d None"},{"line_number":30,"context_line":"    optional_params \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"dada55a8_90cae89f","line":27,"updated":"2016-07-25 21:22:19.000000000","message":"We could make this an abstract base class.","commit_id":"9bc4715591fdac6d9cef1c023e8e8525dcb6aa34"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"bf7431838b392448a9f0bea1a7a9a0bfee97061b","unresolved":false,"context_lines":[{"line_number":24,"context_line":"CONF \u003d cfg.CONF"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class View(object):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    required_params \u003d None"},{"line_number":30,"context_line":"    optional_params \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"dada55a8_5227a111","line":27,"in_reply_to":"dada55a8_90cae89f","updated":"2016-07-26 17:20:54.000000000","message":"Actually I wonder if we could abstract this out into another base class and share it between the v2 views and the v3 views.","commit_id":"9bc4715591fdac6d9cef1c023e8e8525dcb6aa34"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e7c7432ced2f181ded2162f2f7035cda9c627c74","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        :rtype: str"},{"line_number":87,"context_line":"        \"\"\""},{"line_number":88,"context_line":"        # FIXME(jamielennox): we shouldn\u0027t assume v3 is mounted at /v3"},{"line_number":89,"context_line":"        return \u0027%s/v3/%s\u0027 % (self.host_url, self.member_path(obj).lstrip(\u0027/\u0027))"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def render(self, obj):"},{"line_number":92,"context_line":"        \"\"\"Render a single object either on its own or part of a list."}],"source_content_type":"text/x-python","patch_set":6,"id":"dada55a8_2a08e9d8","line":89,"updated":"2016-07-25 21:08:30.000000000","message":"What happens if self.host_url ends up being something like:\n\n    self.host_url \u003d \u0027http://localhost:35357/v3/\u0027\n\nWe should make sure we parse the host_url and make sure it doesn\u0027t already have a version path on it, as well as trailing forward-slashes.","commit_id":"9bc4715591fdac6d9cef1c023e8e8525dcb6aa34"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e7c7432ced2f181ded2162f2f7035cda9c627c74","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        :returns: The displayable output."},{"line_number":104,"context_line":"        :rtype: dict"},{"line_number":105,"context_line":"        \"\"\""},{"line_number":106,"context_line":"        if self.include_extras:"},{"line_number":107,"context_line":"            for p in self.required_params or []:"},{"line_number":108,"context_line":"                if p not in obj:"},{"line_number":109,"context_line":"                    # do something better here"}],"source_content_type":"text/x-python","patch_set":6,"id":"dada55a8_4a639d1a","line":106,"updated":"2016-07-25 21:08:30.000000000","message":"This is tripping me up. The naming of this if statement makes it seem like we are checking if we can display extra attributes returned back from the Manager/Model, but the following logic blows up if we don\u0027t have all the required parameters. So it seems like we are doing a \"is everything we\u0027re required to display included\" check instead of a \"are we returning extra things\" check.\n\nIf we are checking if a view is allowed to display extra arguments, then do we want to do something with those before we display them? Here we check if we are going to display extra things, but only seem to care about parameters that are required.","commit_id":"9bc4715591fdac6d9cef1c023e8e8525dcb6aa34"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e7c7432ced2f181ded2162f2f7035cda9c627c74","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        if self.include_extras:"},{"line_number":107,"context_line":"            for p in self.required_params or []:"},{"line_number":108,"context_line":"                if p not in obj:"},{"line_number":109,"context_line":"                    # do something better here"},{"line_number":110,"context_line":"                    raise RuntimeError()"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"            output \u003d copy.deepcopy(obj)"}],"source_content_type":"text/x-python","patch_set":6,"id":"dada55a8_6a01416a","line":109,"updated":"2016-07-25 21:08:30.000000000","message":"So, this would technically mean that the credential Manager() didn\u0027t give everything the view needs to render the object, right?","commit_id":"9bc4715591fdac6d9cef1c023e8e8525dcb6aa34"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e7c7432ced2f181ded2162f2f7035cda9c627c74","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                try:"},{"line_number":119,"context_line":"                    output[p] \u003d obj[p]"},{"line_number":120,"context_line":"                except KeyError:"},{"line_number":121,"context_line":"                    # do something better here"},{"line_number":122,"context_line":"                    raise RuntimeError()"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"            for p in self.optional_params or []:"}],"source_content_type":"text/x-python","patch_set":6,"id":"dada55a8_154c2a6f","line":121,"updated":"2016-07-25 21:08:30.000000000","message":"If we hit this line, we have a bug in our Manager()/Model() code, right? This would technically mean that our View is expecting a specific parameter but it never got it from the backend or Manager().","commit_id":"9bc4715591fdac6d9cef1c023e8e8525dcb6aa34"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e7c7432ced2f181ded2162f2f7035cda9c627c74","unresolved":false,"context_lines":[{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        :rtype: bytes"},{"line_number":155,"context_line":"        \"\"\""},{"line_number":156,"context_line":"        collection_url \u003d self.host_url + self.request.path"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        if self.request.query_string:"},{"line_number":159,"context_line":"            collection_url \u003d \u0027?\u0027.join([collection_url,"}],"source_content_type":"text/x-python","patch_set":6,"id":"dada55a8_35ecce28","line":156,"updated":"2016-07-25 21:08:30.000000000","message":"I think this could be a class level variable/property.","commit_id":"9bc4715591fdac6d9cef1c023e8e8525dcb6aa34"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e7c7432ced2f181ded2162f2f7035cda9c627c74","unresolved":false,"context_lines":[{"line_number":207,"context_line":""},{"line_number":208,"context_line":"        try:"},{"line_number":209,"context_line":"            render_func_name \u003d \u0027render_%s_%s\u0027 % (render_name, render_type)"},{"line_number":210,"context_line":"        except KeyError:"},{"line_number":211,"context_line":"            raise webob.exc.HTTPNotAcceptable()"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"dada55a8_6aae6199","line":210,"updated":"2016-07-25 21:08:30.000000000","message":"What results in the `KeyError` here?","commit_id":"9bc4715591fdac6d9cef1c023e8e8525dcb6aa34"}],"keystone/api/views/v3/credential.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"12c0151de36da76627d17f02b320a24747188f47","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    member_name \u003d \u0027credential\u0027"},{"line_number":21,"context_line":"    collection_name \u003d \u0027credentials\u0027"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    required_params \u003d ["},{"line_number":24,"context_line":"        \u0027id\u0027,"},{"line_number":25,"context_line":"        \u0027user_id\u0027,"},{"line_number":26,"context_line":"        \u0027type\u0027,"},{"line_number":27,"context_line":"    ]"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    optional_params \u003d ["},{"line_number":30,"context_line":"        \u0027project_id\u0027,"},{"line_number":31,"context_line":"    ]"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def render(self, obj):"},{"line_number":34,"context_line":"        output \u003d super(CredentialView, self).render(obj)"}],"source_content_type":"text/x-python","patch_set":5,"id":"fad55976_63a96bdf","line":31,"range":{"start_line":23,"start_character":0,"end_line":31,"end_character":5},"updated":"2016-07-16 20:21:10.000000000","message":"whats the point of these? are they doing validation, like we do with json schema?","commit_id":"bc7822789e04da95c7d3560670ace2b48819f1c6"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"62ceb214a84f0bf1c480ec1333c0a2c4c1cf5252","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    member_name \u003d \u0027credential\u0027"},{"line_number":21,"context_line":"    collection_name \u003d \u0027credentials\u0027"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    required_params \u003d ["},{"line_number":24,"context_line":"        \u0027id\u0027,"},{"line_number":25,"context_line":"        \u0027user_id\u0027,"},{"line_number":26,"context_line":"        \u0027type\u0027,"},{"line_number":27,"context_line":"    ]"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    optional_params \u003d ["},{"line_number":30,"context_line":"        \u0027project_id\u0027,"},{"line_number":31,"context_line":"    ]"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def render(self, obj):"},{"line_number":34,"context_line":"        output \u003d super(CredentialView, self).render(obj)"}],"source_content_type":"text/x-python","patch_set":5,"id":"dada55a8_820e67e3","line":31,"range":{"start_line":23,"start_character":0,"end_line":31,"end_character":5},"in_reply_to":"fad55976_63a96bdf","updated":"2016-07-22 20:46:02.000000000","message":"They do validation for required_params but they typically optional is ignored because we have to deal with extras. There are some views that don\u0027t accept extras and they use these a lot and hopefully in future i want to be configurably able to turn extras off.","commit_id":"bc7822789e04da95c7d3560670ace2b48819f1c6"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"8ce4bf4ba2d7e5b508821b6f853f553e56782731","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    optional_params \u003d ["},{"line_number":30,"context_line":"        \u0027project_id\u0027,"},{"line_number":31,"context_line":"    ]"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def render(self, obj):"},{"line_number":34,"context_line":"        output \u003d super(CredentialView, self).render(obj)"}],"source_content_type":"text/x-python","patch_set":6,"id":"dada55a8_55d34238","line":31,"updated":"2016-07-25 21:11:06.000000000","message":"Interesting. Since we use jsonschema on the front end to validate incoming requests - I wonder if we should follow that same pattern here to use jsonschema to validate responses on the way out.","commit_id":"9bc4715591fdac6d9cef1c023e8e8525dcb6aa34"}],"keystone/common/controller.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"f1dff65feb3bdd9a2db103a0303b04254f7fa6fb","unresolved":false,"context_lines":[{"line_number":505,"context_line":"            refs \u003d cls.filter_by_attributes(refs, hints)"},{"line_number":506,"context_line":"            return cls.limit(refs, hints)"},{"line_number":507,"context_line":""},{"line_number":508,"context_line":"        return False, refs"},{"line_number":509,"context_line":""},{"line_number":510,"context_line":"    @classmethod"},{"line_number":511,"context_line":"    def render_list(cls, view, refs, hints\u003dNone):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3aaa91ec_87498762","line":508,"range":{"start_line":508,"start_character":15,"end_line":508,"end_character":20},"updated":"2016-07-01 11:16:43.000000000","message":"it might be nice to use a similar approach to the limit() method here, by having something like NOT_LIMITED \u003d False defined, and then use NOT_LIMITED here for clarity","commit_id":"e206d5fe09b3a3c265b4e85accbad16d1ea0a8df"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"3e39b7b575f01d26518e133e673d745bd6735d47","unresolved":false,"context_lines":[{"line_number":494,"context_line":"                                             refs,"},{"line_number":495,"context_line":"                                             hints)"},{"line_number":496,"context_line":""},{"line_number":497,"context_line":"        return view.list(refs, truncated\u003dlist_limited)"},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"    @classmethod"},{"line_number":500,"context_line":"    def wrap_collection(cls, context, refs, hints\u003dNone):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a89bdaa_7cdc4273","line":497,"updated":"2016-09-07 18:05:17.000000000","message":"\u0027list\u0027 is highlighted. I wonder why ;)","commit_id":"6971c7783fa7e03f31bb779b2aeb62afea05f843"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"06d0d26e8c496d38ccb0e1adc96aabaaf4fbe060","unresolved":false,"context_lines":[{"line_number":494,"context_line":"                                             refs,"},{"line_number":495,"context_line":"                                             hints)"},{"line_number":496,"context_line":""},{"line_number":497,"context_line":"        return view.list(refs, truncated\u003dlist_limited)"},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"    @classmethod"},{"line_number":500,"context_line":"    def wrap_collection(cls, context, refs, hints\u003dNone):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a89bdaa_5fdf7068","line":497,"in_reply_to":"9a89bdaa_7cdc4273","updated":"2016-09-07 18:28:19.000000000","message":"because it is a builtin type","commit_id":"6971c7783fa7e03f31bb779b2aeb62afea05f843"}],"keystone/credential/controllers.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"12c0151de36da76627d17f02b320a24747188f47","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    @controller.protected()"},{"line_number":94,"context_line":"    def delete_credential(self, request, credential_id):"},{"line_number":95,"context_line":"        self.credential_api.delete_credential(credential_id)"},{"line_number":96,"context_line":"        return view.CredentialView(request).delete(credential_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"fad55976_e3471b49","line":96,"range":{"start_line":96,"start_character":8,"end_line":96,"end_character":65},"updated":"2016-07-16 20:21:10.000000000","message":"nit, why does this even return anything?","commit_id":"bc7822789e04da95c7d3560670ace2b48819f1c6"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"62ceb214a84f0bf1c480ec1333c0a2c4c1cf5252","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    @controller.protected()"},{"line_number":94,"context_line":"    def delete_credential(self, request, credential_id):"},{"line_number":95,"context_line":"        self.credential_api.delete_credential(credential_id)"},{"line_number":96,"context_line":"        return view.CredentialView(request).delete(credential_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"dada55a8_8225c75d","line":96,"range":{"start_line":96,"start_character":8,"end_line":96,"end_character":65},"in_reply_to":"fad55976_e3471b49","updated":"2016-07-22 20:46:02.000000000","message":"it returns a 204 with no body. We could still handle this at a higher level and return 204 if None is returned, but its better to return something - the view just doesn\u0027t really do anything.","commit_id":"bc7822789e04da95c7d3560670ace2b48819f1c6"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e7c7432ced2f181ded2162f2f7035cda9c627c74","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    def list_credentials(self, request, filters):"},{"line_number":75,"context_line":"        hints \u003d self.build_driver_hints(request, filters)"},{"line_number":76,"context_line":"        refs \u003d self.credential_api.list_credentials(hints)"},{"line_number":77,"context_line":"        return self.render_list(view.CredentialView(request), refs, hints)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    @controller.protected()"},{"line_number":80,"context_line":"    def get_credential(self, request, credential_id):"}],"source_content_type":"text/x-python","patch_set":6,"id":"dada55a8_ca966d93","line":77,"updated":"2016-07-25 21:08:30.000000000","message":"Should the view also render a list? All other methods here use views to render the results:\n\n    view.CredentialView(request).create(ref)\n    view.CredentialView(request).show(ref)\n\nShould we have one for listing, too?\n\n    view.CredentialView(request).list(ref)","commit_id":"9bc4715591fdac6d9cef1c023e8e8525dcb6aa34"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"3e39b7b575f01d26518e133e673d745bd6735d47","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        ref \u003d self._assign_unique_id(self._normalize_dict(credential),"},{"line_number":69,"context_line":"                                     request.context.trust_id)"},{"line_number":70,"context_line":"        ref \u003d self.credential_api.create_credential(ref[\u0027id\u0027], ref)"},{"line_number":71,"context_line":"        return view.CredentialView(request).create(ref)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    @controller.filterprotected(\u0027user_id\u0027, \u0027type\u0027)"},{"line_number":74,"context_line":"    def list_credentials(self, request, filters):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a89bdaa_dc5f0ee3","line":71,"updated":"2016-09-07 18:05:17.000000000","message":"Once again about naming. This \u0027create\u0027 doesn\u0027t actually creates anything, right?","commit_id":"6971c7783fa7e03f31bb779b2aeb62afea05f843"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"3e39b7b575f01d26518e133e673d745bd6735d47","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    @controller.protected()"},{"line_number":93,"context_line":"    def delete_credential(self, request, credential_id):"},{"line_number":94,"context_line":"        self.credential_api.delete_credential(credential_id)"},{"line_number":95,"context_line":"        return view.CredentialView(request).delete(credential_id)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a89bdaa_3c5b9af7","line":95,"updated":"2016-09-07 18:05:17.000000000","message":"same here","commit_id":"6971c7783fa7e03f31bb779b2aeb62afea05f843"}],"keystone/tests/unit/test_views.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6a919b12cbad56747e9696835adfec0cfe556c1c","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class ViewsTestCase(unit.TestCase):"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def test_render_extras(self):"},{"line_number":42,"context_line":"        obj \u003d {\u0027a\u0027: 1, \u0027b\u0027: 2, \u0027c\u0027: 3, \u0027d\u0027: 4, \u0027id\u0027: 1234}"},{"line_number":43,"context_line":"        expected \u003d {\u0027a\u0027: 1,"},{"line_number":44,"context_line":"                    \u0027b\u0027: 2,"}],"source_content_type":"text/x-python","patch_set":7,"id":"bacf61ea_c2b67cdb","line":41,"updated":"2016-07-28 19:01:47.000000000","message":"nit: \n\n  test_render_required_params(self):","commit_id":"ea20825eea1cf0b661d1d1b6dbf0ee28adaeac77"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a5a26c9a792c66d1d42b7a2a41192d982d5f59e9","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            }"},{"line_number":89,"context_line":"        }"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        request \u003d webob.Request.blank(\u0027/\u0027, accept\u003d\u0027application/json\u0027)"},{"line_number":92,"context_line":"        resp \u003d SampleExtrasView(request).show(obj)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        self.assertEqual(200, resp.status_code)"}],"source_content_type":"text/x-python","patch_set":8,"id":"bacf61ea_720a7e21","line":91,"updated":"2016-08-05 18:54:48.000000000","message":"This could probably be pulled into the setUp() method, since it doesn\u0027t really seem to differ across some of the tests.\n\n\nDIff of applying that change - http://cdn.pasteraw.com/n7nrr1aythn2pnckd3rkjp234psq6fi","commit_id":"6971c7783fa7e03f31bb779b2aeb62afea05f843"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"06d0d26e8c496d38ccb0e1adc96aabaaf4fbe060","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            }"},{"line_number":89,"context_line":"        }"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        request \u003d webob.Request.blank(\u0027/\u0027, accept\u003d\u0027application/json\u0027)"},{"line_number":92,"context_line":"        resp \u003d SampleExtrasView(request).show(obj)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        self.assertEqual(200, resp.status_code)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a89bdaa_5f6a10b4","line":91,"in_reply_to":"bacf61ea_720a7e21","updated":"2016-09-07 18:28:19.000000000","message":"++","commit_id":"6971c7783fa7e03f31bb779b2aeb62afea05f843"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"3e39b7b575f01d26518e133e673d745bd6735d47","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            }"},{"line_number":89,"context_line":"        }"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        request \u003d webob.Request.blank(\u0027/\u0027, accept\u003d\u0027application/json\u0027)"},{"line_number":92,"context_line":"        resp \u003d SampleExtrasView(request).show(obj)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        self.assertEqual(200, resp.status_code)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a89bdaa_fcd93258","line":91,"in_reply_to":"bacf61ea_720a7e21","updated":"2016-09-07 18:05:17.000000000","message":"+1 It repeats several time unchanged.","commit_id":"6971c7783fa7e03f31bb779b2aeb62afea05f843"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a5a26c9a792c66d1d42b7a2a41192d982d5f59e9","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        }"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        request \u003d webob.Request.blank(\u0027/v3/tests\u0027,"},{"line_number":173,"context_line":"                                      accept\u003d\u0027application/json\u0027)"},{"line_number":174,"context_line":"        resp \u003d SampleExtrasView(request).list(obj)"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"        self.assertEqual(200, resp.status_code)"}],"source_content_type":"text/x-python","patch_set":8,"id":"bacf61ea_d2dfea66","line":173,"updated":"2016-08-05 18:54:48.000000000","message":"I think this can all fit on one line (like like 195 below).","commit_id":"6971c7783fa7e03f31bb779b2aeb62afea05f843"}]}
