-
Notifications
You must be signed in to change notification settings - Fork 74
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Refactoring: split assessor in 3 files: grade/assessor/assessor_math * Fixed: 32bit systems without NUMA support #109
- Loading branch information
1 parent
06d9b98
commit 3963fa8
Showing
6 changed files
with
141 additions
and
140 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
""" Help-functions for grade/assessor lib """ | ||
# coding=utf-8 | ||
|
||
import re | ||
import math | ||
|
||
|
||
def round_(x, d=0): | ||
p = 10 ** d | ||
return float(math.floor((x * p) + math.copysign(0.5, x))) / p | ||
|
||
|
||
def extract(dictionary, key_sequence): | ||
key_sequence.reverse() | ||
while dictionary and key_sequence: | ||
dictionary = dictionary.get(key_sequence.pop()) | ||
return dictionary | ||
|
||
|
||
def any2int(value): | ||
if isinstance(value, int): | ||
return value | ||
elif value is None: | ||
return 0 | ||
elif isinstance(value, str): | ||
v = re.sub(r'[^0-9]', '', value) | ||
if v.isdigit(): | ||
return int(v) | ||
elif isinstance(value, float): | ||
return int(value) | ||
return 0 |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
# coding: utf-8 | ||
from netutils_linux_hardware.assessor_math import any2int, round_ | ||
|
||
|
||
class Grade(object): | ||
""" Grade provides methods of grade values of any type in scale of 1..10 """ | ||
|
||
@staticmethod | ||
def int(value, _min, _max, scale=10): | ||
""" Well, it's tricky function writen by all the twitter """ | ||
value = any2int(value) | ||
return min(scale, max(1, int(1 + round_((value - _min) * (scale - 1.) / (_max - _min) + .001)))) | ||
|
||
@staticmethod | ||
def str(value, good=None, bad=None): | ||
return 1 if bad and value in bad else 10 if good and value in good else 2 | ||
|
||
@staticmethod | ||
def fact(value, mode=False): | ||
return 10 if (value is None) != mode else 1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
#!/usr/bin/env python | ||
# coding=utf-8 | ||
|
||
""" Tests of grade in scale of 1..10 """ | ||
|
||
from unittest import TestCase, main | ||
from six import iteritems | ||
from netutils_linux_hardware.grade import Grade | ||
from netutils_linux_hardware.assessor_math import any2int | ||
|
||
|
||
class GradeTest(TestCase): | ||
def test_grade_int(self): | ||
self.longMessage = True | ||
self.assertEqual(Grade.int(2000, 2000, 4000), 1) | ||
self.assertEqual(Grade.int(1000, 2000, 4000), 1) | ||
self.assertEqual(Grade.int(-1000, 2000, 4000), 1) | ||
self.assertEqual(Grade.int(2200, 2000, 4000), 2) | ||
self.assertEqual(Grade.int(3000, 2000, 4000), 6) | ||
self.assertEqual(Grade.int(3999, 2000, 4000), 10) | ||
self.assertEqual(Grade.int(4000, 2000, 4000), 10) | ||
self.assertEqual(Grade.int(5000, 2000, 4000), 10) | ||
self.assertEqual(Grade.int(5000, 2000, 4000, 15), 15) | ||
self.assertEqual(Grade.int(4000, 2000, 4000, 15), 15) | ||
|
||
def test_grade_str(self): | ||
bad = ["Realtek", "Dlink"] | ||
good = ["Intel", "Melanox"] | ||
expected = { | ||
"Melanox": 10, | ||
"Intel": 10, | ||
"Broadcom": 2, | ||
"Dlink": 1, | ||
"Realtek": 1, | ||
} | ||
for k, v in iteritems(expected): | ||
self.assertEqual(Grade.str(k, good, bad), v) | ||
|
||
def test_grade_fact(self): | ||
self.assertEqual(Grade.fact(None, True), 1) | ||
self.assertEqual(Grade.fact(None, False), 10) | ||
self.assertEqual(Grade.fact("Anything", True), 10) | ||
self.assertEqual(Grade.fact("Anything", False), 1) | ||
self.assertEqual(Grade.fact(15, True), 10) | ||
self.assertEqual(Grade.fact(15, False), 1) | ||
self.assertEqual(Grade.fact({'x': 'y'}, True), 10) | ||
self.assertEqual(Grade.fact({}, True), 10) | ||
|
||
def test_any2int(self): | ||
self.assertEqual(any2int(None), 0) | ||
self.assertEqual(any2int(23), 23) | ||
self.assertEqual(any2int(23.1), 23) | ||
self.assertEqual(any2int("23"), 23) | ||
self.assertEqual(any2int("23K"), 23) | ||
self.assertEqual(any2int("23 K"), 23) | ||
self.assertEqual(any2int(" "), 0) | ||
|
||
|
||
if __name__ == '__main__': | ||
main() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters