)]}'
{"oslo_messaging/_drivers/common.py":[{"author":{"_account_id":8770,"name":"Ken Giusti","email":"kgiusti@gmail.com","username":"kgiusti"},"change_message_id":"b5e1cfe2e4b3dd0c19b17ce16738026fa2ce01ff","unresolved":false,"context_lines":[{"line_number":451,"context_line":"    and valid) override corresponding values from the configuration."},{"line_number":452,"context_line":"    \"\"\""},{"line_number":453,"context_line":"    # Make sure that the configuration has this specific group"},{"line_number":454,"context_line":"    conf._get_group(group)"},{"line_number":455,"context_line":"    marker \u003d object()"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"    def get_driver_opt(opt_name):"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_7c011b6a","line":454,"updated":"2016-05-25 15:05:32.000000000","message":"Isn\u0027t _get_group a private method to the ConfigOpts class.  Couldn\u0027t this api change without notice?\n\nIf these are necessary the oslo.config package should be patched to export them using a public method name (no leading \"_\")","commit_id":"401f2b81c1866caec219148d01fcf9c262f2c294"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"a3055c8f8ac2e3f1b6ef4e910bc251c97b1ac998","unresolved":false,"context_lines":[{"line_number":451,"context_line":"    and valid) override corresponding values from the configuration."},{"line_number":452,"context_line":"    \"\"\""},{"line_number":453,"context_line":"    # Make sure that the configuration has this specific group"},{"line_number":454,"context_line":"    conf._get_group(group)"},{"line_number":455,"context_line":"    marker \u003d object()"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"    def get_driver_opt(opt_name):"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_853bc2ea","line":454,"in_reply_to":"bab6814e_7c011b6a","updated":"2016-05-25 15:55:17.000000000","message":"Yes, I know that this part of my implementation is quite arguable. I tried to make this function as general as possible since it is supposed to use in any driver. Also I wanted to make the function\u0027s behavior more similar to the behavior of ConfigOpts. And these private methods allow us to simplify the code. For example, without _get_group we would have to check whether the given group exists and raise an NoSuchGroupError if not. Same is for _get. But the biggest problem here is correct type converting. We can reach it by using public set_override method with enforce_type\u003dTrue, but I don\u0027t like the idea of artificially overriding and then restoring values of options on each call of get. So I need _get_opt_info in order to obtain raw option objects which internally support type converting.\nWill it really be better to reproduce the same behavior using the public API?","commit_id":"401f2b81c1866caec219148d01fcf9c262f2c294"},{"author":{"_account_id":8770,"name":"Ken Giusti","email":"kgiusti@gmail.com","username":"kgiusti"},"change_message_id":"b5e1cfe2e4b3dd0c19b17ce16738026fa2ce01ff","unresolved":false,"context_lines":[{"line_number":456,"context_line":""},{"line_number":457,"context_line":"    def get_driver_opt(opt_name):"},{"line_number":458,"context_line":"        # Make sure that the group has this specific option"},{"line_number":459,"context_line":"        opt_value_conf \u003d conf._get(opt_name, group)"},{"line_number":460,"context_line":"        # If the option is also present in the url and has a valid"},{"line_number":461,"context_line":"        # (i.e. convertible) value type, then try to override it"},{"line_number":462,"context_line":"        opt_value_url \u003d url.query.get(opt_name, marker)"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_9c35df47","line":459,"updated":"2016-05-25 15:05:32.000000000","message":"Ditto for _get()","commit_id":"401f2b81c1866caec219148d01fcf9c262f2c294"},{"author":{"_account_id":8770,"name":"Ken Giusti","email":"kgiusti@gmail.com","username":"kgiusti"},"change_message_id":"b5e1cfe2e4b3dd0c19b17ce16738026fa2ce01ff","unresolved":false,"context_lines":[{"line_number":463,"context_line":"        if opt_value_url is marker:"},{"line_number":464,"context_line":"            return opt_value_conf"},{"line_number":465,"context_line":"        else:"},{"line_number":466,"context_line":"            opt_info \u003d conf._get_opt_info(opt_name, group)"},{"line_number":467,"context_line":"            try:"},{"line_number":468,"context_line":"                return opt_info[\u0027opt\u0027].type(opt_value_url)"},{"line_number":469,"context_line":"            except Exception:"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_5c1257b5","line":466,"updated":"2016-05-25 15:05:32.000000000","message":"Ditto for _get_opt_info","commit_id":"401f2b81c1866caec219148d01fcf9c262f2c294"},{"author":{"_account_id":8601,"name":"Dmitriy Ukhlov","email":"dukhlov@mirantis.com","username":"dukhlov"},"change_message_id":"37a9079729ce8f09772d2d4f252ca468934b8af3","unresolved":false,"context_lines":[{"line_number":444,"context_line":"            raise InvalidRPCConnectionReuse()"},{"line_number":445,"context_line":""},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"def make_driver_opt_getter(conf, url, group\u003dNone):"},{"line_number":448,"context_line":"    \"\"\"Creates a getter for driver-specific options."},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"    Values from the query part of the transport url (if they are both present"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abb7d3a_8893675a","line":447,"range":{"start_line":447,"start_character":4,"end_line":447,"end_character":26},"updated":"2016-06-01 19:18:36.000000000","message":"I would prefer to have a proxy class here to replace ConfigOpts. then you will need just one-string modification in driver\u0027s code to use this feature. For exemple:\nself.conf \u003d ConfProvider(conf, url)\n\nself.conf.oslo_meeaging.some opt\n\nAlso keeping oslo.config interface allows us to move eventually this functionality to oslo.config library","commit_id":"adcb3d196ddd7d920da246b0b77953a3ec9dca83"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"8591f9ccbfa03cb6ee21331ebf251b29cd6f748f","unresolved":false,"context_lines":[{"line_number":444,"context_line":"            raise InvalidRPCConnectionReuse()"},{"line_number":445,"context_line":""},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"def make_driver_opt_getter(conf, url, group\u003dNone):"},{"line_number":448,"context_line":"    \"\"\"Creates a getter for driver-specific options."},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"    Values from the query part of the transport url (if they are both present"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abb7d3a_b6801c8d","line":447,"range":{"start_line":447,"start_character":4,"end_line":447,"end_character":26},"in_reply_to":"9abb7d3a_8893675a","updated":"2016-06-02 14:25:39.000000000","message":"Done","commit_id":"adcb3d196ddd7d920da246b0b77953a3ec9dca83"},{"author":{"_account_id":8601,"name":"Dmitriy Ukhlov","email":"dukhlov@mirantis.com","username":"dukhlov"},"change_message_id":"37a9079729ce8f09772d2d4f252ca468934b8af3","unresolved":false,"context_lines":[{"line_number":452,"context_line":"    \"\"\""},{"line_number":453,"context_line":"    # Make sure that the configuration has this specific group"},{"line_number":454,"context_line":"    if group is not None:"},{"line_number":455,"context_line":"        conf._get_group(group)"},{"line_number":456,"context_line":"    marker \u003d object()"},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"    def get_driver_opt(opt_name):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abb7d3a_c85c4f1b","line":455,"range":{"start_line":455,"start_character":13,"end_line":455,"end_character":23},"updated":"2016-06-01 19:18:36.000000000","message":"You have probably meant here group \u003d conf._get_group\n\nbut anyway why not to use getattrt(conf, group)\n\n_ - means that it is not desired to use this method","commit_id":"adcb3d196ddd7d920da246b0b77953a3ec9dca83"},{"author":{"_account_id":8601,"name":"Dmitriy Ukhlov","email":"dukhlov@mirantis.com","username":"dukhlov"},"change_message_id":"92bf97bccefaf45f350ba491c4c2a3547e2b14ca","unresolved":false,"context_lines":[{"line_number":452,"context_line":"    \"\"\""},{"line_number":453,"context_line":"    # Make sure that the configuration has this specific group"},{"line_number":454,"context_line":"    if group is not None:"},{"line_number":455,"context_line":"        conf._get_group(group)"},{"line_number":456,"context_line":"    marker \u003d object()"},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"    def get_driver_opt(opt_name):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abb7d3a_0e347e48","line":455,"range":{"start_line":455,"start_character":13,"end_line":455,"end_character":23},"in_reply_to":"9abb7d3a_a97c51ec","updated":"2016-06-02 10:41:34.000000000","message":"hm I think that you don\u0027t need anything extra.\nCommon usage of oslo.config is just accessing conf.\u003cgroup\u003e\u003cproperties\u003e. Probably in this case you gets not NoSuchGroupException but NotSuchOptionException or something else but code which uses oslo.config already expects this behaviour","commit_id":"adcb3d196ddd7d920da246b0b77953a3ec9dca83"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"80c11365b4778da0ab15162b1c41cb73efc4bef3","unresolved":false,"context_lines":[{"line_number":452,"context_line":"    \"\"\""},{"line_number":453,"context_line":"    # Make sure that the configuration has this specific group"},{"line_number":454,"context_line":"    if group is not None:"},{"line_number":455,"context_line":"        conf._get_group(group)"},{"line_number":456,"context_line":"    marker \u003d object()"},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"    def get_driver_opt(opt_name):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abb7d3a_a97c51ec","line":455,"range":{"start_line":455,"start_character":13,"end_line":455,"end_character":23},"in_reply_to":"9abb7d3a_c85c4f1b","updated":"2016-06-02 10:24:55.000000000","message":"I use _get_group, because it raises cfg.NoSuchGroupError if the given group is absent. Using getattr I would have to handle this case and raise an exception manually.","commit_id":"adcb3d196ddd7d920da246b0b77953a3ec9dca83"},{"author":{"_account_id":8601,"name":"Dmitriy Ukhlov","email":"dukhlov@mirantis.com","username":"dukhlov"},"change_message_id":"ed5676906f68963867d2026e5a0c4e442e8c27b4","unresolved":false,"context_lines":[{"line_number":445,"context_line":"            raise InvalidRPCConnectionReuse()"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":""},{"line_number":448,"context_line":"class ConfigOptsProxy(collections.Mapping):"},{"line_number":449,"context_line":"    \"\"\"Proxy for oslo_config.cfg.ConfigOpts."},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"    Values from the query part of the transport url (if they are both present"}],"source_content_type":"text/x-python","patch_set":4,"id":"9abb7d3a_10f622f9","line":448,"updated":"2016-06-03 07:14:49.000000000","message":"Why do we need collections.Mapping\u0027s features","commit_id":"41ea0f63a9d51308e21282d30b38e62912b8e877"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"c3d82237648da8a4eb7d7bfbfa23870b36d26af8","unresolved":false,"context_lines":[{"line_number":445,"context_line":"            raise InvalidRPCConnectionReuse()"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":""},{"line_number":448,"context_line":"class ConfigOptsProxy(collections.Mapping):"},{"line_number":449,"context_line":"    \"\"\"Proxy for oslo_config.cfg.ConfigOpts."},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"    Values from the query part of the transport url (if they are both present"}],"source_content_type":"text/x-python","patch_set":4,"id":"9abb7d3a_a4af13e2","line":448,"in_reply_to":"9abb7d3a_10f622f9","updated":"2016-06-03 10:14:35.000000000","message":"I tried to make it more similar to ConfigOpts which also implements Mapping interface. I am not sure whether this is really necessary, but if we want to have a complete proxy we have to implement Mapping-methods too.","commit_id":"41ea0f63a9d51308e21282d30b38e62912b8e877"},{"author":{"_account_id":8601,"name":"Dmitriy Ukhlov","email":"dukhlov@mirantis.com","username":"dukhlov"},"change_message_id":"ed5676906f68963867d2026e5a0c4e442e8c27b4","unresolved":false,"context_lines":[{"line_number":462,"context_line":"            return self.GroupAttrProxy(self._conf, name, value, self._url)"},{"line_number":463,"context_line":"        return value"},{"line_number":464,"context_line":""},{"line_number":465,"context_line":"    def __getitem__(self, name):"},{"line_number":466,"context_line":"        return self.__getattr__(name)"},{"line_number":467,"context_line":""},{"line_number":468,"context_line":"    def __contains__(self, name):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9abb7d3a_b0e7563f","line":465,"updated":"2016-06-03 07:14:49.000000000","message":"why do we need methods bellow?","commit_id":"41ea0f63a9d51308e21282d30b38e62912b8e877"},{"author":{"_account_id":8601,"name":"Dmitriy Ukhlov","email":"dukhlov@mirantis.com","username":"dukhlov"},"change_message_id":"ed5676906f68963867d2026e5a0c4e442e8c27b4","unresolved":false,"context_lines":[{"line_number":483,"context_line":"            self._group \u003d group"},{"line_number":484,"context_line":"            self._url \u003d url"},{"line_number":485,"context_line":""},{"line_number":486,"context_line":"        _marker \u003d object()"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"        def __getattr__(self, opt_name):"},{"line_number":489,"context_line":"            # Make sure that the group has this specific option"}],"source_content_type":"text/x-python","patch_set":4,"id":"9abb7d3a_30dd2643","line":486,"updated":"2016-06-03 07:14:49.000000000","message":"marker of what? better to call it _VOID_MARKER etc. And let us declare class attributes before all methods","commit_id":"41ea0f63a9d51308e21282d30b38e62912b8e877"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"c3d82237648da8a4eb7d7bfbfa23870b36d26af8","unresolved":false,"context_lines":[{"line_number":483,"context_line":"            self._group \u003d group"},{"line_number":484,"context_line":"            self._url \u003d url"},{"line_number":485,"context_line":""},{"line_number":486,"context_line":"        _marker \u003d object()"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"        def __getattr__(self, opt_name):"},{"line_number":489,"context_line":"            # Make sure that the group has this specific option"}],"source_content_type":"text/x-python","patch_set":4,"id":"9abb7d3a_7ac94079","line":486,"in_reply_to":"9abb7d3a_30dd2643","updated":"2016-06-03 10:14:35.000000000","message":"Done","commit_id":"41ea0f63a9d51308e21282d30b38e62912b8e877"},{"author":{"_account_id":8601,"name":"Dmitriy Ukhlov","email":"dukhlov@mirantis.com","username":"dukhlov"},"change_message_id":"ed5676906f68963867d2026e5a0c4e442e8c27b4","unresolved":false,"context_lines":[{"line_number":497,"context_line":"            try:"},{"line_number":498,"context_line":"                return opt_info[\u0027opt\u0027].type(opt_value_url)"},{"line_number":499,"context_line":"            except Exception:"},{"line_number":500,"context_line":"                return opt_value_conf"},{"line_number":501,"context_line":""},{"line_number":502,"context_line":"        def __getitem__(self, opt_name):"},{"line_number":503,"context_line":"            return self.__getattr__(opt_name)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9abb7d3a_909a126d","line":500,"updated":"2016-06-03 07:14:49.000000000","message":"I would prefer to raise exception here to show that url is incorrect","commit_id":"41ea0f63a9d51308e21282d30b38e62912b8e877"},{"author":{"_account_id":8601,"name":"Dmitriy Ukhlov","email":"dukhlov@mirantis.com","username":"dukhlov"},"change_message_id":"ed5676906f68963867d2026e5a0c4e442e8c27b4","unresolved":false,"context_lines":[{"line_number":499,"context_line":"            except Exception:"},{"line_number":500,"context_line":"                return opt_value_conf"},{"line_number":501,"context_line":""},{"line_number":502,"context_line":"        def __getitem__(self, opt_name):"},{"line_number":503,"context_line":"            return self.__getattr__(opt_name)"},{"line_number":504,"context_line":""},{"line_number":505,"context_line":"        def __contains__(self, opt_name):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9abb7d3a_b0c47640","line":502,"updated":"2016-06-03 07:14:49.000000000","message":"and again, why do we need these methods bellow?","commit_id":"41ea0f63a9d51308e21282d30b38e62912b8e877"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"c3d82237648da8a4eb7d7bfbfa23870b36d26af8","unresolved":false,"context_lines":[{"line_number":499,"context_line":"            except Exception:"},{"line_number":500,"context_line":"                return opt_value_conf"},{"line_number":501,"context_line":""},{"line_number":502,"context_line":"        def __getitem__(self, opt_name):"},{"line_number":503,"context_line":"            return self.__getattr__(opt_name)"},{"line_number":504,"context_line":""},{"line_number":505,"context_line":"        def __contains__(self, opt_name):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9abb7d3a_24d3233a","line":502,"in_reply_to":"9abb7d3a_b0c47640","updated":"2016-06-03 10:14:35.000000000","message":"GroupAttr also implements Mapping interface.","commit_id":"41ea0f63a9d51308e21282d30b38e62912b8e877"}],"oslo_messaging/tests/test_driver_opt_getter.py":[{"author":{"_account_id":8601,"name":"Dmitriy Ukhlov","email":"dukhlov@mirantis.com","username":"dukhlov"},"change_message_id":"ed5676906f68963867d2026e5a0c4e442e8c27b4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"9abb7d3a_b0f2b698","updated":"2016-06-03 07:14:49.000000000","message":"Probably it is better to rename this file because we test proxy, not getter","commit_id":"41ea0f63a9d51308e21282d30b38e62912b8e877"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"c3d82237648da8a4eb7d7bfbfa23870b36d26af8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"9abb7d3a_9acea481","in_reply_to":"9abb7d3a_b0f2b698","updated":"2016-06-03 10:14:35.000000000","message":"Done","commit_id":"41ea0f63a9d51308e21282d30b38e62912b8e877"}],"oslo_messaging/transport.py":[{"author":{"_account_id":8601,"name":"Dmitriy Ukhlov","email":"dukhlov@mirantis.com","username":"dukhlov"},"change_message_id":"37a9079729ce8f09772d2d4f252ca468934b8af3","unresolved":false,"context_lines":[{"line_number":416,"context_line":"                    try:"},{"line_number":417,"context_line":"                        # Try to convert a string representation of the value"},{"line_number":418,"context_line":"                        # to its actual Python built-in type"},{"line_number":419,"context_line":"                        value \u003d ast.literal_eval(value)"},{"line_number":420,"context_line":"                    except ValueError:"},{"line_number":421,"context_line":"                        # Otherwise leave the value unchanged"},{"line_number":422,"context_line":"                        pass"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abb7d3a_cdd581e5","line":419,"range":{"start_line":419,"start_character":36,"end_line":419,"end_character":48},"updated":"2016-06-01 19:18:36.000000000","message":"I don\u0027t like such kind of conversion. for example if you specify query ?name\u003d5 it returns in but if you skip it in url and set it config name \u003d 5 - it returns str if it StrOpts. Could you try to use types defined in oslo_config during type conversion?\n\nalso it is possible to use just simple eval instead of ast.literal_eval I guess","commit_id":"adcb3d196ddd7d920da246b0b77953a3ec9dca83"},{"author":{"_account_id":8601,"name":"Dmitriy Ukhlov","email":"dukhlov@mirantis.com","username":"dukhlov"},"change_message_id":"896bf5151f62b60cae95352d1320bd73fd5dcd88","unresolved":false,"context_lines":[{"line_number":416,"context_line":"                    try:"},{"line_number":417,"context_line":"                        # Try to convert a string representation of the value"},{"line_number":418,"context_line":"                        # to its actual Python built-in type"},{"line_number":419,"context_line":"                        value \u003d ast.literal_eval(value)"},{"line_number":420,"context_line":"                    except ValueError:"},{"line_number":421,"context_line":"                        # Otherwise leave the value unchanged"},{"line_number":422,"context_line":"                        pass"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abb7d3a_fbfedf03","line":419,"range":{"start_line":419,"start_character":36,"end_line":419,"end_character":48},"in_reply_to":"9abb7d3a_0a30dc9d","updated":"2016-06-03 07:14:23.000000000","message":"Why? I don\u0027t see any problem to convert from raw string to python object using . Do you? It looks to me that it is exactly what oslo_config.cfg.Opt doing right now - conver raw string from config file to python object.","commit_id":"adcb3d196ddd7d920da246b0b77953a3ec9dca83"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"8591f9ccbfa03cb6ee21331ebf251b29cd6f748f","unresolved":false,"context_lines":[{"line_number":416,"context_line":"                    try:"},{"line_number":417,"context_line":"                        # Try to convert a string representation of the value"},{"line_number":418,"context_line":"                        # to its actual Python built-in type"},{"line_number":419,"context_line":"                        value \u003d ast.literal_eval(value)"},{"line_number":420,"context_line":"                    except ValueError:"},{"line_number":421,"context_line":"                        # Otherwise leave the value unchanged"},{"line_number":422,"context_line":"                        pass"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abb7d3a_0a30dc9d","line":419,"range":{"start_line":419,"start_character":36,"end_line":419,"end_character":48},"in_reply_to":"9abb7d3a_2e8502ad","updated":"2016-06-02 14:25:39.000000000","message":"Type conversion defined in subclasses of oslo_config.cfg.Opt class is somewhat different from builtin Python conversion, so I think it is better to store parsed values in query instead of raw strings before the actual conversion happens.","commit_id":"adcb3d196ddd7d920da246b0b77953a3ec9dca83"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"80c11365b4778da0ab15162b1c41cb73efc4bef3","unresolved":false,"context_lines":[{"line_number":416,"context_line":"                    try:"},{"line_number":417,"context_line":"                        # Try to convert a string representation of the value"},{"line_number":418,"context_line":"                        # to its actual Python built-in type"},{"line_number":419,"context_line":"                        value \u003d ast.literal_eval(value)"},{"line_number":420,"context_line":"                    except ValueError:"},{"line_number":421,"context_line":"                        # Otherwise leave the value unchanged"},{"line_number":422,"context_line":"                        pass"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abb7d3a_e45b20f5","line":419,"range":{"start_line":419,"start_character":36,"end_line":419,"end_character":48},"in_reply_to":"9abb7d3a_cdd581e5","updated":"2016-06-02 10:24:55.000000000","message":"For this case I use converting to correct config type in make_driver_opt_getter. So name\u003dv1 from a url will override name \u003d v2 from config, only if v1 can be converted to v2. In your example, it will. We can\u0027t convert values here because when we construct transport urls, we don\u0027t have transport drivers yet, so we don\u0027t know anything about driver-specific options.\n\nliteral_eval is more save since it is not capable of evaluating arbitrarily complex expressions unlike eval.","commit_id":"adcb3d196ddd7d920da246b0b77953a3ec9dca83"},{"author":{"_account_id":8601,"name":"Dmitriy Ukhlov","email":"dukhlov@mirantis.com","username":"dukhlov"},"change_message_id":"92bf97bccefaf45f350ba491c4c2a3547e2b14ca","unresolved":false,"context_lines":[{"line_number":416,"context_line":"                    try:"},{"line_number":417,"context_line":"                        # Try to convert a string representation of the value"},{"line_number":418,"context_line":"                        # to its actual Python built-in type"},{"line_number":419,"context_line":"                        value \u003d ast.literal_eval(value)"},{"line_number":420,"context_line":"                    except ValueError:"},{"line_number":421,"context_line":"                        # Otherwise leave the value unchanged"},{"line_number":422,"context_line":"                        pass"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abb7d3a_2e8502ad","line":419,"range":{"start_line":419,"start_character":36,"end_line":419,"end_character":48},"in_reply_to":"9abb7d3a_e45b20f5","updated":"2016-06-02 10:41:34.000000000","message":"ok, got it. why we need conversion here at all If you do conversion in make_driver_opt_getter?","commit_id":"adcb3d196ddd7d920da246b0b77953a3ec9dca83"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"fb66e8ae36b84575f5bf471cc148ae5ced58a165","unresolved":false,"context_lines":[{"line_number":416,"context_line":"                    try:"},{"line_number":417,"context_line":"                        # Try to convert a string representation of the value"},{"line_number":418,"context_line":"                        # to its actual Python built-in type"},{"line_number":419,"context_line":"                        value \u003d ast.literal_eval(value)"},{"line_number":420,"context_line":"                    except ValueError:"},{"line_number":421,"context_line":"                        # Otherwise leave the value unchanged"},{"line_number":422,"context_line":"                        pass"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abb7d3a_bac3a856","line":419,"range":{"start_line":419,"start_character":36,"end_line":419,"end_character":48},"in_reply_to":"9abb7d3a_fbfedf03","updated":"2016-06-03 10:13:45.000000000","message":"Done","commit_id":"adcb3d196ddd7d920da246b0b77953a3ec9dca83"},{"author":{"_account_id":8601,"name":"Dmitriy Ukhlov","email":"dukhlov@mirantis.com","username":"dukhlov"},"change_message_id":"b5ff10de889a2ddc382292a01c34595216fd9695","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        query \u003d {}"},{"line_number":411,"context_line":"        if url.query:"},{"line_number":412,"context_line":"            for key, values in six.iteritems(parse.parse_qs(url.query)):"},{"line_number":413,"context_line":"                query[key] \u003d (values[0] if len(values) \u003d\u003d 1 else values)"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"        virtual_host \u003d None"},{"line_number":416,"context_line":"        if url.path.startswith(\u0027/\u0027):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_926fd591","line":413,"range":{"start_line":413,"start_character":30,"end_line":413,"end_character":36},"updated":"2016-06-06 11:15:08.000000000","message":"hm, I should be a problem that query value may be a list. oslo.config parser expects string only","commit_id":"02ce79f8ee93672535770f5cf5c6b170ab0a0179"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"a88ee18b7c5e031bb52db107a43019c34d25cc16","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        query \u003d {}"},{"line_number":411,"context_line":"        if url.query:"},{"line_number":412,"context_line":"            for key, values in six.iteritems(parse.parse_qs(url.query)):"},{"line_number":413,"context_line":"                query[key] \u003d (values[0] if len(values) \u003d\u003d 1 else values)"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"        virtual_host \u003d None"},{"line_number":416,"context_line":"        if url.path.startswith(\u0027/\u0027):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_ae928c49","line":413,"range":{"start_line":413,"start_character":30,"end_line":413,"end_character":36},"in_reply_to":"7aa08908_926fd591","updated":"2016-06-09 13:06:34.000000000","message":"Done","commit_id":"02ce79f8ee93672535770f5cf5c6b170ab0a0179"}]}
