From eadac43aad616839f56067e278ac586fa940d558 Mon Sep 17 00:00:00 2001 From: Marcello Stanisci Date: Tue, 5 Feb 2019 15:32:56 +0100 Subject: Hot-addressing #5542. --- talerbank/app/amount.py | 61 ++++++++++++++++++++----------------------------- 1 file changed, 25 insertions(+), 36 deletions(-) (limited to 'talerbank/app/amount.py') diff --git a/talerbank/app/amount.py b/talerbank/app/amount.py index 458fdea..959dab4 100644 --- a/talerbank/app/amount.py +++ b/talerbank/app/amount.py @@ -5,23 +5,25 @@ # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. +# version 2.1 of the License, or (at your option) any later +# version. # # This library 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 -# Lesser General Public License for more details. +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# License along with this library; if not, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301 USA # # @author Marcello Stanisci # @version 0.1 # @repository https://git.taler.net/copylib.git/ # This code is "copylib", it is versioned under the Git repository -# mentioned above, and it is meant to be manually copied into any project -# which might need it. +# mentioned above, and it is meant to be manually copied into +# any project which might need it. ## @@ -41,26 +43,6 @@ class CurrencyMismatch(Exception): super(CurrencyMismatch, self).__init__( "%s vs %s" % (curr1, curr2)) - -## -# Exception class to raise when an amount object -# is getting a value "too big"; the threshold here is -# the maximum value that the wallet can handle, which -# is 2^53 - 1. -class AmountOverflow(Exception): - hint = "Overflowing amount" - - ## - # Init constructor. - # - # @param self the object itself - # @param part whether the exception occurred in a 'value' - # or in a 'fraction' part of an amount. - def __init__(self, part) -> None: - super(BadFormatAmount, self).__init__( - "This part exceedes 2^53 -1: " + part) - - ## # Exception class to raise when a amount string is not valid. class BadFormatAmount(Exception): @@ -75,9 +57,18 @@ class BadFormatAmount(Exception): super(BadFormatAmount, self).__init__( "Bad format amount: " + faulty_str) - ## # Main Amount class. +class NumberTooBig(Exception): + def __init__(self) -> None: + super(BadFormatAmount, self).__init__( + "Number given is too big!") + +class NegativeNumber(Exception): + def __init__(self) -> None: + super(BadFormatAmount, self).__init__( + "Negative number given as value and/or fraction!") + class Amount: ## # How many "fraction" units make one "value" unit of currency @@ -102,17 +93,14 @@ class Amount: # @param value integer part the amount # @param fraction fractional part of the amount def __init__(self, currency, value=0, fraction=0) -> None: - - # NOTE: the following, not-so-good, assertions got - # eliminated in the _stable_ branch due to a recent - # hot-fix. So this file is going to have to be manually - # deconflicted. - assert value >= 0 and fraction >= 0 + if value < 0 or fraction < 0: + raise NegativeNumber() self.value = value self.fraction = fraction self.currency = currency self.__normalize() - assert self.value <= Amount._max_value() + if self.value > Amount._max_value(): + raise NumberTooBig() ## # Normalize amount. It means it makes sure that the @@ -241,7 +229,8 @@ class Amount: # @param pretty if True, put the currency in the last position and # omit the colon. def stringify(self, ndigits: int, pretty=False) -> str: - assert ndigits > 0 + if ndigits <= 0: + raise BadFormatAmount("ndigits must be > 0") tmp = self.fraction fraction_str = "" while ndigits > 0: -- cgit v1.2.3