commit
67037cf485
|
@ -10,44 +10,34 @@ http://inamidst.com/phenny/
|
||||||
|
|
||||||
import re
|
import re
|
||||||
import web
|
import web
|
||||||
from modules.search import generic_google
|
from modules.search import newton_api
|
||||||
|
|
||||||
subs = [
|
operations = {'simplify', 'factor', 'derive', 'integrate', 'zeroes', 'tangent',
|
||||||
('£', 'GBP '),
|
'area', 'cos', 'sin', 'tan', 'arccos', 'arcsin', 'arctan', 'abs', 'log'}
|
||||||
('€', 'EUR '),
|
|
||||||
('\$', 'USD '),
|
|
||||||
(r'\n', '; '),
|
|
||||||
('°', '°'),
|
|
||||||
(r'\/', '/'),
|
|
||||||
]
|
|
||||||
|
|
||||||
r_google_calc = re.compile(r'calculator-40.gif.*? = (.*?)<')
|
|
||||||
r_google_calc_exp = re.compile(r'calculator-40.gif.*? = (.*?)<sup>(.*?)</sup></h2>')
|
|
||||||
|
|
||||||
def c(phenny, input):
|
def c(phenny, input):
|
||||||
"""Google calculator."""
|
"""Newton calculator."""
|
||||||
if not input.group(2):
|
if not input.group(2):
|
||||||
return phenny.reply("Nothing to calculate.")
|
return phenny.reply("Nothing to calculate.")
|
||||||
q = input.group(2)
|
q = input.group(2)
|
||||||
bytes = generic_google(q)
|
q = q.split(' ', 1)
|
||||||
m = r_google_calc_exp.search(bytes)
|
|
||||||
if not m:
|
|
||||||
m = r_google_calc.search(bytes)
|
|
||||||
|
|
||||||
if not m:
|
if len(q) > 1 and q[0] in operations:
|
||||||
num = None
|
operation = q[0]
|
||||||
elif m.lastindex == 1:
|
expression = q[1]
|
||||||
num = web.decode(m.group(1))
|
elif len(q) > 0:
|
||||||
else:
|
operation = 'simplify'
|
||||||
num = "^".join((web.decode(m.group(1)), web.decode(m.group(2))))
|
expression = q[0]
|
||||||
|
|
||||||
if num:
|
result = newton_api(operation, expression)
|
||||||
num = num.replace('×', '*')
|
|
||||||
phenny.say(num)
|
if result:
|
||||||
|
phenny.say(result)
|
||||||
else:
|
else:
|
||||||
phenny.reply("Sorry, no result.")
|
phenny.reply("Sorry, no result.")
|
||||||
c.commands = ['c']
|
c.commands = ['c']
|
||||||
c.example = '.c 5 + 3'
|
c.example = '.c 5 + 3'
|
||||||
|
c.example = '.c integrate 1/3 x^3 + x^2 + C'
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
|
@ -162,6 +162,15 @@ def duck(phenny, input):
|
||||||
duck.commands = ['duck', 'ddg']
|
duck.commands = ['duck', 'ddg']
|
||||||
duck.example = '.duck football'
|
duck.example = '.duck football'
|
||||||
|
|
||||||
|
def newton_api(operation, expression):
|
||||||
|
expression = web.quote(expression, safe='')
|
||||||
|
uri = "https://newton.now.sh/{}/{}".format(operation, expression)
|
||||||
|
bytes = web.get(uri)
|
||||||
|
json = web.json(bytes)
|
||||||
|
if 'result' in json:
|
||||||
|
return str(json['result'])
|
||||||
|
return None
|
||||||
|
|
||||||
def search(phenny, input):
|
def search(phenny, input):
|
||||||
if not input.group(2):
|
if not input.group(2):
|
||||||
return phenny.reply('.search for what?')
|
return phenny.reply('.search for what?')
|
||||||
|
|
|
@ -19,26 +19,98 @@ class TestCalc(unittest.TestCase):
|
||||||
|
|
||||||
self.phenny.say.assert_called_once_with('25')
|
self.phenny.say.assert_called_once_with('25')
|
||||||
|
|
||||||
def test_c_sqrt(self):
|
def test_c_simplify(self):
|
||||||
input = Mock(group=lambda x: '4^(1/2)')
|
input = Mock(group=lambda x: 'simplify 2^2+2(2)')
|
||||||
c(self.phenny, input)
|
c(self.phenny, input)
|
||||||
|
|
||||||
self.phenny.say.assert_called_once_with('2')
|
self.phenny.say.assert_called_once_with('8')
|
||||||
|
|
||||||
def test_c_scientific(self):
|
def test_c_factor(self):
|
||||||
input = Mock(group=lambda x: '2^64')
|
input = Mock(group=lambda x: 'factor x^2 + 2x')
|
||||||
c(self.phenny, input)
|
c(self.phenny, input)
|
||||||
|
|
||||||
self.phenny.say.assert_called_once_with('1.84467441 * 10^19')
|
self.phenny.say.assert_called_once_with('x (x + 2)')
|
||||||
|
|
||||||
|
def test_c_derive(self):
|
||||||
|
input = Mock(group=lambda x: 'derive x^2+2x')
|
||||||
|
c(self.phenny, input)
|
||||||
|
|
||||||
|
self.phenny.say.assert_called_once_with('2 x + 2')
|
||||||
|
|
||||||
|
def test_c_integrate(self):
|
||||||
|
input = Mock(group=lambda x: 'integrate x^2+2x')
|
||||||
|
c(self.phenny, input)
|
||||||
|
|
||||||
|
self.phenny.say.assert_called_once_with('1/3 x^3 + x^2')
|
||||||
|
|
||||||
|
def test_c_zeroes(self):
|
||||||
|
input = Mock(group=lambda x: 'zeroes x^2+2x')
|
||||||
|
c(self.phenny, input)
|
||||||
|
|
||||||
|
self.phenny.say.assert_called_once_with('[-2, 0]')
|
||||||
|
|
||||||
|
def test_c_tangent(self):
|
||||||
|
input = Mock(group=lambda x: 'tangent 2|x^3')
|
||||||
|
c(self.phenny, input)
|
||||||
|
|
||||||
|
self.phenny.say.assert_called_once_with('12 x + -16')
|
||||||
|
|
||||||
|
def test_c_area(self):
|
||||||
|
input = Mock(group=lambda x: 'area 2:4|x^3')
|
||||||
|
c(self.phenny, input)
|
||||||
|
|
||||||
|
self.phenny.say.assert_called_once_with('60')
|
||||||
|
|
||||||
|
def test_c_cos(self):
|
||||||
|
input = Mock(group=lambda x: 'cos pi')
|
||||||
|
c(self.phenny, input)
|
||||||
|
|
||||||
|
self.phenny.say.assert_called_once_with('-1')
|
||||||
|
|
||||||
|
def test_c_sin(self):
|
||||||
|
input = Mock(group=lambda x: 'sin 0')
|
||||||
|
c(self.phenny, input)
|
||||||
|
|
||||||
|
self.phenny.say.assert_called_once_with('0')
|
||||||
|
|
||||||
|
def test_c_tan(self):
|
||||||
|
input = Mock(group=lambda x: 'tan .03')
|
||||||
|
c(self.phenny, input)
|
||||||
|
|
||||||
|
self.phenny.say.assert_called_once_with('0.030009')
|
||||||
|
|
||||||
|
def test_c_arccos(self):
|
||||||
|
input = Mock(group=lambda x: 'arccos 1')
|
||||||
|
c(self.phenny, input)
|
||||||
|
|
||||||
|
self.phenny.say.assert_called_once_with('0')
|
||||||
|
|
||||||
|
def test_c_arcsin(self):
|
||||||
|
input = Mock(group=lambda x: 'arcsin .04')
|
||||||
|
c(self.phenny, input)
|
||||||
|
|
||||||
|
self.phenny.say.assert_called_once_with('0.0400107')
|
||||||
|
|
||||||
|
def test_c_arctan(self):
|
||||||
|
input = Mock(group=lambda x: 'arctan 1')
|
||||||
|
c(self.phenny, input)
|
||||||
|
|
||||||
|
self.phenny.say.assert_called_once_with('1/2 pi')
|
||||||
|
|
||||||
|
def test_c_abs(self):
|
||||||
|
input = Mock(group=lambda x: 'abs -3')
|
||||||
|
c(self.phenny, input)
|
||||||
|
|
||||||
|
self.phenny.say.assert_called_once_with('3')
|
||||||
|
|
||||||
|
def test_c_log(self):
|
||||||
|
input = Mock(group=lambda x: 'log 2|8')
|
||||||
|
c(self.phenny, input)
|
||||||
|
|
||||||
|
self.phenny.say.assert_called_once_with('3')
|
||||||
|
|
||||||
def test_c_none(self):
|
def test_c_none(self):
|
||||||
input = Mock(group=lambda x: 'aif')
|
input = Mock(group=lambda x: 'tangent 2lx^3')
|
||||||
c(self.phenny, input)
|
c(self.phenny, input)
|
||||||
|
|
||||||
self.phenny.reply.assert_called_once_with('Sorry, no result.')
|
self.phenny.reply.assert_called_once_with('Sorry, no result.')
|
||||||
|
|
||||||
def test_c_quirk(self):
|
|
||||||
input = Mock(group=lambda x: '24/50')
|
|
||||||
c(self.phenny, input)
|
|
||||||
|
|
||||||
self.phenny.say.assert_called_once_with('0.48')
|
|
||||||
|
|
Loading…
Reference in New Issue