)]}'
{"novaclient/keystone/shell.py":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"68c28b87f3da1685e8c5daf3f5f76bec555e55fd","unresolved":false,"context_lines":[{"line_number":35,"context_line":"from novaclient import client"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"def do_discover(self, args):"},{"line_number":39,"context_line":"    \"\"\""},{"line_number":40,"context_line":"    Discover Keystone servers and show authentication protocols supported."},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAACn%2F%2F9BQ%3D","line":38,"updated":"2011-11-21 22:34:34.000000000","message":"I would really prefer a different argument name than \"self\" here; v1_0.shell and v1_1.shell both tend to use \"cs\" for this argument.","commit_id":"89ef0e36ffbce8cc8dc5c0d1c5de4f37c185b0f8"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"68c28b87f3da1685e8c5daf3f5f76bec555e55fd","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        - supports version v1.1 (CURRENT) here https://openstack.org/v1.1"},{"line_number":49,"context_line":"        - supports version v2.0 (BETA) here https://openstack.org/v2.0"},{"line_number":50,"context_line":"    \"\"\""},{"line_number":51,"context_line":"    local \u003d _local_keystone_exists()"},{"line_number":52,"context_line":"    remote \u003d _check_keystone_versions(self.client.auth_url)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAACn%2F%2F9Bg%3D","line":51,"updated":"2011-11-21 22:34:34.000000000","message":"You don\u0027t use local or remote; I don\u0027t understand why you have assignments to them...","commit_id":"89ef0e36ffbce8cc8dc5c0d1c5de4f37c185b0f8"}],"novaclient/shell.py":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"68c28b87f3da1685e8c5daf3f5f76bec555e55fd","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        #FIXME(usrleon): Here should be restrict for project id same as"},{"line_number":175,"context_line":"        # for username or password but for compatibility it is not."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        #TODO(ZNS): Need a cleaner way to support unauthenticated calls"},{"line_number":178,"context_line":"        if args.func !\u003d shell_keystone.do_discover:"},{"line_number":179,"context_line":"            if not user:"},{"line_number":180,"context_line":"                raise exc.CommandError(\"You must provide a username, either\""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAACn%2F%2F9A4%3D","line":177,"updated":"2011-11-21 22:34:34.000000000","message":"Indeed.  I like decorators that set attributes on functions for this purpose: you could create an @unauthenticated decorator that just sets \u0027noauth\u0027 on the function; then this test becomes \"not getattr(args.func, \u0027noauth\u0027, False)\".  Not something I\u0027d require for approval, but it shouldn\u0027t be too difficult to do...","commit_id":"89ef0e36ffbce8cc8dc5c0d1c5de4f37c185b0f8"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"68c28b87f3da1685e8c5daf3f5f76bec555e55fd","unresolved":false,"context_lines":[{"line_number":177,"context_line":"        #TODO(ZNS): Need a cleaner way to support unauthenticated calls"},{"line_number":178,"context_line":"        if args.func !\u003d shell_keystone.do_discover:"},{"line_number":179,"context_line":"            if not user:"},{"line_number":180,"context_line":"                raise exc.CommandError(\"You must provide a username, either\""},{"line_number":181,"context_line":"                                       \"via --username or via \""},{"line_number":182,"context_line":"                                       \"env[NOVA_USERNAME]\")"},{"line_number":183,"context_line":"    "}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAACn%2F%2F9BA%3D","line":180,"updated":"2011-11-21 22:34:34.000000000","message":"You\u0027re probably going to get a conflict here due to a change I just had approved, which fixes the spacing in these error messages...","commit_id":"89ef0e36ffbce8cc8dc5c0d1c5de4f37c185b0f8"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"68c28b87f3da1685e8c5daf3f5f76bec555e55fd","unresolved":false,"context_lines":[{"line_number":180,"context_line":"                raise exc.CommandError(\"You must provide a username, either\""},{"line_number":181,"context_line":"                                       \"via --username or via \""},{"line_number":182,"context_line":"                                       \"env[NOVA_USERNAME]\")"},{"line_number":183,"context_line":"    "},{"line_number":184,"context_line":"            if not password:"},{"line_number":185,"context_line":"                if not apikey:"},{"line_number":186,"context_line":"                    raise exc.CommandError(\"You must provide a password, either\""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAACn%2F%2F9BI%3D","line":183,"updated":"2011-11-21 22:34:34.000000000","message":"You have trailing whitespace on this line, which is going to break pep8.","commit_id":"89ef0e36ffbce8cc8dc5c0d1c5de4f37c185b0f8"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"68c28b87f3da1685e8c5daf3f5f76bec555e55fd","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                            \"via --password or via env[NOVA_PASSWORD]\")"},{"line_number":188,"context_line":"                else:"},{"line_number":189,"context_line":"                    password \u003d apikey"},{"line_number":190,"context_line":"    "},{"line_number":191,"context_line":"            if options.version and options.version !\u003d \u00271.0\u0027:"},{"line_number":192,"context_line":"                if not projectid:"},{"line_number":193,"context_line":"                    raise exc.CommandError(\"You must provide an projectid, either\""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAACn%2F%2F9BE%3D","line":190,"updated":"2011-11-21 22:34:34.000000000","message":"Ibid.","commit_id":"89ef0e36ffbce8cc8dc5c0d1c5de4f37c185b0f8"}],"novaclient/utils.py":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"551e078f74e2f8536f3ce8e79686caaac2b6a6cb","unresolved":false,"context_lines":[{"line_number":22,"context_line":"        def mymethod(f):"},{"line_number":23,"context_line":"            ..."},{"line_number":24,"context_line":"    \"\"\""},{"line_number":25,"context_line":"    setattr(f, \u0027unauthenticated\u0027, True)"},{"line_number":26,"context_line":"    return f"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def isunauthenticated(f):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAACn%2F%2F8%2B8%3D","line":25,"updated":"2011-11-22 04:35:27.000000000","message":"You don\u0027t have to use setattr() here; f.unauthenticated \u003d True","commit_id":"dcac78c80f0651ad3d201608a01a1ac8cc30cc62"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"9d60cf407043dca1aac9d31f2bd68f7a5fb033f2","unresolved":false,"context_lines":[{"line_number":14,"context_line":"        return func"},{"line_number":15,"context_line":"    return _decorator"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"def unauthenticated(f):"},{"line_number":18,"context_line":"    \"\"\""},{"line_number":19,"context_line":"    Adds \u0027unauthenticated\u0027 attribute to decorated function."},{"line_number":20,"context_line":"    Usage:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAC3%2F%2F%2FIg%3D","line":17,"updated":"2011-12-05 23:22:58.000000000","message":"PEP8 error--you need an extra line here.","commit_id":"d4cff40d3d87df2a4e3563a38a735188c3a88efd"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"9d60cf407043dca1aac9d31f2bd68f7a5fb033f2","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    f.unauthenticated \u003d True"},{"line_number":26,"context_line":"    return f"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def isunauthenticated(f):"},{"line_number":29,"context_line":"    \"\"\""},{"line_number":30,"context_line":"    Checks to see if the function is marked as not requiring authentication"},{"line_number":31,"context_line":"    with the @unauthenticated decorator. Returns True if decorator is"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAC3%2F%2F%2FIc%3D","line":28,"updated":"2011-12-05 23:22:58.000000000","message":"Ibid, both before and after this function.","commit_id":"d4cff40d3d87df2a4e3563a38a735188c3a88efd"}]}
