summaryrefslogtreecommitdiff
path: root/humanify
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2011-05-10 17:05:38 +0100
committerLars Wirzenius <liw@liw.fi>2011-05-10 17:05:38 +0100
commit32d31cd47b27215dd2fdb8272b0adb0b3b2f3892 (patch)
tree893504ec45e25b45707a2d8440d7032d075e5804 /humanify
parente6e3ac799af4c4d9c22f86eead23c1dee9c2e528 (diff)
downloadextrautils-32d31cd47b27215dd2fdb8272b0adb0b3b2f3892.tar.gz
Add humanify.
Diffstat (limited to 'humanify')
-rwxr-xr-xhumanify91
1 files changed, 91 insertions, 0 deletions
diff --git a/humanify b/humanify
new file mode 100755
index 0000000..b7e69de
--- /dev/null
+++ b/humanify
@@ -0,0 +1,91 @@
+#!/usr/bin/python
+# Copyright 2011 Lars Wirzenius
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+import cliapp
+import sys
+
+
+class Humanify(cliapp.Application):
+
+ iso_prefixes = [
+ (1000**8, 'Y'),
+ (1000**7, 'Z'),
+ (1000**6, 'E'),
+ (1000**5, 'P'),
+ (1000**4, 'T'),
+ (1000**3, 'G'),
+ (1000**2, 'M'),
+ (1000, 'k'),
+ (1, ''),
+ ]
+ iec_prefixes = [
+ (1024**8, 'Yi'),
+ (1024**7, 'Zi'),
+ (1024**6, 'Ei'),
+ (1024**5, 'Pi'),
+ (1024**4, 'Ti'),
+ (1024**3, 'Gi'),
+ (1024**2, 'MI'),
+ (1024, 'Ki'),
+ (1, ''),
+ ]
+
+ def add_settings(self):
+ self.settings.add_boolean_setting(['binary', 'iec'],
+ 'use 10-based, not 2-based prefixes '
+ '(ISO vs IEC)')
+ self.settings.add_boolean_setting(['bits'],
+ 'inputs give numbers of bits')
+
+ def process_args(self, args):
+ self.units = self.determine_units()
+
+ if args:
+ for arg in args:
+ self.humanify(arg)
+ else:
+ for line in sys.stdin:
+ self.humanify(float(line.strip()))
+
+ def determine_units(self):
+ if self.settings['binary']:
+ prefixes = self.iec_prefixes
+ else:
+ prefixes = self.iso_prefixes
+ if self.settings['bits']:
+ suffix = 'b'
+ else:
+ suffix = 'B'
+ return [(factor, prefix + suffix) for factor, prefix in prefixes]
+
+ def humanify(self, arg):
+ self.output.write('%s\n' % self._humanify(float(arg), self.units))
+
+ def _humanify(self, value, units):
+ assert units
+ if value >= units[0][0]:
+ return '%.0f %s' % (round(float(value) / units[0][0]),
+ units[0][1])
+ for factor, unit in units:
+ size = float(value) / float(factor)
+ if 1 <= size < 1000:
+ return '%.0f %s' % (round(size), unit)
+ return '%.0f %s' % (round(float(value) / units[-1][0]), units[-1][1])
+
+
+if __name__ == '__main__':
+ Humanify().run()