)]}'
{"openstack/profile.py":[{"author":{"_account_id":8257,"name":"Brian Curtin","email":"brian@python.org","username":"briancurtin"},"change_message_id":"8e6d4f0ae024d04846041b8ff9c6358a730d5528","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    ALL \u003d \"*\""},{"line_number":74,"context_line":"    \"\"\"Wildcard service identifier representing all services.\"\"\""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def __init__(self, extensions\u003d[]):"},{"line_number":77,"context_line":"        \"\"\"User preference for each service."},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        :param list extensions: List of entry point namespace to load."}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_96a1b5f9","line":76,"updated":"2015-07-08 16:17:19.000000000","message":"Should move away from the default mutable lis and have this be None, and below only operate on it if it\u0027s not None.","commit_id":"f22fbc79b997ca97e560167ee059e57c7a1c19c2"},{"author":{"_account_id":8257,"name":"Brian Curtin","email":"brian@python.org","username":"briancurtin"},"change_message_id":"ac39a420b5e690ecd4b9cb58fc9ab7c157f1139e","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        serv.set_visibility(None)"},{"line_number":125,"context_line":"        self._services[serv.service_type] \u003d serv"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        for extension in extensions:"},{"line_number":128,"context_line":"            self.load_extension(extension)"},{"line_number":129,"context_line":"        self.service_names \u003d sorted(self._services.keys())"},{"line_number":130,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_9ee1c72c","line":127,"updated":"2015-07-08 18:42:49.000000000","message":"What are the use cases for having multiple extensions? Since this is all going to be loaded within the reference of one set of credentials, I want to make sure I understand how this is intended to work.\n\nThe Rackspace extension will include everything we are going to offer all at once (both auth and services, I think), so my users are probably only ever going to pass in the single item list [\"rackspace\"]. I\u0027m thinking another case is that new stackforge/openstack projects might want to test the waters by starting as an extension, so we might run into the case of having a few of these, so when pointed to one devstack, you might be able to utilize a few extensions at once.\n\nIs that right? Are there more?","commit_id":"f22fbc79b997ca97e560167ee059e57c7a1c19c2"},{"author":{"_account_id":8736,"name":"Terry Howe","email":"terrylhowe@gmail.com","username":"terrylhowe"},"change_message_id":"4cce82b9df820ed442c87234175c2398583712aa","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        serv.set_visibility(None)"},{"line_number":125,"context_line":"        self._services[serv.service_type] \u003d serv"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        for extension in extensions:"},{"line_number":128,"context_line":"            self.load_extension(extension)"},{"line_number":129,"context_line":"        self.service_names \u003d sorted(self._services.keys())"},{"line_number":130,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a41bdd9_0bb433cf","line":127,"in_reply_to":"ba3cc151_9ee1c72c","updated":"2015-07-16 21:56:47.000000000","message":"That is it.","commit_id":"f22fbc79b997ca97e560167ee059e57c7a1c19c2"},{"author":{"_account_id":8257,"name":"Brian Curtin","email":"brian@python.org","username":"briancurtin"},"change_message_id":"ac39a420b5e690ecd4b9cb58fc9ab7c157f1139e","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        \"\"\""},{"line_number":139,"context_line":"        services \u003d module_loader.load_service_extensions(namespace)"},{"line_number":140,"context_line":"        for service_type in services:"},{"line_number":141,"context_line":"            self._services[service_type] \u003d services[service_type]"},{"line_number":142,"context_line":"        self.service_names \u003d sorted(self._services.keys())"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def get_preference(self, service):"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_9ed547e6","line":141,"updated":"2015-07-08 18:42:49.000000000","message":"I\u0027m thinking we should debug log when a service has been overridden. Something like this above line 141.\n\n    if service_type in self._services:\n        log.debug(\"Overriding %s with %s\", service_type, services[service_type])\n\nIf someone sends me their logs and says the object_store.bulk_delete isn\u0027t working, I\u0027d like to be able to know whether or not my implementation in the Rackspace extension got loaded or if that\u0027s not working because they\u0027re going straight to the OpenStack object_store implementation (where bulk_delete isn\u0027t a thing), or if something else got loaded after mine that wiped it out.","commit_id":"f22fbc79b997ca97e560167ee059e57c7a1c19c2"}],"openstack/user_preference.py":[{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"57bf0ab7d02d5e198e071fc08874ffe8e83ec879","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        \u0027compute\u0027, etc."},{"line_number":72,"context_line":"        \"\"\""},{"line_number":73,"context_line":"        self._preferences \u003d {}"},{"line_number":74,"context_line":"        self._services \u003d module_loader.ModuleLoader().get_services()"},{"line_number":75,"context_line":"        self.service_names \u003d sorted(self._services.keys())"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def __repr__(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_faaa2719","line":74,"updated":"2015-02-13 15:47:07.000000000","message":"If this is really the sole purpose of creating a ModuleLoader, would it make more sense to have a get_services function in module_loader that does this for us? I\u0027m not sure we\u0027ll use it in many places but it will look better here. Also, since module_loader is apparently a public module, it provides a nicer API to someone else who will be using it.","commit_id":"e79c1c4e04fdfc85625bba97a7e0a1a5809bda37"},{"author":{"_account_id":8257,"name":"Brian Curtin","email":"brian@python.org","username":"briancurtin"},"change_message_id":"be4b9be6657c3f6082c35ef09d474c50081601b9","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    ALL \u003d \"*\""},{"line_number":72,"context_line":"    \"\"\"Wildcard service identifier representing all services.\"\"\""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def __init__(self, extensions\u003d[]):"},{"line_number":75,"context_line":"        \"\"\"User preference for each service."},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        :param list extensions: List of entry point namespace to load."}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_8cd7baed","line":74,"updated":"2015-02-18 00:49:16.000000000","message":"The approach of loading specific services as individual extensions versus loading one extension that contains all services is pushing the burden off to the user when it\u0027s something we can handle within an extension. Although it\u0027s less than optimal right now in master, we can already load a mostly functional plugin by just saying the vendor name and then you get all of their services. I think moving in this direction where extensions are an entry point to a particular service is a step backwards in usability.\n\nI really think extension support has to work where you specify ``plugin\u003d\"vendor\"`` somewhere for it to end up being a great experience, and short of changing Connection\u0027s auth_plugin to maybe be called plugin, I think it will be hard to top that user experience.","commit_id":"c9afd656067b3622fc5c7a1fea5e798c6e6acf09"},{"author":{"_account_id":8257,"name":"Brian Curtin","email":"brian@python.org","username":"briancurtin"},"change_message_id":"9088e2e375d02018a41d5371192d07fd782a0534","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    ALL \u003d \"*\""},{"line_number":72,"context_line":"    \"\"\"Wildcard service identifier representing all services.\"\"\""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def __init__(self, extensions\u003d[]):"},{"line_number":75,"context_line":"        \"\"\"User preference for each service."},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        :param list extensions: List of entry point namespace to load."}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_2dda474b","line":74,"in_reply_to":"da86d52c_2a9ced0d","updated":"2015-02-18 03:52:12.000000000","message":"Interesting - I did not put that together, so apologies for that.\n\nOverall, plugins are not my area of expertise so my primary focus is on the user experience side of it instead of the implementation (which will obviously have to change). I still need to look deeper into how it\u0027s handled, but taking off the -1.","commit_id":"c9afd656067b3622fc5c7a1fea5e798c6e6acf09"},{"author":{"_account_id":8736,"name":"Terry Howe","email":"terrylhowe@gmail.com","username":"terrylhowe"},"change_message_id":"300351bd6848881938c7e8d95caecdfd6896ec9b","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    ALL \u003d \"*\""},{"line_number":72,"context_line":"    \"\"\"Wildcard service identifier representing all services.\"\"\""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def __init__(self, extensions\u003d[]):"},{"line_number":75,"context_line":"        \"\"\"User preference for each service."},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        :param list extensions: List of entry point namespace to load."}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_2a9ced0d","line":74,"in_reply_to":"da86d52c_8cd7baed","updated":"2015-02-18 03:29:23.000000000","message":"This approach works that way.  Your package would have \u0027rackspace\u0027 namespace and that would be all of them.  Your setup.cfg would look like:\n\n    rackspace \u003d\n        compute \u003d rackspace.compute\n        object_store \u003d rackspace.object_store\n        image \u003d racksapace.image\n\netc.","commit_id":"c9afd656067b3622fc5c7a1fea5e798c6e6acf09"}]}
