95 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/python3
 | |
| # -*- coding: utf-8 -*-
 | |
| import math
 | |
| 
 | |
| class DataHolder:
 | |
| 	def __init__(self, value=None, attr_name='value'):
 | |
| 		self._attr_name = attr_name
 | |
| 		self.set(value)
 | |
| 	def __call__(self, value):
 | |
| 		return self.set(value)
 | |
| 	def set(self, value):
 | |
| 		setattr(self, self._attr_name, value)
 | |
| 		return value
 | |
| 	def get(self):
 | |
| 		return getattr(self, self._attr_name)
 | |
| 
 | |
| class Utils():
 | |
| 	@staticmethod
 | |
| 	def GetNum(Text):
 | |
| 		Ret = ''
 | |
| 		for c in Text:
 | |
| 			if c.isdigit():
 | |
| 				Ret += c
 | |
| 			elif Ret:
 | |
| 				break
 | |
| 			elif c == '-':
 | |
| 				Ret += c
 | |
| 
 | |
| 		return Ret
 | |
| 
 | |
| 	@staticmethod
 | |
| 	def ParseTime(TimeStr):
 | |
| 		Negative = False
 | |
| 		Time = 0
 | |
| 
 | |
| 		while TimeStr:
 | |
| 			Val = Utils.GetNum(TimeStr)
 | |
| 			if not Val:
 | |
| 				break
 | |
| 
 | |
| 			Val = int(Val)
 | |
| 			if not Val:
 | |
| 				break
 | |
| 
 | |
| 			if Val < 0:
 | |
| 				TimeStr = TimeStr[1:]
 | |
| 				if Time == 0:
 | |
| 					Negative = True
 | |
| 			Val = abs(Val)
 | |
| 
 | |
| 			ValLen = int(math.log10(Val)) + 1
 | |
| 			if len(TimeStr) > ValLen:
 | |
| 				Mult = TimeStr[ValLen].lower()
 | |
| 				TimeStr = TimeStr[ValLen + 1:]
 | |
| 				if Mult == 'h':
 | |
| 					Val *= 3600
 | |
| 				elif Mult == 'm':
 | |
| 					Val *= 60
 | |
| 			else:
 | |
| 				TimeStr = None
 | |
| 
 | |
| 			Time += Val
 | |
| 
 | |
| 		if Negative:
 | |
| 			return -Time
 | |
| 		else:
 | |
| 			return Time
 | |
| 
 | |
| 
 | |
| 	@staticmethod
 | |
| 	def HumanSize(size_bytes):
 | |
| 		"""
 | |
| 		format a size in bytes into a 'human' file size, e.g. bytes, KB, MB, GB, TB, PB
 | |
| 		Note that bytes/KB will be reported in whole numbers but MB and above will have greater precision
 | |
| 		e.g. 1 byte, 43 bytes, 443 KB, 4.3 MB, 4.43 GB, etc
 | |
| 		"""
 | |
| 		if size_bytes == 1:
 | |
| 			# because I really hate unnecessary plurals
 | |
| 			return "1 byte"
 | |
| 
 | |
| 		suffixes_table = [('bytes', 0),('KB', 0),('MB', 1),('GB', 2),('TB', 2), ('PB', 2)]
 | |
| 
 | |
| 		num = float(size_bytes)
 | |
| 		for suffix, precision in suffixes_table:
 | |
| 			if num < 1024.0:
 | |
| 				break
 | |
| 			num /= 1024.0
 | |
| 
 | |
| 		if precision == 0:
 | |
| 			formatted_size = str(int(num))
 | |
| 		else:
 | |
| 			formatted_size = str(round(num, ndigits=precision))
 | |
| 
 | |
| 		return "{0}{1}".format(formatted_size, suffix)
 |