Changed indentation and wrote docstring for each function.
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
# @Author: KevinMidboe
|
||||
# @Date: 2017-11-01 15:57:23
|
||||
# @Last Modified by: KevinMidboe
|
||||
# @Last Modified time: 2017-12-22 11:16:09
|
||||
# @Last Modified time: 2017-12-22 12:07:18
|
||||
|
||||
import re
|
||||
import logging
|
||||
@@ -13,118 +13,137 @@ from datetime import datetime
|
||||
from colored import stylize
|
||||
|
||||
SYMBOLS = {
|
||||
'customary' : ('B', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'),
|
||||
'customary_ext' : ('byte', 'kilo', 'mega', 'giga', 'tera', 'peta', 'exa',
|
||||
'zetta', 'iotta'),
|
||||
'iec' : ('BiB', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'),
|
||||
'iec_ext' : ('byte', 'kibi', 'mebi', 'gibi', 'tebi', 'pebi', 'exbi',
|
||||
'zebi', 'yobi'),
|
||||
'customary' : ('B', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'),
|
||||
'customary_ext' : ('byte', 'kilo', 'mega', 'giga', 'tera', 'peta', 'exa',
|
||||
'zetta', 'iotta'),
|
||||
'iec' : ('BiB', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'),
|
||||
'iec_ext' : ('byte', 'kibi', 'mebi', 'gibi', 'tebi', 'pebi', 'exbi',
|
||||
'zebi', 'yobi'),
|
||||
}
|
||||
|
||||
__all__ = ('ColorizeFilter', )
|
||||
|
||||
class ColorizeFilter(logging.Filter):
|
||||
"""
|
||||
Class for setting specific colors to levels of severity for log output
|
||||
"""
|
||||
|
||||
color_by_level = {
|
||||
logging.DEBUG: 'yellow',
|
||||
logging.WARNING: 'red',
|
||||
logging.ERROR: 'red',
|
||||
logging.INFO: 'white'
|
||||
}
|
||||
color_by_level = {
|
||||
logging.DEBUG: 'yellow',
|
||||
logging.WARNING: 'red',
|
||||
logging.ERROR: 'red',
|
||||
logging.INFO: 'white'
|
||||
}
|
||||
|
||||
def filter(self, record):
|
||||
record.raw_msg = record.msg
|
||||
color = self.color_by_level.get(record.levelno)
|
||||
if color:
|
||||
record.msg = stylize(record.msg, colored.fg(color))
|
||||
return True
|
||||
def filter(self, record):
|
||||
record.raw_msg = record.msg
|
||||
color = self.color_by_level.get(record.levelno)
|
||||
if color:
|
||||
record.msg = stylize(record.msg, colored.fg(color))
|
||||
return True
|
||||
|
||||
def sanitize(string, ignore_characters=None, replace_characters=None):
|
||||
"""Sanitize a string to strip special characters.
|
||||
"""
|
||||
Sanitize a string to strip special characters.
|
||||
|
||||
:param str string: the string to sanitize.
|
||||
:param set ignore_characters: characters to ignore.
|
||||
:return: the sanitized string.
|
||||
:rtype: str
|
||||
:param str string: the string to sanitize.
|
||||
:param set ignore_characters: characters to ignore.
|
||||
:return: the sanitized string.
|
||||
:rtype: str
|
||||
|
||||
"""
|
||||
# only deal with strings
|
||||
if string is None:
|
||||
return
|
||||
|
||||
replace_characters = replace_characters or ''
|
||||
"""
|
||||
# only deal with strings
|
||||
if string is None:
|
||||
return
|
||||
|
||||
replace_characters = replace_characters or ''
|
||||
|
||||
ignore_characters = ignore_characters or set()
|
||||
ignore_characters = ignore_characters or set()
|
||||
|
||||
characters = ignore_characters
|
||||
if characters:
|
||||
string = re.sub(r'[%s]' % re.escape(''.join(characters)), replace_characters, string)
|
||||
characters = ignore_characters
|
||||
if characters:
|
||||
string = re.sub(r'[%s]' % re.escape(''.join(characters)), replace_characters, string)
|
||||
|
||||
return string
|
||||
return string
|
||||
|
||||
def return_re_match(string, re_statement):
|
||||
if string is None:
|
||||
return
|
||||
"""
|
||||
Helper function for checking if a string contains a given regex statement
|
||||
|
||||
m = re.search(re_statement, string)
|
||||
if 'Y-day' in m.group():
|
||||
return datetime.now().strftime('%m-%d %Y')
|
||||
return sanitize(m.group(), '\xa0', ' ')
|
||||
:param str string, str re_statement: string we want to check and regex string we
|
||||
check for in string
|
||||
:return: sanitized string of the match we found
|
||||
:rtype: str
|
||||
"""
|
||||
if string is None:
|
||||
return
|
||||
|
||||
|
||||
# Can maybe be moved away from this class
|
||||
# returns a number that is either the value of multiple_pages
|
||||
# or if it exceeds total_pages, return total_pages.
|
||||
def pagesToCount(multiple, total):
|
||||
if (multiple > total):
|
||||
return total
|
||||
return multiple
|
||||
m = re.search(re_statement, string)
|
||||
# This is here for a edge case for piratebay torrent dates
|
||||
if 'Y-day' in m.group():
|
||||
return datetime.now().strftime('%m-%d %Y')
|
||||
return sanitize(m.group(), '\xa0', ' ')
|
||||
|
||||
def representsInteger(str):
|
||||
try:
|
||||
int(str)
|
||||
return True
|
||||
except ValueError:
|
||||
return False
|
||||
"""
|
||||
Checks if a string only contains integers
|
||||
|
||||
:param str str: string we want to check only has integers
|
||||
:return: if string only contains integers
|
||||
:rtype: boolean
|
||||
"""
|
||||
try:
|
||||
int(str)
|
||||
return True
|
||||
except ValueError:
|
||||
return False
|
||||
|
||||
def deHumansize(s):
|
||||
"""
|
||||
Attempts to guess the string format based on default symbols
|
||||
set and return the corresponding bytes as an integer.
|
||||
When unable to recognize the format ValueError is raised.
|
||||
"""
|
||||
Attempts to guess the string format based on default symbols
|
||||
set and return the corresponding bytes as an integer.
|
||||
When unable to recognize the format ValueError is raised.
|
||||
|
||||
:param str s: human file size that we want to convert
|
||||
:return: the guessed bytes in from the human file size
|
||||
:rtype: int
|
||||
"""
|
||||
:param str s: human file size that we want to convert
|
||||
:return: the guessed bytes in from the human file size
|
||||
:rtype: int
|
||||
"""
|
||||
|
||||
init = s
|
||||
num = ""
|
||||
while s and s[0:1].isdigit() or s[0:1] == '.':
|
||||
num += s[0]
|
||||
s = s[1:]
|
||||
num = float(num)
|
||||
letter = s.strip()
|
||||
for name, sset in SYMBOLS.items():
|
||||
if letter in sset:
|
||||
break
|
||||
else:
|
||||
if letter == 'k':
|
||||
# treat 'k' as an alias for 'K' as per: http://goo.gl/kTQMs
|
||||
sset = SYMBOLS['customary']
|
||||
letter = letter.upper()
|
||||
else:
|
||||
raise ValueError("can't interpret %r" % init)
|
||||
prefix = {sset[0]:1}
|
||||
for i, s in enumerate(sset[1:]):
|
||||
prefix[s] = 1 << (i+1)*10
|
||||
return int(num * prefix[letter])
|
||||
init = s
|
||||
num = ""
|
||||
while s and s[0:1].isdigit() or s[0:1] == '.':
|
||||
num += s[0]
|
||||
s = s[1:]
|
||||
num = float(num)
|
||||
letter = s.strip()
|
||||
for name, sset in SYMBOLS.items():
|
||||
if letter in sset:
|
||||
break
|
||||
else:
|
||||
if letter == 'k':
|
||||
# treat 'k' as an alias for 'K' as per: http://goo.gl/kTQMs
|
||||
sset = SYMBOLS['customary']
|
||||
letter = letter.upper()
|
||||
else:
|
||||
raise ValueError("can't interpret %r" % init)
|
||||
prefix = {sset[0]:1}
|
||||
for i, s in enumerate(sset[1:]):
|
||||
prefix[s] = 1 << (i+1)*10
|
||||
return int(num * prefix[letter])
|
||||
|
||||
def humansize(nbytes):
|
||||
suffixes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB']
|
||||
i = 0
|
||||
while nbytes >= 1024 and i < len(suffixes)-1:
|
||||
nbytes /= 1024.
|
||||
i += 1
|
||||
f = ('%.2f' % nbytes).rstrip('0').rstrip('.')
|
||||
return '{} {}'.format(f, suffixes[i])
|
||||
"""
|
||||
Translates a size in bytes to a human readable size format
|
||||
|
||||
:param int nbytes: integer of size of torrent file
|
||||
:return: size in bytes in a human readable format
|
||||
:rtype: str
|
||||
"""
|
||||
suffixes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB']
|
||||
i = 0
|
||||
while nbytes >= 1024 and i < len(suffixes)-1:
|
||||
nbytes /= 1024.
|
||||
i += 1
|
||||
f = ('%.2f' % nbytes).rstrip('0').rstrip('.')
|
||||
return '{} {}'.format(f, suffixes[i])
|
||||
|
||||
|
||||
Reference in New Issue
Block a user