diff --git a/i3pystatus/cpu_freq.py b/i3pystatus/cpu_freq.py new file mode 100644 index 0000000..e78d9d5 --- /dev/null +++ b/i3pystatus/cpu_freq.py @@ -0,0 +1,51 @@ +# coding=utf-8 +from i3pystatus import IntervalModule + + +class CpuFreq(IntervalModule): + """ + class uses by default `/proc/cpuinfo` to determine the current cpu frequency + + .. rubric:: Available formatters + + * `{avg}` - mean from all cores in MHz `4.3f` + * `{avgg}` - mean from all cores in GHz `1.2f` + * `{coreX}` - frequency of core number `X` in MHz (format `4.3f`), where 0 <= `X` <= number of cores - 1 + * `{coreXg}` - frequency of core number `X` in GHz (fromat `1.2f`), where 0 <= `X` <= number of cores - 1 + + """ + format = "{avgg}" + settings = ( + "format", + ("color", "The text color"), + ("file", "override default path"), + ) + + file = '/proc/cpuinfo' + color = '#FFFFFF' + + def createvaluesdict(self): + """ + function processes the /proc/cpuinfo file + :return: dictionary used as the full-text output for the module + """ + with open(self.file) as f: + mhz_values = [float(line.split(':')[1]) for line in f if line.startswith('cpu MHz')] + ghz_values = [value / 1000.0 for value in mhz_values] + + mhz = {"core{}".format(key): "{0:4.3f}".format(value) for key, value in enumerate(mhz_values)} + ghz = {"core{}g".format(key): "{0:1.2f}".format(value) for key, value in enumerate(ghz_values)} + cdict = mhz.copy() + cdict.update(ghz) + cdict['avg'] = "{0:4.3f}".format(sum(mhz_values) / len(mhz_values)) + cdict['avgg'] = "{0:1.2f}".format(sum(ghz_values) / len(ghz_values), 2) + return cdict + + def run(self): + cdict = self.createvaluesdict() + + self.output = { + "full_text": self.format.format(**cdict), + "color": self.color, + "format": self.format, + } diff --git a/tests/cpufreq01 b/tests/cpufreq01 new file mode 100644 index 0000000..5b79afb --- /dev/null +++ b/tests/cpufreq01 @@ -0,0 +1,4 @@ +cpu MHz : 1240.382 +cpu MHz : 1236.828 +cpu MHz : 1203.007 +cpu MHz : 1264.859 \ No newline at end of file diff --git a/tests/test_cpu_freq.py b/tests/test_cpu_freq.py new file mode 100644 index 0000000..a3a2e03 --- /dev/null +++ b/tests/test_cpu_freq.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python3 +# coding=utf-8 +""" +Basic tests for the cpu_freq module +""" + +import os + +from i3pystatus import cpu_freq + + +def cpu_freq_test(tfpath, tformat, expected): + cf = cpu_freq.CpuFreq(file=os.path.join(os.path.dirname(__file__), tfpath), format=tformat) + cf.run() + assert cf.output["full_text"] == expected + + +def test_basic(): + """ + Tests against the pre-prepared file + """ + cases = [ + ('cpufreq01', '1240.382', '1236.828', '1203.007', '1264.859', '1236.269', '1.24', '1.24', '1.20', '1.26', + '1.24'), + ] + for path, core0, core1, core2, core3, avg, core0g, core1g, core2g, core3g, avgg in cases: + cpu_freq_test(path, "{avg}", avg) + cpu_freq_test(path, "{core0}", core0) + cpu_freq_test(path, "{core1}", core1) + cpu_freq_test(path, "{core2}", core2) + cpu_freq_test(path, "{core3}", core3) + cpu_freq_test(path, "{core0g}", core0g) + cpu_freq_test(path, "{core1g}", core1g) + cpu_freq_test(path, "{core2g}", core2g) + cpu_freq_test(path, "{core3g}", core3g) + cpu_freq_test(path, "{avgg}", avgg)