Changeset - 5a73d3d8f8d4
[Not reviewed]
master
0 1 0
Brett Smith - 4 years ago 2020-05-20 20:02:47
brettcsmith@brettcsmith.org
historical: Move normalize_rate and _pretty_rate to base Formatter.

This reduces the number of method overrides to help readability,
and gets rid of the annoying format_rate/pretty_rate distinction.
1 file changed with 27 insertions and 33 deletions:
0 comments (0 inline, 0 general)
oxrlib/commands/historical.py
Show inline comments
...
 
@@ -45,13 +45,29 @@ class Formatter:
 
    def normalize_rate(self, rate, prec=None):
 
        return rate
 
        if prec is None:
 
            prec = self.rate_prec
 
        _, digits, exponent = rate.normalize().as_tuple()
 
        # Return ``prec`` nonzero digits of precision, if available.
 
        prec -= min(0, exponent + len(digits))
 
        quant_to = '1.{}'.format('0' * prec)
 
        try:
 
            qrate = rate.quantize(decimal.Decimal(quant_to))
 
        except decimal.InvalidOperation:
 
            # The original rate doesn't have that much precision, so use it raw.
 
            qrate = rate
 
        return qrate.normalize()
 

	
 
    def format_rate(self, rate):
 
        return "{:g}".format(rate)
 
    def format_rate(self, rate, curr, fmt='{}', prec=None):
 
        rate_s = self.format_currency(
 
            self.normalize_rate(rate, prec),
 
            curr,
 
            currency_digits=False,
 
        )
 
        return fmt.format(rate_s)
 

	
 
    def format_rate_pair(self, from_curr, to_curr):
 
        from_amt = 1
 
        from_amt = decimal.Decimal(1)
 
        to_amt = self.cost_rates.convert(from_amt, from_curr, to_curr)
 
        return "{} {} = {} {}".format(
 
            self.format_rate(from_amt), from_curr,
 
            self.format_rate(to_amt), to_curr,
 
        return "{} = {}".format(
 
            self.format_rate(from_amt, from_curr),
 
            self.format_rate(to_amt, to_curr),
 
        )
...
 
@@ -83,24 +99,2 @@ class BeancountFormatter(Formatter):
 

	
 
    def normalize_rate(self, rate, prec=None):
 
        if prec is None:
 
            prec = self.rate_prec
 
        _, digits, exponent = rate.normalize().as_tuple()
 
        # Return ``prec`` nonzero digits of precision, if available.
 
        prec -= min(0, exponent + len(digits))
 
        quant_to = '1.{}'.format('0' * prec)
 
        try:
 
            qrate = rate.quantize(decimal.Decimal(quant_to))
 
        except decimal.InvalidOperation:
 
            # The original rate doesn't have that much precision, so use it raw.
 
            qrate = rate
 
        return qrate.normalize()
 

	
 
    def _pretty_rate(self, fmt, rate, curr):
 
        rate_s = self.format_currency(
 
            self.normalize_rate(rate),
 
            curr,
 
            currency_digits=False,
 
        )
 
        return fmt.format(rate_s)
 

	
 
    def format_rate_pair(self, from_curr, to_curr):
...
 
@@ -112,3 +106,3 @@ class BeancountFormatter(Formatter):
 
        else:
 
            price_s = self._pretty_rate(self.PRICE_FMT, price, to_curr)
 
            price_s = self.format_rate(price, to_curr, self.PRICE_FMT)
 
        return "{} {} {}{}".format(
...
 
@@ -116,3 +110,3 @@ class BeancountFormatter(Formatter):
 
            from_curr,
 
            self._pretty_rate(self.COST_FMT, cost, to_curr),
 
            self.format_rate(cost, to_curr, self.COST_FMT),
 
            price_s,
...
 
@@ -139,6 +133,6 @@ class BeancountFormatter(Formatter):
 
        else:
 
            price_s = self._pretty_rate(self.PRICE_FMT, price, denomination)
 
            price_s = self.format_rate(price, denomination, self.PRICE_FMT)
 
        return "{} {}{}".format(
 
            amt_s,
 
            self._pretty_rate(self.COST_FMT, cost, denomination),
 
            self.format_rate(cost, denomination, self.COST_FMT),
 
            price_s,
0 comments (0 inline, 0 general)