)]}'
{"keystoneclient/auth/__init__.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"79ed27306ca47f71446bcea1b0f49e68a374be83","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from keystoneclient.auth import identity"},{"line_number":16,"context_line":"from keystoneclient import exceptions"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"PLUGIN_NAMESPACE \u003d \u0027keystoneclient.auth.plugin\u0027"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"cfg \u003d None"}],"source_content_type":"text/x-python","patch_set":5,"id":"bad4c104_8c31fda4","line":17,"updated":"2014-04-29 17:05:33.000000000","message":"+newline","commit_id":"02f124fb8ab54cd8b413d70cd7dc53cd8f18c36e"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"79ed27306ca47f71446bcea1b0f49e68a374be83","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    :raises exceptions.NoMatchingPlugin: if a plugin cannot be created."},{"line_number":43,"context_line":"    \"\"\""},{"line_number":44,"context_line":"    global cfg"},{"line_number":45,"context_line":"    if not cfg:"},{"line_number":46,"context_line":"        from oslo.config import cfg"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"bad4c104_8cbf3dd0","line":44,"updated":"2014-04-29 17:05:33.000000000","message":"Any reason to not just force the caller to pass in conf? Then you don\u0027t have to manage any global state here and this code doesn\u0027t have to care about how conf is implemented.","commit_id":"02f124fb8ab54cd8b413d70cd7dc53cd8f18c36e"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"e1d6524c4761b73da4b50059b208e09be1641852","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    :raises exceptions.NoMatchingPlugin: if a plugin cannot be created."},{"line_number":43,"context_line":"    \"\"\""},{"line_number":44,"context_line":"    global cfg"},{"line_number":45,"context_line":"    if not cfg:"},{"line_number":46,"context_line":"        from oslo.config import cfg"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad9bd40_7e85a405","line":44,"in_reply_to":"bad4c104_8cbf3dd0","updated":"2014-05-06 23:06:30.000000000","message":"The problem is not so much conf\u003d i need cfg for the opts at line 51. Having\n\n    if not conf: \n        conf \u003d cfg.CONF \n\nis purely a convenience because i\u0027ve got cfg available anyway.","commit_id":"02f124fb8ab54cd8b413d70cd7dc53cd8f18c36e"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"79ed27306ca47f71446bcea1b0f49e68a374be83","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    # convert the auth plugin parameters into oslo.config options."},{"line_number":80,"context_line":"    for param in mgr.driver.get_params():"},{"line_number":81,"context_line":"        if param.type \u003d\u003d str:"},{"line_number":82,"context_line":"            opt_type \u003d cfg.StrOpt"},{"line_number":83,"context_line":"        elif param.type \u003d\u003d bool:"},{"line_number":84,"context_line":"            opt_type \u003d cfg.BoolOpt"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXX%2F%2FtO4%3D","line":81,"updated":"2014-04-29 17:05:33.000000000","message":"Just a design observation: you could actually put everything in this \u0027for\u0027 block into the \u0027def register(self, conf)\u0027 method on the Param class. This would make use of the \"tell don\u0027t ask\" design principle.","commit_id":"02f124fb8ab54cd8b413d70cd7dc53cd8f18c36e"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"e1d6524c4761b73da4b50059b208e09be1641852","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    # convert the auth plugin parameters into oslo.config options."},{"line_number":80,"context_line":"    for param in mgr.driver.get_params():"},{"line_number":81,"context_line":"        if param.type \u003d\u003d str:"},{"line_number":82,"context_line":"            opt_type \u003d cfg.StrOpt"},{"line_number":83,"context_line":"        elif param.type \u003d\u003d bool:"},{"line_number":84,"context_line":"            opt_type \u003d cfg.BoolOpt"}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad9bd40_1edf380e","line":81,"in_reply_to":"AAAAXX%2F%2FtO4%3D","updated":"2014-05-06 23:06:30.000000000","message":"but that would require the Param class to have knowledge of the cfg module. As i\u0027ve got it written now everything that uses cfg is contained in this function. \n\nIf we take the OSC example where they are wanting to use cliff to do CLI arguments then i don\u0027t want them to care about these cfg options at all.","commit_id":"02f124fb8ab54cd8b413d70cd7dc53cd8f18c36e"}],"keystoneclient/auth/base.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"5ad21e8187c97b526f3f0aa606238574bb1158da","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    def get_params(cls):"},{"line_number":41,"context_line":"        \"\"\"Return the list of parameters associated with the auth plugin."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        This list may be used to generate CLI or config arguments."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        :returns list: A list of Param objects describing available plugin"},{"line_number":46,"context_line":"                       parameters."}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAWH%2F%2Bu%2FY%3D","line":43,"updated":"2014-03-24 18:26:22.000000000","message":"return a list of oslo.config.cfg.Opt?","commit_id":"02f124fb8ab54cd8b413d70cd7dc53cd8f18c36e"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"e1d6524c4761b73da4b50059b208e09be1641852","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    def get_params(cls):"},{"line_number":41,"context_line":"        \"\"\"Return the list of parameters associated with the auth plugin."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        This list may be used to generate CLI or config arguments."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        :returns list: A list of Param objects describing available plugin"},{"line_number":46,"context_line":"                       parameters."}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad9bd40_fed534e5","line":43,"in_reply_to":"AAAAWH%2F%2Bu%2FY%3D","updated":"2014-05-06 23:06:30.000000000","message":"no the param class is designed to be independant of oslo.config so that it can be used for things other than oslo.config, eg cliff.","commit_id":"02f124fb8ab54cd8b413d70cd7dc53cd8f18c36e"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"3df0e44f21f0ef3219fc8730d11cee6c5ddbcee0","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from keystoneclient import exceptions"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"PLUGIN_NAMESPACE \u003d \u0027keystoneclient.auth.plugin\u0027"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"def get_plugin_class(name):"},{"line_number":24,"context_line":"    \"\"\"Retrieve a plugin class by its entrypoint name."}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_92b9a917","line":21,"updated":"2014-07-03 14:20:35.000000000","message":"not all plugins are defined here: the oauth plugin is at keystoneclient.v3.contrib.oauth1","commit_id":"e399c43d95d0f8a3a0d89cd8f7da634e56654194"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"eaf32224d6bda5280f9a44695ce5daab0f4046a9","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from keystoneclient import exceptions"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"PLUGIN_NAMESPACE \u003d \u0027keystoneclient.auth.plugin\u0027"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"def get_plugin_class(name):"},{"line_number":24,"context_line":"    \"\"\"Retrieve a plugin class by its entrypoint name."}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_7774f567","line":21,"in_reply_to":"baada198_92b9a917","updated":"2014-07-03 20:55:14.000000000","message":"That\u0027s ok. This is a setuptools entry point and so it only matters for the key in setup.cfg. Plugins like oauth1 are still able to use this namespace. It doesn\u0027t refer to an actual module path.","commit_id":"e399c43d95d0f8a3a0d89cd8f7da634e56654194"}],"keystoneclient/auth/conf.py":[{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"c0e01c4187f830e4eb37fd21d38802145462f03f","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"@_require_cfg"},{"line_number":38,"context_line":"def register_conf_options(conf, group):"},{"line_number":39,"context_line":"    opts \u003d [cfg.StrOpt(\u0027name\u0027, help\u003d\u0027Name of the plugin to load\u0027),"},{"line_number":40,"context_line":"            cfg.StrOpt(\u0027section\u0027, help\u003d\u0027Plugin Section\u0027)]"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    conf.register_group(cfg.OptGroup(group))"}],"source_content_type":"text/x-python","patch_set":6,"id":"7adec928_1961bcd3","line":39,"updated":"2014-05-20 22:29:18.000000000","message":"i think these params need to be renamed.\n\nname and section arent obvious enough when you think that it may be mixed in with session etc","commit_id":"2cf8765dd937b0c66f7bde845280d17f3bf676df"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"618219eeb4293bbc68612727540b5b99406ae045","unresolved":false,"context_lines":[{"line_number":37,"context_line":"@_require_cfg"},{"line_number":38,"context_line":"def register_conf_options(conf, group):"},{"line_number":39,"context_line":"    opts \u003d [cfg.StrOpt(\u0027auth_plugin\u0027, help\u003d\u0027Name of the plugin to load\u0027),"},{"line_number":40,"context_line":"            cfg.StrOpt(\u0027auth_section\u0027, help\u003d\u0027Config Section from which to \u0027"},{"line_number":41,"context_line":"                                            \u0027load plugin specific options\u0027)]"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    conf.register_group(cfg.OptGroup(group))"}],"source_content_type":"text/x-python","patch_set":9,"id":"1ae5cdf2_4c55b94e","line":40,"updated":"2014-06-11 15:01:22.000000000","message":"Shouldn\u0027t the auth_section be defined by the plugin or application, rather than the deployer?","commit_id":"ee6af1700e81515734fd3430aa87ce8645e4cf62"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"0fc07e106c32c37f0fd9e2d04cb64fcc133a68da","unresolved":false,"context_lines":[{"line_number":37,"context_line":"@_require_cfg"},{"line_number":38,"context_line":"def register_conf_options(conf, group):"},{"line_number":39,"context_line":"    opts \u003d [cfg.StrOpt(\u0027auth_plugin\u0027, help\u003d\u0027Name of the plugin to load\u0027),"},{"line_number":40,"context_line":"            cfg.StrOpt(\u0027auth_section\u0027, help\u003d\u0027Config Section from which to \u0027"},{"line_number":41,"context_line":"                                            \u0027load plugin specific options\u0027)]"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    conf.register_group(cfg.OptGroup(group))"}],"source_content_type":"text/x-python","patch_set":9,"id":"1ae5cdf2_2414f4e7","line":40,"in_reply_to":"1ae5cdf2_4c55b94e","updated":"2014-06-12 01:53:48.000000000","message":"So auth plugins are shareable, they should be considered just a stash of credentials.\n\nWhat i was trying for here was to allow the config file to show that sharing. Example:\n\n    [cinder]\n    cafile \u003d \u0027/path/to\u0027\n    certfile \u003d \u0027/path/to\u0027\n    auth_plugin \u003d \u0027v2password\u0027\n    auth_section \u003d \u0027admincreds\u0027\n\n    [glance]\n    cafile \u003d \u0027/different/path\u0027\n    certfile \u003d \u0027/different/path\u0027 \n    auth_plugin \u003d \u0027v2password\u0027\n    auth_section \u003d \u0027admincreds\u0027 \n\n    [admincreds] \n    auth_url \u003d \u0027http://keystone.test:5000/v2.0\u0027\n    user_name \u003d \u0027user\u0027\n    password \u003d \u0027pass\u0027 \n    tenant_name \u003d \u0027tenn\u0027\n \nWhether auth_plugin should be a part of admincreds there i\u0027m not sure. But it \n\na) let\u0027s you specify username and password once per config fie \n\nb) if the service is smart enough it could store that auth_plugin and if in the process of creating another client it sees the same auth_plugin and auth_section it can reuse that auth_plugin so as not to create another token.","commit_id":"ee6af1700e81515734fd3430aa87ce8645e4cf62"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"618219eeb4293bbc68612727540b5b99406ae045","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        group \u003d conf[group].auth_section"},{"line_number":91,"context_line":"        conf.register_group(cfg.OptGroup(group))"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    # convert the auth plugin parameters into oslo.config options."},{"line_number":94,"context_line":"    for param in mgr.driver.get_params():"},{"line_number":95,"context_line":"        if param.type \u003d\u003d str:"},{"line_number":96,"context_line":"            opt_type \u003d cfg.StrOpt"}],"source_content_type":"text/x-python","patch_set":9,"id":"1ae5cdf2_8c90a1ee","line":93,"updated":"2014-06-11 15:01:22.000000000","message":"Why not just use oslo.config in the first place? It will simplify things like deprecating options if names change, handling validation, allowing types beyond the few basic ones you\u0027ve identified here, etc. It will also make it possible to have option discovery for the config file generator and documentation generator.","commit_id":"ee6af1700e81515734fd3430aa87ce8645e4cf62"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"0fc07e106c32c37f0fd9e2d04cb64fcc133a68da","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        group \u003d conf[group].auth_section"},{"line_number":91,"context_line":"        conf.register_group(cfg.OptGroup(group))"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    # convert the auth plugin parameters into oslo.config options."},{"line_number":94,"context_line":"    for param in mgr.driver.get_params():"},{"line_number":95,"context_line":"        if param.type \u003d\u003d str:"},{"line_number":96,"context_line":"            opt_type \u003d cfg.StrOpt"}],"source_content_type":"text/x-python","patch_set":9,"id":"1ae5cdf2_e4376ce1","line":93,"in_reply_to":"1ae5cdf2_8c90a1ee","updated":"2014-06-12 01:53:48.000000000","message":"The main reason is that oslo.config is not the only way that these plugins will need to be loaded. They need to be converted into argparse arguments for CLI and cliff argument for OSC and whatever comes along.\n\nIt seemed better to start with an independent representation than try to convert an oslo.config option to those other formats. It means at somepoint in the future we will need to deal with deprecation handling and thiings that oslo.config already does - but at least we can figure it out across all consumers then.\n\nIt also means that plugins don\u0027t need a dependency on oslo.config - it\u0027s debatable whether this is important or not.","commit_id":"ee6af1700e81515734fd3430aa87ce8645e4cf62"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"8002f974a040ca8cda904235169bdbca18fc61e5","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        group \u003d conf[group].auth_section"},{"line_number":91,"context_line":"        conf.register_group(cfg.OptGroup(group))"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    # convert the auth plugin parameters into oslo.config options."},{"line_number":94,"context_line":"    for param in mgr.driver.get_params():"},{"line_number":95,"context_line":"        if param.type \u003d\u003d str:"},{"line_number":96,"context_line":"            opt_type \u003d cfg.StrOpt"}],"source_content_type":"text/x-python","patch_set":9,"id":"1ae5cdf2_8d4776a2","line":93,"in_reply_to":"1ae5cdf2_e4376ce1","updated":"2014-06-13 12:50:29.000000000","message":"I guess that makes some sense. On the other hand, we already have code to convert oslo.config option definitions to argparse arguments, and we can look at adding other conversion functions if that\u0027s useful. Defining the options using Opt() doesn\u0027t necessarily mean using a ConfigObj instance, either.","commit_id":"ee6af1700e81515734fd3430aa87ce8645e4cf62"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"618219eeb4293bbc68612727540b5b99406ae045","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                       default\u003dparam.default,"},{"line_number":111,"context_line":"                       help\u003dparam.description)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        conf.register_opt(opt, group\u003dgroup)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        # once the option has been registered it can be read out"},{"line_number":116,"context_line":"        kwargs.setdefault(param.param, conf[group][param.param])"}],"source_content_type":"text/x-python","patch_set":9,"id":"1ae5cdf2_cc646924","line":113,"updated":"2014-06-11 15:01:22.000000000","message":"This is a good use for the new ConfigFilter class, to hide the options from the application. That\u0027s not ready for use, yet, but you may want to keep an eye on it to add it later.\n\nhttps://review.openstack.org/#/c/97228/","commit_id":"ee6af1700e81515734fd3430aa87ce8645e4cf62"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"8002f974a040ca8cda904235169bdbca18fc61e5","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                       default\u003dparam.default,"},{"line_number":111,"context_line":"                       help\u003dparam.description)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        conf.register_opt(opt, group\u003dgroup)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        # once the option has been registered it can be read out"},{"line_number":116,"context_line":"        kwargs.setdefault(param.param, conf[group][param.param])"}],"source_content_type":"text/x-python","patch_set":9,"id":"1ae5cdf2_ad97d2ea","line":113,"in_reply_to":"1ae5cdf2_84a228fa","updated":"2014-06-13 12:50:29.000000000","message":"Options can be registered multiple times as long as the option definition doesn\u0027t change (usually when we see the error for duplicate registration, it\u0027s because the help text in 2 copies of an option definition from the incubator have drifted apart, which won\u0027t ever be the case for these plugins). \n\nThe peek() method is interesting, but what does that buy you over just registering the option with a filter?","commit_id":"ee6af1700e81515734fd3430aa87ce8645e4cf62"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"0fc07e106c32c37f0fd9e2d04cb64fcc133a68da","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                       default\u003dparam.default,"},{"line_number":111,"context_line":"                       help\u003dparam.description)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        conf.register_opt(opt, group\u003dgroup)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        # once the option has been registered it can be read out"},{"line_number":116,"context_line":"        kwargs.setdefault(param.param, conf[group][param.param])"}],"source_content_type":"text/x-python","patch_set":9,"id":"1ae5cdf2_84a228fa","line":113,"in_reply_to":"1ae5cdf2_cc646924","updated":"2014-06-12 01:53:48.000000000","message":"Yea, that would be useful - i\u0027d be interested to know what impact re-registering options would have there (i assume none, it\u0027s just an accessor thing).\n\nHonestly even better would be the option to \u0027view\u0027 the value in a CONF, so after creating my opt above i could do something like:\n\n    value \u003d conf.peek(opt, group\u003dgroup)\n\nand read out what the value would be if if was registered - but without registering it.","commit_id":"ee6af1700e81515734fd3430aa87ce8645e4cf62"}],"keystoneclient/auth/identity/base.py":[{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"3757c708032ec21e6ed93b69768e112b72471975","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        conf.register_opts(opts, group\u003dgroup)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        kwargs[\u0027auth_url\u0027] \u003d conf[group].auth_url"},{"line_number":102,"context_line":"        kwargs[\u0027trust_id\u0027] \u003d conf[group].trust_id"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        return cls(**kwargs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAVn%2F%2Byco%3D","line":102,"updated":"2014-03-12 06:07:10.000000000","message":".setdefault()","commit_id":"4701b8ce91edb329439f80674da3a14db1dff2c6"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"3df0e44f21f0ef3219fc8730d11cee6c5ddbcee0","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        return disc.url_for(version)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    @classmethod"},{"line_number":184,"context_line":"    def get_options(cls):"},{"line_number":185,"context_line":"        options \u003d super(BaseIdentityPlugin, cls).get_options()"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"        options.extend(["}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_d21fa16a","line":184,"updated":"2014-07-03 14:20:35.000000000","message":"There should also be a method to test the validity of the options. For example, with the password method, params project_name and project_id can\u0027t be used together, and so on. This would simplify parameters validation in CLIs like openstackclient.","commit_id":"e399c43d95d0f8a3a0d89cd8f7da634e56654194"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"eaf32224d6bda5280f9a44695ce5daab0f4046a9","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        return disc.url_for(version)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    @classmethod"},{"line_number":184,"context_line":"    def get_options(cls):"},{"line_number":185,"context_line":"        options \u003d super(BaseIdentityPlugin, cls).get_options()"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"        options.extend(["}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_b7012db1","line":184,"in_reply_to":"baada198_d21fa16a","updated":"2014-07-03 20:55:14.000000000","message":"i was thinking that this could be done just in PasswordMethod.__init__ however i\u0027ll add a load_from_options method here so that plugins can do extra checking from the load process.\n\nDo you need an actual verify() method? I was expecting you just create the object and it will raise an error if you did something wrong.","commit_id":"e399c43d95d0f8a3a0d89cd8f7da634e56654194"}],"keystoneclient/auth/param.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"5ad21e8187c97b526f3f0aa606238574bb1158da","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"class Param(object):"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"    def __init__(self, param, type\u003dstr, default\u003dNone,"},{"line_number":17,"context_line":"                 description\u003dNone, name\u003dNone, display_name\u003dNone):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAWH%2F%2Bu%2Fw%3D","line":14,"updated":"2014-03-24 18:26:22.000000000","message":"Why not just use oslo.conf.cfg.Opt?","commit_id":"02f124fb8ab54cd8b413d70cd7dc53cd8f18c36e"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"e1d6524c4761b73da4b50059b208e09be1641852","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"class Param(object):"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"    def __init__(self, param, type\u003dstr, default\u003dNone,"},{"line_number":17,"context_line":"                 description\u003dNone, name\u003dNone, display_name\u003dNone):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad9bd40_feec54bd","line":14,"in_reply_to":"AAAAWH%2F%2Bu%2Fw%3D","updated":"2014-05-06 23:06:30.000000000","message":"Because the class is supposed to abstract the actual implementation of how you find these parameters.","commit_id":"02f124fb8ab54cd8b413d70cd7dc53cd8f18c36e"}],"keystoneclient/tests/auth/test_conf.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"79ed27306ca47f71446bcea1b0f49e68a374be83","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from keystoneclient.tests import utils"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class ConfTests(utils.TestCase):"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    GROUP \u003d \u0027auth\u0027"},{"line_number":23,"context_line":"    V2PASS \u003d \u0027v2password\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"bad4c104_6c04b97e","line":20,"updated":"2014-04-29 17:05:33.000000000","message":"There are cases that don\u0027t appear to be tested like not passing in a group and an invalid param types. The coverage report shows that there may be others.","commit_id":"02f124fb8ab54cd8b413d70cd7dc53cd8f18c36e"}]}
