From: Jiri Vlasak Date: Thu, 4 Apr 2019 06:18:01 +0000 (+0200) Subject: Merge branch 'feature/drunk-list' X-Git-Tag: v0.3.0~2 X-Git-Url: http://rtime.felk.cvut.cz/gitweb/hubacji1/coffee-getter.git/commitdiff_plain/17d805781dba915519d16b0a1678dce37ef62656?hp=b7625279cf05c82c3b22fd25fcff533474330ff4 Merge branch 'feature/drunk-list' --- diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a47cd6..75df204 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ The format is based on [Keep a Changelog][] and this project adheres to ### 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 diff --git a/cbdb.py b/cbdb.py index 9cf9f7c..c4741e0 100644 --- a/cbdb.py +++ b/cbdb.py @@ -95,3 +95,40 @@ class Db: 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 diff --git a/cbgetter.py b/cbgetter.py index fce31bf..b837f89 100644 --- a/cbgetter.py +++ b/cbgetter.py @@ -131,3 +131,30 @@ class CoffeebotGetter: 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 diff --git a/run/drunk_sum.py b/run/drunk_sum.py index ef683fc..44da8e7 100755 --- a/run/drunk_sum.py +++ b/run/drunk_sum.py @@ -23,7 +23,9 @@ if __name__ == "__main__": )) 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]) diff --git a/ut/test_db.py b/ut/test_db.py index 17dc3e9..f059c2b 100644 --- a/ut/test_db.py +++ b/ut/test_db.py @@ -75,6 +75,7 @@ INSERT INTO coffees (id, flavor, time) VALUES ('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() @@ -113,8 +114,8 @@ class TopMateDrinkers(TestCase): top, [ ("tester", 4*0.5 + 4*0.33), + ("clone", 0.5 + 2*0.33), ("newer", 2*0.33), - ("clone", 2*0.33), ] ) finally: @@ -211,6 +212,7 @@ class DrunkSum(TestCase): 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) @@ -243,7 +245,24 @@ class DrunkSum(TestCase): 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) diff --git a/ut/test_getter.py b/ut/test_getter.py index 1d61f7d..0324dab 100644 --- a/ut/test_getter.py +++ b/ut/test_getter.py @@ -86,3 +86,19 @@ class DrunkSum(TestCase): 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"] + )