diff --git a/db/__init__.py b/db/__init__.py index ab8461b..8ebf657 100644 --- a/db/__init__.py +++ b/db/__init__.py @@ -15,9 +15,10 @@ from . import artist from . import album from . import disc from . import genre +from . import decade def reset(): - mods = [ artist, album, disc, genre ] + mods = [ artist, album, disc, genre, decade ] for mod in mods: mod.Table.drop() for mod in mods: mod.Table.do_create() diff --git a/db/decade.py b/db/decade.py new file mode 100644 index 0000000..4ad00bb --- /dev/null +++ b/db/decade.py @@ -0,0 +1,50 @@ +# Copyright 2021 (c) Anna Schumaker. +# +# Table: decades +# +----------+--------+ +# | decadeid | decade | +# +----------+--------+ +from gi.repository import GObject +from . import execute +from . import objects + +class Decade(objects.Row): + def __gt__(self, rhs): return self.decade > rhs.decade + def __lt__(self, rhs): return self.decade < rhs.decade + def __str__(self): return f"{self.decade}s" + + def do_get_column(self, column): + return execute(f"SELECT {column} FROM decades " + "WHERE decadeid=?", [ self.rowid ]) + + @GObject.Property + def decade(self): + return self.get_column("decade") + + +class DecadeTable(objects.Table): + def __init__(self): + objects.Table.__init__(self, "decades", Decade) + + def do_create(self): + execute("CREATE TABLE IF NOT EXISTS decades " + "(decadeid INTEGER PRIMARY KEY, " + " decade INTEGER UNIQUE)") + + def do_insert(self, decade): + return execute("INSERT INTO decades (decade) " + "VALUES (?)", (decade,)) + + def do_delete(self, decade): + return execute("DELETE FROM decades WHERE decadeid=?", [ int(decade) ]) + + def do_get(self, rowid): + return execute("SELECT decadeid FROM decades " + "WHERE decadeid=?", [ rowid ]) + + def do_lookup(self, decade): + return execute("SELECT decadeid FROM decades " + "WHERE decade=?", [ decade ]) + + +Table = DecadeTable() diff --git a/db/test_decade.py b/db/test_decade.py new file mode 100644 index 0000000..893d765 --- /dev/null +++ b/db/test_decade.py @@ -0,0 +1,51 @@ +# Copyright 2021 (c) Anna Schumaker. +import db +import sqlite3 +import unittest +from gi.repository import GObject + + +class TestDecadeTable(unittest.TestCase): + def setUp(self): + db.reset() + + def test_decade_table_init(self): + self.assertIsInstance(db.decade.Table, db.decade.DecadeTable) + db.execute("SELECT decadeid,decade FROM decades") + + def test_decade_table_insert(self): + decade = db.decade.Table.insert(2020) + + self.assertIsInstance(decade, db.decade.Decade) + self.assertIsInstance(decade, db.objects.Row) + + self.assertEqual(decade.decade, 2020) + self.assertEqual(str(decade), "2020s") + + with self.assertRaises(sqlite3.IntegrityError): + db.decade.Table.insert(2020) + + def test_decade_table_delete(self): + decade = db.decade.Table.find(2020) + db.decade.Table.delete(decade) + self.assertIsNone(db.decade.Table.lookup(2020)) + + def test_decade_table_get(self): + decade = db.decade.Table.insert(2020) + self.assertEqual(db.decade.Table.get(1), decade) + self.assertIsNone(db.decade.Table.get(2)) + + def test_decade_table_lookup(self): + decade = db.decade.Table.insert(2020) + self.assertEqual(db.decade.Table.lookup(2020), decade) + self.assertIsNone(db.decade.Table.lookup(2021)) + + def test_decade_compare(self): + d2010 = db.decade.Table.insert(2010) + d2020 = db.decade.Table.insert(2020) + + self.assertTrue(d2010 < d2020) + self.assertTrue(d2020 > d2010) + + self.assertFalse(d2010 > d2020) + self.assertFalse(d2020 < d2010)