### Added
- Support for multiple drinks in `drunk_sum` runnable.
- Sum all the coffees by one command.
+- Get drunk sums of some *flavors* in specified time period as list.
## 0.2.1 - 2019-04-03
### Fixed
for (cnt, un) in self.cur.execute(que):
drunk.append((un, cnt))
return drunk
+
+ def getDrunkList(self, *args, **kwargs):
+ """Return dict of lists of drunken ``flavor`` from ``dtf`` to ``dtt``.
+
+ Keyword arguments:
+ flavor -- The flavor of beverage.
+ dtf -- Date and time *from*.
+ dtt -- Date and time *to*.
+ """
+ if not ((len(args) == 3 and len(kwargs) == 0) or
+ (len(args) == 0 and len(kwargs) == 3)):
+ raise ArgCountError("3 arguments needed: flavor, from, and to")
+ if args:
+ flavor = args[0]
+ dtf = args[1]
+ dtt = args[2]
+ elif kwargs:
+ flavor = kwargs["flavor"]
+ dtf = kwargs["dtf"]
+ dtt = kwargs["dtt"]
+ flavors = flavor.split(";")
+ drunk = {}
+ for f in flavors:
+ que = """
+ SELECT count(*), users.name FROM coffees
+ INNER JOIN users ON coffees.id = users.id
+ WHERE flavor = '{}'
+ AND coffees.time BETWEEN
+ datetime('{}', 'localtime') AND
+ datetime('{}', 'localtime')
+ GROUP BY coffees.id
+ """.format(f, dtf, dtt)
+ for (cnt, un) in self.cur.execute(que):
+ if not un in drunk:
+ drunk[un] = []
+ drunk[un].append(cnt)
+ return drunk
self.msg += "{}: {}\n".format(un, cnt)
self.msg += "---"
return
+
+ def loadDrunkList(self, *args, **kwargs):
+ """Get list of drunken ``flavor`` from ``dtf`` to ``dtt``, update msg.
+
+ Keyword arguments:
+ flavor -- The flavor of beverage.
+ dtf -- Date and time *from*.
+ dtt -- Date and time *to*.
+ """
+ self.top = self.db.getDrunkSum(*args, **kwargs)
+ d = self.db.getDrunkList(*args, **kwargs)
+ if args:
+ flavor = args[0]
+ dtf = args[1]
+ dtt = args[2]
+ elif kwargs:
+ flavor = kwargs["flavor"]
+ dtf = kwargs["dtf"]
+ dtt = kwargs["dtt"]
+ self.msg = "{} drunk from {} to {}:\n".format(flavor, dtf, dtt)
+ for (un, l) in d.items():
+ self.msg += "{}: ".format(un)
+ for cnt in l[:-1]:
+ self.msg += "{}, ".format(cnt)
+ self.msg += "{}\n".format(l[-1])
+ self.msg += "---"
+ return
))
exit(1)
g = CoffeebotGetter()
- if argv[1] in SS:
+ if ";" in argv[1]:
+ g.loadDrunkList(argv[1], argv[2], argv[3])
+ elif argv[1] in SS:
g.loadDrunkSum(SS[argv[1]], argv[2], argv[3])
else:
g.loadDrunkSum(argv[1], argv[2], argv[3])
('3333', 'espresso lungo', datetime('now', 'localtime', '-99 seconds')),
('3333', 'Club-Mate 0,33 l', datetime('now', 'localtime', '-99 seconds')),
('3333', 'espresso lungo', datetime('now', 'localtime', '-95 second')),
+('3333', 'Club-Mate 0,5 l', datetime('now', 'localtime', '-95 second')),
('3333', 'Club-Mate 0,33 l', datetime('now', 'localtime', '-95 second'));
""")
con.close()
top,
[
("tester", 4*0.5 + 4*0.33),
+ ("clone", 0.5 + 2*0.33),
("newer", 2*0.33),
- ("clone", 2*0.33),
]
)
finally:
drunk = db.getDrunkSum("Club-Mate 0,5 l", self.lwstr, self.tdystr)
self.assertEqual(drunk, [
("tester", 4),
+ ("clone", 1),
])
finally:
delete_test_db(TESTDB_FILENAME)
self.assertEqual(drunk, [
("tester", 8),
("newer", 2),
- ("clone", 2),
+ ("clone", 3),
])
finally:
delete_test_db(TESTDB_FILENAME)
+
+ def test_all_mate_list(self):
+ create_test_db(TESTDB_FILENAME)
+ try:
+ db = Db(TESTDB_FILENAME)
+ drunk = db.getDrunkList(
+ "Club-Mate 0,5 l;Club-Mate 0,33 l",
+ self.lwstr,
+ self.tdystr
+ )
+ self.assertEqual(drunk, {
+ "tester": [4, 4],
+ "newer": [2],
+ "clone": [1, 2],
+ })
+ finally:
+ delete_test_db(TESTDB_FILENAME)
g.loadDrunkSum,
["espresso", "lungo", "2010-10-20", "2020-10-20"]
)
+
+class DrunkList(TestCase):
+ def test_nof_args(self):
+ g = CoffeebotGetter()
+ self.assertRaises(ArgCountError, g.loadDrunkList)
+ self.assertRaises(ArgCountError, g.loadDrunkList, ["espresso"])
+ self.assertRaises(
+ ArgCountError,
+ g.loadDrunkList,
+ ["espresso", "2010-10-20"]
+ )
+ self.assertRaises(
+ ArgCountError,
+ g.loadDrunkList,
+ ["espresso", "lungo", "2010-10-20", "2020-10-20"]
+ )