generalize transfer-time
This commit is contained in:
@@ -36,29 +36,20 @@ def get_files_size(path):
|
|||||||
return float(total_size)
|
return float(total_size)
|
||||||
|
|
||||||
|
|
||||||
def parse_speed(speed_string):
|
def get_numerical(num_string):
|
||||||
|
|
||||||
if not "/" in speed_string:
|
num_string = num_string.lower()
|
||||||
return None
|
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)
|
return numerical_part, last_digit
|
||||||
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 parse_options():
|
def parse_options():
|
||||||
@@ -66,22 +57,54 @@ def parse_options():
|
|||||||
description = 'Transfer time calculator',
|
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"
|
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('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 ... ")
|
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()
|
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):
|
def parse_size(size_string):
|
||||||
|
|
||||||
size_string = size_string.lower()
|
numerical_part, last_digit = get_numerical(size_string)
|
||||||
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]
|
|
||||||
|
|
||||||
|
|
||||||
if not is_numerical(numerical_part):
|
if not is_numerical(numerical_part):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@@ -116,6 +139,31 @@ def parse_size(size_string):
|
|||||||
return None
|
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):
|
def print_err(s):
|
||||||
sys.stderr.write(str(s)+"\n")
|
sys.stderr.write(str(s)+"\n")
|
||||||
sys.stderr.flush()
|
sys.stderr.flush()
|
||||||
@@ -128,11 +176,18 @@ def time_human(num):
|
|||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
opts = parse_options()
|
opts = parse_options()
|
||||||
|
|
||||||
speed = parse_speed(opts.speed)
|
if opts.rate:
|
||||||
if speed == None:
|
speed = parse_rate(opts.speed)
|
||||||
print_err("Cannot parse speed ( ex. 3.5Mb/s )")
|
if speed == None:
|
||||||
print_err("Speed: %s"%( opts.speed, ))
|
print_err("Cannot parse rate ( ex. 3.5s/kb )")
|
||||||
sys.exit(1)
|
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)
|
size = parse_size(opts.size)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user