)]}'
{"tempest/service_clients.py":[{"author":{"_account_id":17716,"name":"Luz Cazares","email":"luz.cazares@intel.com","username":"luzcazares"},"change_message_id":"fba5d63133ca6fff761c86bc958ce03efcfcc664","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        :param client_names List or set of names of the service client classes."},{"line_number":48,"context_line":"        :param auth_provider The auth provider used to initialise client."},{"line_number":49,"context_line":"        :param kwargs Parameters to be passed to all clients. Parameters values"},{"line_number":50,"context_line":"            can be overwritten when clients are initialised, but parameters"},{"line_number":51,"context_line":"            cannot be deleted."},{"line_number":52,"context_line":"        :raise ImportError if the specified module_path cannot be imported"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"3aaa91ec_72def33e","line":50,"range":{"start_line":50,"start_character":48,"end_line":50,"end_character":59},"updated":"2016-06-30 23:55:12.000000000","message":"s/initialised/initialized","commit_id":"4a74d95af6fa64d2e5cf996899ad3d7cf3cd1a21"},{"author":{"_account_id":17716,"name":"Luz Cazares","email":"luz.cazares@intel.com","username":"luzcazares"},"change_message_id":"2ae5930570ded2d9d185619484e691e593736ecf","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        :param client_names List or set of names of the service client classes."},{"line_number":48,"context_line":"        :param auth_provider The auth provider used to initialise client."},{"line_number":49,"context_line":"        :param kwargs Parameters to be passed to all clients. Parameters values"},{"line_number":50,"context_line":"            can be overwritten when clients are initialised, but parameters"},{"line_number":51,"context_line":"            cannot be deleted."},{"line_number":52,"context_line":"        :raise ImportError if the specified module_path cannot be imported"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"3aaa91ec_8675fefb","line":50,"range":{"start_line":50,"start_character":48,"end_line":50,"end_character":59},"in_reply_to":"3aaa91ec_4af5f180","updated":"2016-07-01 15:05:41.000000000","message":"Not at all :)","commit_id":"4a74d95af6fa64d2e5cf996899ad3d7cf3cd1a21"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"88d089c23936e233fc9b43db3b25a8e3269975fe","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        :param client_names List or set of names of the service client classes."},{"line_number":48,"context_line":"        :param auth_provider The auth provider used to initialise client."},{"line_number":49,"context_line":"        :param kwargs Parameters to be passed to all clients. Parameters values"},{"line_number":50,"context_line":"            can be overwritten when clients are initialised, but parameters"},{"line_number":51,"context_line":"            cannot be deleted."},{"line_number":52,"context_line":"        :raise ImportError if the specified module_path cannot be imported"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"3aaa91ec_4af5f180","line":50,"range":{"start_line":50,"start_character":48,"end_line":50,"end_character":59},"in_reply_to":"3aaa91ec_72def33e","updated":"2016-07-01 08:56:11.000000000","message":"You can see I live in the UK :D\nDo I really have to use US spelling?","commit_id":"4a74d95af6fa64d2e5cf996899ad3d7cf3cd1a21"},{"author":{"_account_id":17716,"name":"Luz Cazares","email":"luz.cazares@intel.com","username":"luzcazares"},"change_message_id":"fba5d63133ca6fff761c86bc958ce03efcfcc664","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            final_kwargs \u003d copy.copy(kwargs)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"            # Set the function as an attribute of the factory"},{"line_number":81,"context_line":"            setattr(self, class_name, self._get_partial_class("},{"line_number":82,"context_line":"                klass, auth_provider, final_kwargs))"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    @classmethod"},{"line_number":85,"context_line":"    def _get_partial_class(cls, klass, auth_provider, kwargs):"}],"source_content_type":"text/x-python","patch_set":23,"id":"3aaa91ec_b2097b33","line":82,"range":{"start_line":81,"start_character":12,"end_line":82,"end_character":52},"updated":"2016-06-30 23:55:12.000000000","message":"Question: How are api versions handled. eg \"volume.v1.QuotasClient\" vs \"volume.v2.QuotasClient\" (with volumes \u003d\u003d tempest.services.volume)? Would that end up writing to the same self.class_name?","commit_id":"4a74d95af6fa64d2e5cf996899ad3d7cf3cd1a21"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"88d089c23936e233fc9b43db3b25a8e3269975fe","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            final_kwargs \u003d copy.copy(kwargs)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"            # Set the function as an attribute of the factory"},{"line_number":81,"context_line":"            setattr(self, class_name, self._get_partial_class("},{"line_number":82,"context_line":"                klass, auth_provider, final_kwargs))"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    @classmethod"},{"line_number":85,"context_line":"    def _get_partial_class(cls, klass, auth_provider, kwargs):"}],"source_content_type":"text/x-python","patch_set":23,"id":"3aaa91ec_8a6fd95e","line":82,"range":{"start_line":81,"start_character":12,"end_line":82,"end_character":52},"in_reply_to":"3aaa91ec_b2097b33","updated":"2016-07-01 08:56:11.000000000","message":"Different versions are implemented in different modules, which are each managed by a dedicated ClientFactory. You can look at I6c3d604e63dbe1cbe30a4bac333f1b8d471ee543 for an example with image_v1 and image_v2","commit_id":"4a74d95af6fa64d2e5cf996899ad3d7cf3cd1a21"},{"author":{"_account_id":14885,"name":"Daniel Mellado","email":"dmellado@redhat.com","username":"daniel-mellado"},"change_message_id":"88627140e299f4534288b0bbd6219b7e8ebff0a2","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    class, which manages the authorization part."},{"line_number":51,"context_line":"    \"\"\""},{"line_number":52,"context_line":"    # TODO(andreaf) This version includes ClientsFactory but it does not define"},{"line_number":53,"context_line":"    # use it yet in ServiceClients"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def __init__(self, module_path, client_names, auth_provider, **kwargs):"},{"line_number":56,"context_line":"        \"\"\"Initialises the client factory"}],"source_content_type":"text/x-python","patch_set":28,"id":"dada55a8_f0d3915d","line":53,"range":{"start_line":53,"start_character":6,"end_line":53,"end_character":34},"updated":"2016-07-19 08:24:28.000000000","message":"I guess here it could say \u0027how to use it yet in/with ServiceClient","commit_id":"4538eb97e4a8604ca09d049aa3455652783c6dbd"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"2fdffa146dd0e4dc90a6d6f2f1e710bb7fb75c26","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    class, which manages the authorization part."},{"line_number":51,"context_line":"    \"\"\""},{"line_number":52,"context_line":"    # TODO(andreaf) This version includes ClientsFactory but it does not define"},{"line_number":53,"context_line":"    # use it yet in ServiceClients"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def __init__(self, module_path, client_names, auth_provider, **kwargs):"},{"line_number":56,"context_line":"        \"\"\"Initialises the client factory"}],"source_content_type":"text/x-python","patch_set":28,"id":"dada55a8_68020d0d","line":53,"range":{"start_line":53,"start_character":6,"end_line":53,"end_character":34},"in_reply_to":"dada55a8_f0d3915d","updated":"2016-07-19 11:16:14.000000000","message":"upz, yes \u0027define\u0027 is redundant.","commit_id":"4538eb97e4a8604ca09d049aa3455652783c6dbd"},{"author":{"_account_id":14885,"name":"Daniel Mellado","email":"dmellado@redhat.com","username":"daniel-mellado"},"change_message_id":"88627140e299f4534288b0bbd6219b7e8ebff0a2","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            # that they accept based out of a list of standard ones."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"            # Obtain the class"},{"line_number":93,"context_line":"            klass \u003d self._get_class(_module, class_name)"},{"line_number":94,"context_line":"            final_kwargs \u003d copy.copy(kwargs)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"            # Set the function as an attribute of the factory"}],"source_content_type":"text/x-python","patch_set":28,"id":"dada55a8_50109d01","line":93,"range":{"start_line":93,"start_character":12,"end_line":93,"end_character":17},"updated":"2016-07-19 08:24:28.000000000","message":"Can we change this name? I think it might be misleading","commit_id":"4538eb97e4a8604ca09d049aa3455652783c6dbd"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"2fdffa146dd0e4dc90a6d6f2f1e710bb7fb75c26","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            # that they accept based out of a list of standard ones."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"            # Obtain the class"},{"line_number":93,"context_line":"            klass \u003d self._get_class(_module, class_name)"},{"line_number":94,"context_line":"            final_kwargs \u003d copy.copy(kwargs)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"            # Set the function as an attribute of the factory"}],"source_content_type":"text/x-python","patch_set":28,"id":"dada55a8_b382ba50","line":93,"range":{"start_line":93,"start_character":12,"end_line":93,"end_character":17},"in_reply_to":"dada55a8_50109d01","updated":"2016-07-19 11:16:14.000000000","message":"Why? class is a reserved word, and \u0027klass\u0027 is a rather common way of calling instances of a type type (or class if you will).\nhttp://codesearch.openstack.org/?q\u003dklass\u0026i\u003dnope\u0026files\u003d\u0026repos\u003d","commit_id":"4538eb97e4a8604ca09d049aa3455652783c6dbd"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"6fd6c92d354ed699a10ea98f102bd8435fdf6cd3","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        # Define a function that returns a new class instance by"},{"line_number":104,"context_line":"        # combining default kwargs with extra ones"},{"line_number":105,"context_line":"        def partial_class(**later_kwargs):"},{"line_number":106,"context_line":"            kwargs.update(later_kwargs)"},{"line_number":107,"context_line":"            return klass(auth_provider\u003dauth_provider, **kwargs)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        return partial_class"}],"source_content_type":"text/x-python","patch_set":28,"id":"1aa78d24_3713bc66","line":106,"updated":"2016-07-13 08:52:22.000000000","message":"If you do\n  later_kwargs.update(kwargs)\n  return klass(auth_provider\u003dauth_provider, **later_kwargs)\n\nYou wouldn\u0027t have to call copy.copy L94 ?\n\nJust a thought though","commit_id":"4538eb97e4a8604ca09d049aa3455652783c6dbd"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"57fea0b33fa5f660aa390f71a166fed8c4473c03","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        # Define a function that returns a new class instance by"},{"line_number":104,"context_line":"        # combining default kwargs with extra ones"},{"line_number":105,"context_line":"        def partial_class(**later_kwargs):"},{"line_number":106,"context_line":"            kwargs.update(later_kwargs)"},{"line_number":107,"context_line":"            return klass(auth_provider\u003dauth_provider, **kwargs)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        return partial_class"}],"source_content_type":"text/x-python","patch_set":28,"id":"dada55a8_6586ebba","line":106,"in_reply_to":"1aa78d24_3713bc66","updated":"2016-07-18 13:40:40.000000000","message":"True, but I want later_kwargs to be able to override kwargs, if I did the other way around the factory default would always win.\n\nlater_kwargs allow getting a client from the factory which contains extra arguments and/or overrides those already handed by the factory.","commit_id":"4538eb97e4a8604ca09d049aa3455652783c6dbd"},{"author":{"_account_id":14885,"name":"Daniel Mellado","email":"dmellado@redhat.com","username":"daniel-mellado"},"change_message_id":"88627140e299f4534288b0bbd6219b7e8ebff0a2","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        # combining default kwargs with extra ones"},{"line_number":105,"context_line":"        def partial_class(**later_kwargs):"},{"line_number":106,"context_line":"            kwargs.update(later_kwargs)"},{"line_number":107,"context_line":"            return klass(auth_provider\u003dauth_provider, **kwargs)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        return partial_class"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"dada55a8_b0ff59a9","line":107,"range":{"start_line":107,"start_character":19,"end_line":107,"end_character":24},"updated":"2016-07-19 08:24:28.000000000","message":"ditto here, I won\u0027t add more but in general for everyone that is being called. Is there any reason behind this name? (maybe I\u0027m not aware of it)","commit_id":"4538eb97e4a8604ca09d049aa3455652783c6dbd"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"2fdffa146dd0e4dc90a6d6f2f1e710bb7fb75c26","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        # combining default kwargs with extra ones"},{"line_number":105,"context_line":"        def partial_class(**later_kwargs):"},{"line_number":106,"context_line":"            kwargs.update(later_kwargs)"},{"line_number":107,"context_line":"            return klass(auth_provider\u003dauth_provider, **kwargs)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        return partial_class"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"dada55a8_d37f6e64","line":107,"range":{"start_line":107,"start_character":19,"end_line":107,"end_character":24},"in_reply_to":"dada55a8_b0ff59a9","updated":"2016-07-19 11:16:14.000000000","message":"Ditto","commit_id":"4538eb97e4a8604ca09d049aa3455652783c6dbd"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"5df40a2ab2aaa61c7befb1e153aae46f8d5eb294","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    def __init__(self, module_path, client_names, auth_provider, **kwargs):"},{"line_number":56,"context_line":"        \"\"\"Initialises the client factory"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        :param module_path Path to module that includes all service clients."},{"line_number":59,"context_line":"            All service client classes must be exposed by a single module."},{"line_number":60,"context_line":"            If they are separated in different modules, defining __all__"},{"line_number":61,"context_line":"            in the root module can help, similar to what is done by service"}],"source_content_type":"text/x-python","patch_set":29,"id":"dada55a8_8f3e50d8","line":58,"updated":"2016-07-25 17:27:45.000000000","message":"I\u0027m fine with this, but would it be better to just pass the module in? Everything in python is basically an object (with a couple exceptions) so we can just import the module and hand it to the factory. That removes the guess work and the importlib step.","commit_id":"73dd51dfe187956fde0aea12112cd5dd3826e042"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"02bc78387441e086212097c7587ba34f38f6f77e","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    def __init__(self, module_path, client_names, auth_provider, **kwargs):"},{"line_number":56,"context_line":"        \"\"\"Initialises the client factory"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        :param module_path Path to module that includes all service clients."},{"line_number":59,"context_line":"            All service client classes must be exposed by a single module."},{"line_number":60,"context_line":"            If they are separated in different modules, defining __all__"},{"line_number":61,"context_line":"            in the root module can help, similar to what is done by service"}],"source_content_type":"text/x-python","patch_set":29,"id":"dada55a8_3b001334","line":58,"in_reply_to":"dada55a8_8f3e50d8","updated":"2016-07-26 14:35:07.000000000","message":"I think the only reason I had a path in here and not a module directly was to delay the import of the service client module, and avoid it if the module is not going to be used. I don\u0027t have any strong motive for that though.","commit_id":"73dd51dfe187956fde0aea12112cd5dd3826e042"}]}
