3 from time
import time
as clock
8 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
.info("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
33 def write(self
, s
): self
.writer(s
)
34 def flush(self
): self
.flusher()
37 def __init__(self
, filename
, defaults
=None):
39 self
.set_functions
= {}
40 if defaults
: self
.config
= defaults
41 self
.config_file
= get_config_dir(filename
)
42 self
.load(self
.config_file
)
48 def __getitem__(self
, key
):
49 return self
.config
[key
]
51 def __setitem__(self
, key
, value
):
52 self
.config
[key
] = value
55 return self
.config
.items()
60 def load(self
, filename
=None):
62 filename
= self
.config_file
65 pkl_file
= open(filename
, "rb")
66 filedump
= pickle
.load(pkl_file
)
67 self
.config
.update(filedump
)
70 log
.error("IOError: Unable to load file '%s'", filename
)
74 def save(self
, filename
=None):
76 filename
= self
.config_file
78 pkl_file
= open(filename
, "wb")
79 pickle
.dump(self
.config
, pkl_file
)
82 log
.error("IOError: Unable to save file '%s'", filename
)
86 value
= self
.config
[key
]
89 log
.error("Key does not exist, returning None")
92 def register_set_function(self
, key
, function
, apply_now
=True):
93 self
.set_functions
[key
] = function
95 log
.info("Applying %s with %s" % (key
, str(self
.config
[key
])))
96 self
.set_functions
[key
](key
, self
.config
[key
])
98 log
.debug("Registering function for %s key..", key
)
101 log
.debug("Running all set functions..")
102 for key
in self
.set_functions
.keys():
103 self
.set_functions
[key
](key
, self
.config
[key
])
105 def aright(x
, w
): return x
.rjust(w
)
106 def aleft(x
, w
): return x
.ljust(w
)
107 def acenter(x
, w
): return x
.center(w
)
109 def toggle(f1
, f2
, a1
=(), a2
=()):
110 def true(x
): return True
111 return lambda k
,v
: v
and true(f1(*a1
)) or f2(*a2
)
113 def get_stat(obj
, k
, v
= {}, f
= {}):
114 if k
in v
: return v
[k
]
115 if k
in f
: return f
[k
]()
116 return getattr(obj
, k
)
118 def fsize(fsize_b
, divide
= 1024.0):
119 fsize_kb
= float (fsize_b
/ divide
)
121 return ("%3.1fK")%fsize
_kb
122 fsize_mb
= float (fsize_kb
/ divide
)
124 return ("%3.1fM")%fsize
_mb
125 fsize_gb
= float (fsize_mb
/ divide
)
126 return ("%3.1fG")%fsize
_gb
129 return '%3.3f%%'%(dec
* 100)
132 return '%2.2f'%(ratio)
134 def fbar(progress
, width
=10):
135 progress_chars
= int(progress
* width
)
136 return (progress_chars
* '#' + (width
- progress_chars
) * '-')
139 if bps
< 0: return 'inf'
140 return fsize(bps
, 1000)
142 def fpeers(x
, max=999):
143 if x
> max: return 'inf'
147 if seconds
< 60: return '%2ds'%(seconds)
148 minutes
= int(seconds
/60)
149 seconds
= seconds
% 60
150 if minutes
< 60: return '%2dm %2ds'%(minutes
, seconds
)
151 hours
= int(minutes
/60)
152 minutes
= minutes
% 60
153 if hours
< 24: return '%2dh %2dm'%(hours
, minutes
)
156 if days
< 7: return '%2dd %2dh'%(days
, hours
)
159 if weeks
< 10: return '%2dw %2dd'%(weeks
, days
)
165 if x
> 999: return '---'
168 state
= ['queue', 'hash', 'meta', 'down', 'finish', 'seed', 'init']
177 return "%3s %c%c%c" % (queue(q
), managed(m
), paused(p
), state(s
))
179 def get_default_dir(extra
=None):
180 path
= os
.environ
.get("HOME")
182 path
= os
.path
.join(path
, extra
)
183 try: os
.makedirs(path
)
187 def get_config_dir(filename
=None):
188 path
= os
.path
.join(get_default_dir(), ".tore/")
193 if filename
: path
= os
.path
.join(path
, filename
)