class CurrenciesIdentificatorTest(unittest.TestCase):
    def setUp(self):
        self.identificator = CurrencySymbolCodeIdentificator()

    def test(self):
        self.existingSymbol("$", "USD")
        self.existingSymbol("£", "GBP")
        self.existingSymbol("CA$", "CAD")

    def existingSymbol(self, symbol, code):
        self.assertEqual(code, self.identificator.translateToCode(symbol))
class CurrenciesIdentificatorTest(unittest.TestCase):

    def setUp(self):
        self.identificator = CurrencySymbolCodeIdentificator()
    
    def test(self):        
        self.existingSymbol("$", "USD")
        self.existingSymbol("£", "GBP")
        self.existingSymbol("CA$", "CAD")

    def existingSymbol(self, symbol, code):
        self.assertEqual(code, self.identificator.translateToCode(symbol))
Exemple #3
0
 def __init__(self, useCache=True, showDiagnosticData=False):
     self.useCache = useCache
     self.showDiagnosticData = showDiagnosticData
     self.availableCurrencies = getAvailableCurrencies()
     self.symbolTranslator = CurrencySymbolCodeIdentificator()
Exemple #4
0
class CurrencyConverter:
    def __init__(self, useCache=True, showDiagnosticData=False):
        self.useCache = useCache
        self.showDiagnosticData = showDiagnosticData
        self.availableCurrencies = getAvailableCurrencies()
        self.symbolTranslator = CurrencySymbolCodeIdentificator()

    def convertIntoJson(self, inputCurrency, outputCurrencies, value):
        startTime = time.time()

        inputCurrency = self._translateInputCurrencyIntoValidCode(
            inputCurrency)
        outputCurrencies = self._translateOutputCurrenciesIntoValidCode(
            outputCurrencies)
        rates, cachedData = self._getRates(inputCurrency, outputCurrencies)

        executionTime = time.time() - startTime
        diagnostic = self._createDiagnosticData(cachedData, executionTime)

        jsonResult = self._createJsonFromRates(inputCurrency, rates, value,
                                               diagnostic)
        return jsonResult

    def _getRates(self, inputCurrency, outputCurrencies):
        rates = None
        if self.useCache:
            cachedData = True
            rates = self._tryGetRatesFromCache(inputCurrency, outputCurrencies)
        if rates == None:
            cachedData = False
            rates = self._getExchangeRatesFromWebService(
                inputCurrency, outputCurrencies)
        return rates, cachedData

    def _getExchangeRatesFromWebService(self, inputCurrency, outputCurrencies):
        rates = getExchangeRatesFromWebService(inputCurrency, outputCurrencies)
        if self.useCache:
            writeRatesIntoCache(inputCurrency, rates)
        return rates

    def _createJsonFromRates(self, inputCurrency, rates, value,
                             diagnosticData):
        result = {}

        if diagnosticData != None:
            result["diagnostic"] = diagnosticData

        result["input"] = {"amount": value, "currency": inputCurrency}
        result["output"] = {}
        for rate, converted in self._convertEach(rates, value):
            result["output"][rate.outputCurrency] = converted
        return result

    def _createDiagnosticData(self, cachedData, executionTime):
        if self.showDiagnosticData:
            return {"cachedData": cachedData, "executionTime": executionTime}
        return None

    def _convertEach(self, rates, value):
        for rate in rates:
            yield rate, rate.convert(value)

    def _tryGetRatesFromCache(self, inputCurrency, outputCurrencies):
        try:
            rates = tryGetRatesFromCache(inputCurrency, outputCurrencies)
            return rates
        except NotInCacheError as e:
            return None

    def _translateOutputCurrenciesIntoValidCode(self, currency):
        if currency != None:
            currency = [self._processCurrencyInput(currency)]
        else:
            currency = self.availableCurrencies
        return currency

    def _translateInputCurrencyIntoValidCode(self, currency):
        return self._processCurrencyInput(currency)

    def _processCurrencyInput(self, currencyInput):
        if currencyInput in self.availableCurrencies:
            return currencyInput
        currencyCode = self.symbolTranslator.translateToCode(currencyInput)
        if currencyCode == None:
            raise InvalidCurrency(currencyInput)
        return currencyCode
 def setUp(self):
     self.identificator = CurrencySymbolCodeIdentificator()
 def __init__(self, useCache = True, showDiagnosticData = False):    
     self.useCache = useCache
     self.showDiagnosticData = showDiagnosticData
     self.availableCurrencies = getAvailableCurrencies()
     self.symbolTranslator = CurrencySymbolCodeIdentificator()   
class CurrencyConverter:
    
    def __init__(self, useCache = True, showDiagnosticData = False):    
        self.useCache = useCache
        self.showDiagnosticData = showDiagnosticData
        self.availableCurrencies = getAvailableCurrencies()
        self.symbolTranslator = CurrencySymbolCodeIdentificator()   

    def convertIntoJson(self, inputCurrency, outputCurrencies, value):
        startTime = time.time()

        inputCurrency = self._translateInputCurrencyIntoValidCode(inputCurrency)
        outputCurrencies = self._translateOutputCurrenciesIntoValidCode(outputCurrencies)       
        rates, cachedData = self._getRates(inputCurrency, outputCurrencies)

        executionTime = time.time() - startTime
        diagnostic = self._createDiagnosticData(cachedData, executionTime)
        
        jsonResult = self._createJsonFromRates(inputCurrency, rates, value, diagnostic)
        return jsonResult

    def _getRates(self, inputCurrency, outputCurrencies):
        rates = None
        if self.useCache:
            cachedData = True
            rates = self._tryGetRatesFromCache(inputCurrency, outputCurrencies)
        if rates == None:
            cachedData = False
            rates = self._getExchangeRatesFromWebService(inputCurrency, outputCurrencies)
        return rates, cachedData

    def _getExchangeRatesFromWebService(self, inputCurrency, outputCurrencies):
        rates = getExchangeRatesFromWebService(inputCurrency, outputCurrencies)
        if self.useCache:
            writeRatesIntoCache(inputCurrency, rates)
        return rates

    def _createJsonFromRates(self, inputCurrency, rates, value, diagnosticData):
        result = {}

        if diagnosticData != None:
            result["diagnostic"] = diagnosticData
       
        result["input"] = {"amount": value, "currency": inputCurrency}
        result["output"] = {}
        for rate, converted in self._convertEach(rates, value):
            result["output"][rate.outputCurrency] = converted
        return result

    def _createDiagnosticData(self, cachedData, executionTime):
        if self.showDiagnosticData:
            return {
                "cachedData" : cachedData,
                "executionTime" : executionTime
            }
        return None

    def _convertEach(self, rates, value):
        for rate in rates:
            yield rate, rate.convert(value)

    def _tryGetRatesFromCache(self, inputCurrency, outputCurrencies):
        try:
            rates = tryGetRatesFromCache(inputCurrency, outputCurrencies)
            return rates
        except NotInCacheError as e:
            return None                  
 
    def _translateOutputCurrenciesIntoValidCode(self, currency):
        if currency != None:
            currency = [self._processCurrencyInput(currency)]
        else:
            currency = self.availableCurrencies
        return currency

    def _translateInputCurrencyIntoValidCode(self, currency):
        return self._processCurrencyInput(currency)

    def _processCurrencyInput(self, currencyInput):
        if currencyInput in self.availableCurrencies:
            return currencyInput
        currencyCode = self.symbolTranslator.translateToCode(currencyInput)
        if currencyCode == None:
            raise InvalidCurrency(currencyInput)
        return currencyCode