)]}'
{"trove/common/utils.py":[{"author":{"_account_id":10215,"name":"Peter Stachowski","email":"peter@tesora.com","username":"peterstac"},"change_message_id":"07a3871bfc2e72a4a6ce5e92e9e335a048c014db","unresolved":false,"context_lines":[{"line_number":371,"context_line":"    if truncate_len and len(msg_str) \u003e truncate_len:"},{"line_number":372,"context_line":"        msg_str \u003d msg_str[:truncate_len - 3] + \u0027...\u0027"},{"line_number":373,"context_line":"    return msg_str"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"def retry(expected_exception_cls, retries\u003d3, delay_fun\u003dlambda n: 3 * n):"},{"line_number":377,"context_line":"    \"\"\"Retry decorator."},{"line_number":378,"context_line":"    Executes the decorated function N times with a variable timeout"},{"line_number":379,"context_line":"    on a given exception(s)."},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    :param expected_exception_cls: Handled exception classes."},{"line_number":382,"context_line":"    :type expected_exception_cls:  class or tuple of classes"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"    :param delay_fun:              The time delay in sec as a function of the"},{"line_number":385,"context_line":"                                   number of attempts (n) already executed."},{"line_number":386,"context_line":"    :type delay_fun:               callable"},{"line_number":387,"context_line":"    \"\"\""},{"line_number":388,"context_line":"    def retry_deco(f):"},{"line_number":389,"context_line":"        @wraps(f)"},{"line_number":390,"context_line":"        def wrapper(*args, **kwargs):"},{"line_number":391,"context_line":"            remaining_attempts \u003d retries"},{"line_number":392,"context_line":"            while remaining_attempts \u003e 1:"},{"line_number":393,"context_line":"                try:"},{"line_number":394,"context_line":"                    return f(*args, **kwargs)"},{"line_number":395,"context_line":"                except expected_exception_cls:"},{"line_number":396,"context_line":"                    remaining_attempts -\u003d 1"},{"line_number":397,"context_line":"                    delay \u003d delay_fun(retries - remaining_attempts)"},{"line_number":398,"context_line":"                    LOG.exception(_("},{"line_number":399,"context_line":"                        \"Retrying in %(delay)d seconds \""},{"line_number":400,"context_line":"                        \"(remaining attempts: %(remaining)d)...\") %"},{"line_number":401,"context_line":"                        {\u0027delay\u0027: delay, \u0027remaining\u0027: remaining_attempts})"},{"line_number":402,"context_line":"                    time.sleep(delay)"},{"line_number":403,"context_line":"            return f(*args, **kwargs)"},{"line_number":404,"context_line":"        return wrapper"},{"line_number":405,"context_line":"    return retry_deco"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa7ab95a_74bc82bb","line":405,"range":{"start_line":374,"start_character":0,"end_line":405,"end_character":21},"updated":"2016-09-02 00:34:11.000000000","message":"You\u0027ve added this to \u0027production\u0027 code but only call it from tests.  This should probably move to trove/tests/util/retry.py or some such file.  If we need it in \u0027real\u0027 code at some point, we can always move it.","commit_id":"5e87ea515fe284910f41162a21a206eb4012e08a"}],"trove/tests/scenario/runners/test_runners.py":[{"author":{"_account_id":10215,"name":"Peter Stachowski","email":"peter@tesora.com","username":"peterstac"},"change_message_id":"8671c13e55deb0e195e03aa9d275c3da79ab2b10","unresolved":false,"context_lines":[{"line_number":692,"context_line":"                username \u003d creds.get(\u0027name\u0027)"},{"line_number":693,"context_line":"                if username:"},{"line_number":694,"context_line":"                    password \u003d creds.get(\u0027password\u0027, \u0027\u0027)"},{"line_number":695,"context_line":"                    databases \u003d []"},{"line_number":696,"context_line":"                    if database_def:"},{"line_number":697,"context_line":"                        databases.append(database_def)"},{"line_number":698,"context_line":""},{"line_number":699,"context_line":"                    return {\u0027name\u0027: username, \u0027password\u0027: password,"},{"line_number":700,"context_line":"                            \u0027databases\u0027: databases}"},{"line_number":701,"context_line":"            return None"},{"line_number":702,"context_line":""},{"line_number":703,"context_line":"        credentials \u003d self.test_helper.get_helper_credentials()"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ac06dbe_64e6f617","line":700,"range":{"start_line":695,"start_character":20,"end_line":700,"end_character":50},"updated":"2016-08-24 16:43:13.000000000","message":"How is this related to couchbase?","commit_id":"28ac2e975ca2df9387164f0dce7025ddb9af0a8f"},{"author":{"_account_id":14576,"name":"Petr Malik","email":"pmalik@tesora.com","username":"pmalik"},"change_message_id":"1be296517839a440996c728b51dcc889fb5711e9","unresolved":false,"context_lines":[{"line_number":692,"context_line":"                username \u003d creds.get(\u0027name\u0027)"},{"line_number":693,"context_line":"                if username:"},{"line_number":694,"context_line":"                    password \u003d creds.get(\u0027password\u0027, \u0027\u0027)"},{"line_number":695,"context_line":"                    databases \u003d []"},{"line_number":696,"context_line":"                    if database_def:"},{"line_number":697,"context_line":"                        databases.append(database_def)"},{"line_number":698,"context_line":""},{"line_number":699,"context_line":"                    return {\u0027name\u0027: username, \u0027password\u0027: password,"},{"line_number":700,"context_line":"                            \u0027databases\u0027: databases}"},{"line_number":701,"context_line":"            return None"},{"line_number":702,"context_line":""},{"line_number":703,"context_line":"        credentials \u003d self.test_helper.get_helper_credentials()"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ac06dbe_0f48fb86","line":700,"range":{"start_line":695,"start_character":20,"end_line":700,"end_character":50},"in_reply_to":"1ac06dbe_64e6f617","updated":"2016-08-24 17:08:27.000000000","message":"Actually totally... :) Couchbase has (defines) users but not databases. The current code does not handle this case properly.\nThe resulting user definition has None for the database name (i.e. \u0027[{\"name\": None}]\u0027).\nThe whole databases key should be an empty list instead...","commit_id":"28ac2e975ca2df9387164f0dce7025ddb9af0a8f"}]}
