commit: 5f519fc3a9912e993f7cc0e55792deb2bc262559 Author: Michał Górny <mgorny <AT> gentoo <DOT> org> AuthorDate: Sat Mar 29 18:45:28 2014 +0000 Commit: Brian Dolbec <brian.dolbec <AT> gmail <DOT> com> CommitDate: Fri Apr 4 22:55:41 2014 +0000 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=5f519fc3
Use a localized size formatting function A similar size formatting function was used in two places in emerge code. Instead, create a single function in portage.localization module that formats sizes using the current locale and a common set of rules. I'm not really convinced about 'ceiling' all sizes but I understand the original point about not outputting '0 KiB'. If you have better ideas, I'd be happy to change it. The code was simplified, and a proper number formatting function is used (instead of string splitting). Locale grouping rules are respected now, and ISO/IEC binary prefixes are used for unambiguity. --- pym/_emerge/resolver/output.py | 5 +++-- pym/_emerge/resolver/output_helpers.py | 20 +++----------------- pym/_emerge/search.py | 10 +++------- pym/portage/localization.py | 12 ++++++++++++ 4 files changed, 21 insertions(+), 26 deletions(-) diff --git a/pym/_emerge/resolver/output.py b/pym/_emerge/resolver/output.py index 5f550be..aefc3f4 100644 --- a/pym/_emerge/resolver/output.py +++ b/pym/_emerge/resolver/output.py @@ -18,6 +18,7 @@ from portage.dbapi.dep_expand import dep_expand from portage.dep import cpvequal, _repo_separator, _slot_separator from portage.eapi import _get_eapi_attrs from portage.exception import InvalidDependString, SignatureException +from portage.localization import localized_size from portage.package.ebuild.config import _get_feature_flags from portage.package.ebuild._spawn_nofetch import spawn_nofetch from portage.output import ( blue, colorize, create_color_func, @@ -30,7 +31,7 @@ from portage.versions import best, cpv_getversion from _emerge.Blocker import Blocker from _emerge.create_world_atom import create_world_atom from _emerge.resolver.output_helpers import ( _DisplayConfig, _tree_display, - _PackageCounters, _create_use_string, _format_size, _calc_changelog, PkgInfo) + _PackageCounters, _create_use_string, _calc_changelog, PkgInfo) from _emerge.show_invalid_depstring_notice import show_invalid_depstring_notice if sys.hexversion >= 0x3000000: @@ -330,7 +331,7 @@ class Display(object): self.myfetchlist.add(myfetchfile) if pkg_info.ordered: self.counters.totalsize += mysize - self.verboseadd += _format_size(mysize) + self.verboseadd += localized_size(mysize) if self.quiet_repo_display: # overlay verbose diff --git a/pym/_emerge/resolver/output_helpers.py b/pym/_emerge/resolver/output_helpers.py index 58b2694..e0ee3e0 100644 --- a/pym/_emerge/resolver/output_helpers.py +++ b/pym/_emerge/resolver/output_helpers.py @@ -1,4 +1,4 @@ -# Copyright 2010-2013 Gentoo Foundation +# Copyright 2010-2014 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 """Contains private support functions for the Display class @@ -17,6 +17,7 @@ import sys from portage import os from portage import _encodings, _unicode_encode from portage._sets.base import InternalPackageSet +from portage.localization import localized_size from portage.output import (blue, bold, colorize, create_color_func, green, red, teal, turquoise, yellow) bad = create_color_func("BAD") @@ -158,7 +159,7 @@ class _PackageCounters(object): myoutput.append(", ".join(details)) if total_installs != 0: myoutput.append(")") - myoutput.append(", Size of downloads: %s" % _format_size(self.totalsize)) + myoutput.append(", Size of downloads: %s" % localized_size(self.totalsize)) if self.restrict_fetch: myoutput.append("\nFetch Restriction: %s package" % \ self.restrict_fetch) @@ -234,21 +235,6 @@ class _DisplayConfig(object): self.pkg = depgraph._pkg -# formats a size given in bytes nicely -def _format_size(mysize): - if isinstance(mysize, basestring): - return mysize - if 0 != mysize % 1024: - # Always round up to the next kB so that it doesn't show 0 kB when - # some small file still needs to be fetched. - mysize += 1024 - mysize % 1024 - mystr=str(mysize//1024) - mycount=len(mystr) - while (mycount > 3): - mycount-=3 - mystr=mystr[:mycount]+","+mystr[mycount:] - return mystr+" kB" - def _create_use_string(conf, name, cur_iuse, iuse_forced, cur_use, old_iuse, old_use, is_new, feature_flags, reinst_flags): diff --git a/pym/_emerge/search.py b/pym/_emerge/search.py index bd74fb7..4b0fd9f 100644 --- a/pym/_emerge/search.py +++ b/pym/_emerge/search.py @@ -1,4 +1,4 @@ -# Copyright 1999-2013 Gentoo Foundation +# Copyright 1999-2014 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 from __future__ import print_function @@ -7,6 +7,7 @@ import re import portage from portage import os from portage.dbapi.porttree import _parse_uri_map +from portage.localization import localized_size from portage.output import bold, bold as white, darkgreen, green, red from portage.util import writemsg_stdout @@ -348,12 +349,7 @@ class search(object): break if myebuild and file_size_str is None: - mystr = str(mysum[0] // 1024) - mycount = len(mystr) - while (mycount > 3): - mycount -= 3 - mystr = mystr[:mycount] + "," + mystr[mycount:] - file_size_str = mystr + " kB" + file_size_str = localized_size(mysum[0]) if self.verbose: if available: diff --git a/pym/portage/localization.py b/pym/portage/localization.py index b54835a..e4d87b6 100644 --- a/pym/portage/localization.py +++ b/pym/portage/localization.py @@ -2,6 +2,9 @@ # Copyright 2004-2014 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 +import locale +import math + from portage import _unicode_decode # We define this to make the transition easier for us. @@ -25,3 +28,12 @@ def localization_example(): print(_("A: %(a)s -- B: %(b)s -- C: %(c)s") % {"a": a_value, "b": b_value, "c": c_value}) +def localized_size(num_bytes): + """ + Return pretty localized size string for num_bytes size + (given in bytes). The output will be in kibibytes. + """ + + # always round up, so that small files don't end up as '0 KiB' + num_kib = math.ceil(num_bytes / 1024) + return locale.format('%d', num_kib, grouping=True) + ' KiB'