Skip to content
Snippets Groups Projects
Commit 992ea07e authored by juga's avatar juga
Browse files

Reorder methods in BWV3Line

1. magic methods
2. classmethods
3. staticmethods
4. properties
5. methods
parent 40a76cc7
Branches
Tags
No related merge requests found
......@@ -249,38 +249,30 @@ class V3BWLine(object):
[setattr(self, k, v) for k, v in kwargs.items()
if k in BW_EXTRA_ARG_KEYVALUES]
@property
def bw_keyvalue_tuple_ls(self):
"""Return list of KeyValue Bandwidth Line tuples."""
# sort the list to generate determinist headers
keyvalue_tuple_ls = sorted([(k, v) for k, v in self.__dict__.items()
if k in BW_KEYVALUES])
return keyvalue_tuple_ls
@property
def bw_keyvalue_v110str_ls(self):
"""Return list of KeyValue Bandwidth Line strings following
spec v1.1.0.
"""
bw_keyvalue_str = [KEYVALUE_SEP_V110 .join([k, str(v)])
for k, v in self.bw_keyvalue_tuple_ls]
return bw_keyvalue_str
@property
def bw_strv110(self):
"""Return Bandwidth Line string following spec v1.1.0."""
bw_line_str = BW_KEYVALUE_SEP_V110.join(
self.bw_keyvalue_v110str_ls) + LINE_SEP
if len(bw_line_str) > BW_LINE_SIZE:
# if this is the case, probably there are too many KeyValues,
# or the limit needs to be changed in Tor
log.warn("The bandwidth line %s is longer than %s",
len(bw_line_str), BW_LINE_SIZE)
return bw_line_str
def __str__(self):
return self.bw_strv110
@classmethod
def from_results(cls, results):
success_results = [r for r in results if isinstance(r, ResultSuccess)]
# log.debug('len(success_results) %s', len(success_results))
node_id = '$' + results[0].fingerprint
bw = cls.bw_from_results(success_results)
kwargs = dict()
kwargs['nick'] = results[0].nickname
if getattr(results[0], 'master_key_ed25519'):
kwargs['master_key_ed25519'] = results[0].master_key_ed25519
kwargs['rtt'] = cls.rtt_from_results(success_results)
kwargs['time'] = cls.last_time_from_results(results)
kwargs.update(cls.result_types_from_results(results))
bwl = cls(node_id, bw, **kwargs)
return bwl
@classmethod
def from_data(cls, data, fingerprint):
assert fingerprint in data
return cls.from_results(data[fingerprint])
@classmethod
def from_bw_line_v110(cls, line):
assert isinstance(line, str)
......@@ -293,6 +285,24 @@ class V3BWLine(object):
bw_line = cls(**kwargs)
return bw_line
@staticmethod
def last_time_from_results(results):
return unixts_to_isodt_str(round(max([r.time for r in results])))
@staticmethod
def rtt_from_results(results):
# convert from miliseconds to seconds
rtts = [(round(rtt * 1000)) for r in results for rtt in r.rtts]
rtt = round(median(rtts))
return rtt
@staticmethod
def result_types_from_results(results):
rt_dict = dict([(result_type_to_key(rt.value),
num_results_of_type(results, rt.value))
for rt in _ResultType])
return rt_dict
@staticmethod
def bw_from_results(results):
median_bw = median([dl['amount'] / dl['duration']
......@@ -319,44 +329,34 @@ class V3BWLine(object):
bw_kb = max(round(bw / 1024), 1)
return bw_kb
@staticmethod
def last_time_from_results(results):
return unixts_to_isodt_str(round(max([r.time for r in results])))
@staticmethod
def rtt_from_results(results):
# convert from miliseconds to seconds
rtts = [(round(rtt * 1000)) for r in results for rtt in r.rtts]
rtt = round(median(rtts))
return rtt
@staticmethod
def result_types_from_results(results):
rt_dict = dict([(result_type_to_key(rt.value),
num_results_of_type(results, rt.value))
for rt in _ResultType])
return rt_dict
@property
def bw_keyvalue_tuple_ls(self):
"""Return list of KeyValue Bandwidth Line tuples."""
# sort the list to generate determinist headers
keyvalue_tuple_ls = sorted([(k, v) for k, v in self.__dict__.items()
if k in BW_KEYVALUES])
return keyvalue_tuple_ls
@classmethod
def from_results(cls, results):
success_results = [r for r in results if isinstance(r, ResultSuccess)]
# log.debug('len(success_results) %s', len(success_results))
node_id = '$' + results[0].fingerprint
bw = cls.bw_from_results(success_results)
kwargs = dict()
kwargs['nick'] = results[0].nickname
if getattr(results[0], 'master_key_ed25519'):
kwargs['master_key_ed25519'] = results[0].master_key_ed25519
kwargs['rtt'] = cls.rtt_from_results(success_results)
kwargs['time'] = cls.last_time_from_results(results)
kwargs.update(cls.result_types_from_results(results))
bwl = cls(node_id, bw, **kwargs)
return bwl
@property
def bw_keyvalue_v110str_ls(self):
"""Return list of KeyValue Bandwidth Line strings following
spec v1.1.0.
"""
bw_keyvalue_str = [KEYVALUE_SEP_V110 .join([k, str(v)])
for k, v in self.bw_keyvalue_tuple_ls]
return bw_keyvalue_str
@classmethod
def from_data(cls, data, fingerprint):
assert fingerprint in data
return cls.from_results(data[fingerprint])
@property
def bw_strv110(self):
"""Return Bandwidth Line string following spec v1.1.0."""
bw_line_str = BW_KEYVALUE_SEP_V110.join(
self.bw_keyvalue_v110str_ls) + LINE_SEP
if len(bw_line_str) > BW_LINE_SIZE:
# if this is the case, probably there are too many KeyValues,
# or the limit needs to be changed in Tor
log.warn("The bandwidth line %s is longer than %s",
len(bw_line_str), BW_LINE_SIZE)
return bw_line_str
class V3BWFile(object):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment