3 from time
import time
as clock
7 log_format
= "[%(levelname)-8s] %(name)s:%(module)s:%(lineno)d %(message)s"
9 logging
.basicConfig(level
=logging
.DEBUG
, format
=log_format
, stream
=sys
.stderr
)
10 log
= logging
.getLogger()
13 def wrapper(*args
, **kwargs
):
15 r
= f(*args
, **kwargs
)
16 log("timing %s: %s" % (str(f
), str(clock()-s
)))
21 def wrapper(*args
, **kwargs
):
22 try: return f(*args
, **kwargs
)
25 log
.error("error: " + str(f
))
29 def __init__(self
, writer
, flusher
= lambda: None):
31 self
.flusher
= flusher
40 def __init__(self
, filename
, defaults
=None):
42 self
.set_functions
= {}
44 self
.config
= defaults
46 self
.config_file
= get_config_dir(filename
)
47 self
.load(self
.config_file
)
53 def __getitem__(self
, key
):
54 return self
.config
[key
]
56 def __setitem__(self
, key
, value
):
60 return self
.config
.items()
65 def load(self
, filename
=None):
67 filename
= self
.config_file
70 pkl_file
= open(filename
, "rb")
71 filedump
= pickle
.load(pkl_file
)
72 self
.config
.update(filedump
)
75 log
.error("IOError: Unable to load file '%s'", filename
)
79 def save(self
, filename
=None):
81 filename
= self
.config_file
83 pkl_file
= open(filename
, "wb")
84 pickle
.dump(self
.config
, pkl_file
)
87 log
.error("IOError: Unable to save file '%s'", filename
)
91 value
= self
.config
[key
]
94 log
.error("Key does not exist, returning None")
97 def register_set_function(self
, key
, function
, apply_now
=True):
98 log
.debug("Registering function for %s key..", key
)
99 self
.set_functions
[key
] = function
100 if apply_now
: self
.set_functions
[key
](key
, self
.config
[key
])
103 log
.debug("Running all set functions..")
104 for key
in self
.set_functions
.keys():
105 self
.set_functions
[key
](key
, self
.config
[key
])
107 def aright(x
, w
): return x
.rjust(w
)
108 def aleft(x
, w
): return x
.ljust(w
)
109 def acenter(x
, w
): return x
.center(w
)
111 def fsize(fsize_b
, divide
= 1024.0):
112 fsize_kb
= float (fsize_b
/ divide
)
114 return ("%3.1fK")%fsize
_kb
115 fsize_mb
= float (fsize_kb
/ divide
)
117 return ("%3.1fM")%fsize
_mb
118 fsize_gb
= float (fsize_mb
/ divide
)
119 return ("%3.1fG")%fsize
_gb
122 return '%3.3f%%'%(dec
* 100)
124 def fbar(progress
, width
=12):
125 progress_chars
= int(progress
* (width
-2) + 0.5)
126 return '['+(progress_chars
* '#' + (width
- progress_chars
-2) * '-')+']'
129 if bps
< 0: return 'inf'
130 return fsize(bps
, 1000)
132 def fpeers(x
, max=999):
133 if x
> max: return 'inf'
137 if seconds
< 60: return '%2ds'%(seconds)
138 minutes
= int(seconds
/60)
139 seconds
= seconds
% 60
140 if minutes
< 60: return '%2dm %2ds'%(minutes
, seconds
)
141 hours
= int(minutes
/60)
142 minutes
= minutes
% 60
143 if hours
< 24: return '%2dh %2dm'%(hours
, minutes
)
146 if days
< 7: return '%2dd %2dh'%(days
, hours
)
149 if weeks
< 10: return '%2dw %2dd'%(weeks
, days
)
160 state
= ['queue', 'hash', 'join', 'meta', 'down', 'finish', 'seed', 'init']
162 return (x
[1] and "p" or " ") + state(x
[0])[0]
164 def get_default_dir():
165 return os
.environ
.get("HOME")
167 def get_config_dir(filename
=None):
168 path
= os
.path
.join(get_default_dir(), ".config/tore/")
173 if filename
: path
= os
.path
.join(path
, filename
)
176 def get_default_resume_dir():
177 dir = os
.path
.join(get_config_dir(), "resumefiles")