diff --git a/BaseConverter.py b/BaseConverter.py index fa2306fb..a37b4172 100644 --- a/BaseConverter.py +++ b/BaseConverter.py @@ -2,36 +2,60 @@ """Convert representations of numbers. Usage: base -Example: base 10 16 1234567890""" + Or: [padding] +Examples: base 10 16 1234567890 + dec 1024 + hex 5f 8""" from albertv0 import * import numpy as np __iid__ = "PythonInterface/v0.1" __prettyname__ = "Base Converter" -__version__ = "1.0" +__version__ = "1.1" __trigger__ = "base " __author__ = "Manuel Schneider" __dependencies__ = ["numpy"] +base_keywords = {"bin": 2, "oct": 8, "dec": 10, "hex": 16} + +def buildItem(completion, src, dst, number, padding=0): + item = Item(id=__prettyname__, completion=completion) + try: + src = int(src) + dst = int(dst) + padding = int(padding) + integer = int(number, src) + item.text = np.base_repr(integer, dst) + if integer >= 0 and len(item.text) < padding: + item.text = '0'*(padding-len(item.text)) + item.text + item.subtext = "Base %s representation of %s (base %s)" % (dst, number, src) + item.addAction(ClipAction("Copy to clipboard", item.text)) + except Exception as e: + item.text = e.__class__.__name__ + item.subtext = str(e) + return item def handleQuery(query): if query.isTriggered: fields = query.string.split() - item = Item(id=__prettyname__, completion=query.rawString) if len(fields) == 3: - try: - src = int(fields[0]) - dst = int(fields[1]) - number = fields[2] - item.text = np.base_repr(int(number, src), dst) - item.subtext = "Base %s representation of %s (base %s)" % (dst, number, src) - item.addAction(ClipAction("Copy to clipboard", item.text)) - except Exception as e: - item.text = e.__class__.__name__ - item.subtext = str(e) - return item + return buildItem(query.rawString, fields[0], fields[1], fields[2]) else: + item = Item(id=__prettyname__, completion=query.rawString) item.text = __prettyname__ item.subtext = "Enter a query in the form of \"<srcbase> <dstbase> <number>\"" return item + else: + fields = query.string.split() + if len(fields) < 2 or fields[0] not in base_keywords: + return + src = base_keywords[fields[0]] + number = fields[1] + padding = 0 if len(fields) < 3 else fields[2] + results = [] + for dst in sorted(base_keywords.values()): + if dst == src: + continue + results.append(buildItem(query.rawString, src, dst, number, padding)) + return results diff --git a/Currency.py b/Currency.py index 8fbb8d7f..433db62c 100644 --- a/Currency.py +++ b/Currency.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- """Convert currencies. - Synopsis: [to|as|in] """ +import json import re import time from urllib.request import urlopen @@ -63,8 +63,21 @@ def convert(self, amount, src, dst): if m: return m.group(1) +class CurrencyConverterApi: + + def __init__(self): + self.name = "Currency Converter API" + + def convert(self, amount, src, dst): + currency = '%s_%s' % (src, dst) + url = 'http://free.currencyconverterapi.com/api/v5/convert?q=%s&compact=y' % (currency) + with urlopen(url) as response: + value = response.read().decode() + result = json.loads(value) + rate = result[currency]['val'] + return str(amount * float(rate)) -providers = [EuropeanCentralBank(), Yahoo()] +providers = [EuropeanCentralBank(), CurrencyConverterApi(), Yahoo()] regex = re.compile(r"(\d+\.?\d*)\s+(\w{3})(?:\s+(?:to|in|as))?\s+(\w{3})") def handleQuery(query):