From 28f45f382bc71ed42bc266144b5d88ba6e605987 Mon Sep 17 00:00:00 2001 From: ville rantanen Date: Wed, 18 Apr 2018 09:36:58 +0300 Subject: [PATCH] generalize transfer-time --- web/transfer-time | 123 +++++++++++++++++++++++++++++++++------------- 1 file changed, 89 insertions(+), 34 deletions(-) diff --git a/web/transfer-time b/web/transfer-time index 6bc46a9..0c01d85 100755 --- a/web/transfer-time +++ b/web/transfer-time @@ -36,29 +36,20 @@ def get_files_size(path): return float(total_size) -def parse_speed(speed_string): +def get_numerical(num_string): - if not "/" in speed_string: - return None + num_string = num_string.lower() + numerical_part = '' + last_digit = 0 + for i,c in enumerate(num_string): + if is_digit(c): + last_digit = i + 1 + numerical_part = num_string[0:last_digit] - (divisor_string, divider_string) = speed_string.split("/", 1) + if not is_numerical(numerical_part): + return None, None - divisor = parse_size(divisor_string) - if divisor == None: - # Cannot parse - return divisor - - if divider_string == "s": - return divisor - - if divider_string == "m": - return divisor / 60 - if divider_string == "h": - return divisor / 3600 - if divider_string == "d": - return divisor / (24 * 3600) - - return None + return numerical_part, last_digit def parse_options(): @@ -66,22 +57,54 @@ def parse_options(): description = 'Transfer time calculator', epilog = "You may omit the 'b' to time events. ex. '20 minutes / task, 7 tasks to do': %(prog)s 3/h 7" ) + parser.add_argument( + '-r', + dest = 'rate', + help = "Rate: inverse of speed. Instead of 10b/s, write 0.1s/b", + action = "store_true", + default = False + ) parser.add_argument('speed', help = "Speed of transfer (ex. 3.2Mb/s). Time units: s, m, h, d, w") parser.add_argument('size', help = "Data size (ex. 4.55GB), or folder/file path. Units: b, kb, mb, gb, tb, pb or kib, mib ... ") return parser.parse_args() +def parse_rate(rate_string): + + if not "/" in rate_string: + return None + + (divisor_string, divider_string) = rate_string.split("/", 1) + + numerical_part, last_digit = get_numerical(divisor_string) + + if not is_numerical(numerical_part): + return None + + numerical_part = float(numerical_part) + multiplier = divisor_string[last_digit:] + + divider = parse_size("1"+divider_string) + if divider == None: + # Cannot parse + return divider + + if multiplier == "s": + return divider / 1 / numerical_part + + if multiplier == "m": + return divider / 60 / numerical_part + if multiplier == "h": + return divider / 3600 / numerical_part + if multiplier == "d": + return divider / (24 * 3600) / numerical_part + + return None + + def parse_size(size_string): - size_string = size_string.lower() - numerical_part = '' - last_digit = 0 - for i,c in enumerate(size_string): - if is_digit(c): - last_digit = i + 1 - numerical_part = size_string[0:last_digit] - - + numerical_part, last_digit = get_numerical(size_string) if not is_numerical(numerical_part): return None @@ -116,6 +139,31 @@ def parse_size(size_string): return None +def parse_speed(speed_string): + + if not "/" in speed_string: + return None + + (divisor_string, divider_string) = speed_string.split("/", 1) + + divisor = parse_size(divisor_string) + if divisor == None: + # Cannot parse + return divisor + + if divider_string == "s": + return divisor + + if divider_string == "m": + return divisor / 60 + if divider_string == "h": + return divisor / 3600 + if divider_string == "d": + return divisor / (24 * 3600) + + return None + + def print_err(s): sys.stderr.write(str(s)+"\n") sys.stderr.flush() @@ -128,11 +176,18 @@ def time_human(num): if __name__ == "__main__": opts = parse_options() - speed = parse_speed(opts.speed) - if speed == None: - print_err("Cannot parse speed ( ex. 3.5Mb/s )") - print_err("Speed: %s"%( opts.speed, )) - sys.exit(1) + if opts.rate: + speed = parse_rate(opts.speed) + if speed == None: + print_err("Cannot parse rate ( ex. 3.5s/kb )") + print_err("Rate: %s"%( opts.speed, )) + sys.exit(1) + else: + speed = parse_speed(opts.speed) + if speed == None: + print_err("Cannot parse speed ( ex. 3.5Mb/s )") + print_err("Speed: %s"%( opts.speed, )) + sys.exit(1) size = parse_size(opts.size)