diff --git a/audio/menu.py b/audio/menu.py index ff0fbd3..bce9c73 100644 --- a/audio/menu.py +++ b/audio/menu.py @@ -1,7 +1,7 @@ # Copyright 2021 (c) Anna Schumaker. from lib import settings from gi.repository import Gtk -import trackdb +import tagdb class Button(Gtk.MenuButton): def __init__(self): @@ -13,7 +13,7 @@ class Button(Gtk.MenuButton): self.pause = Gtk.Image.new_from_icon_name("media-playback-start") self.counter = Gtk.Scale() - self.counter.set_adjustment(trackdb.Stack.Counter) + self.counter.set_adjustment(tagdb.Stack.Counter) self.counter.connect("value-changed", self.on_counter_changed) self.counter.set_format_value_func(self.format_counter) self.counter.set_digits(0) diff --git a/audio/player.py b/audio/player.py index bb314bb..0ba2cf0 100644 --- a/audio/player.py +++ b/audio/player.py @@ -6,7 +6,7 @@ from . import seeker from lib import publisher from lib import settings from gi.repository import Gst, GLib -import trackdb +import tagdb class Player: def __init__(self): @@ -36,7 +36,7 @@ class Player: GLib.timeout_add(250, self.update_progress) self.TrackChanged = publisher.Publisher() - self.track = trackdb.Tracks[settings.get_int("audio.trackid")] + self.track = tagdb.Tracks[settings.get_int("audio.trackid")] self.load_set_state(self.track, Gst.State.PAUSED) if self.track: self.track.add_to_playlist("Previous") @@ -72,7 +72,7 @@ class Player: if duration > 0 and (self.runtime() / duration) > (2 / 3): self.track.played() - (track, cont) = trackdb.Stack.next() + (track, cont) = tagdb.Stack.next() state = Gst.State.PLAYING if cont else Gst.State.PAUSED self.load_set_state(track, state) @@ -111,7 +111,7 @@ class Player: return pos if res == True else 0 def previous(self, *args): - self.play_track(trackdb.Stack.previous()) + self.play_track(tagdb.Stack.previous()) def runtime(self): if self.playbin.clock == None: diff --git a/audio/test_menu.py b/audio/test_menu.py index f5f54a3..a15765e 100644 --- a/audio/test_menu.py +++ b/audio/test_menu.py @@ -2,7 +2,7 @@ from . import menu from lib import settings from gi.repository import Gtk -import trackdb +import tagdb import unittest class TestAudioMenu(unittest.TestCase): @@ -41,7 +41,7 @@ class TestAudioMenu(unittest.TestCase): self.assertEqual(button.pause.get_icon_name(), "media-playback-start") self.assertEqual(button.count.get_text(), " ") self.assertEqual(button.count.get_yalign(), 0) - self.assertEqual(button.counter.get_adjustment(), trackdb.Stack.Counter) + self.assertEqual(button.counter.get_adjustment(), tagdb.Stack.Counter) self.assertEqual(button.counter.get_digits(), 0) self.assertTrue(button.counter.get_draw_value()) @@ -57,11 +57,11 @@ class TestAudioMenu(unittest.TestCase): self.assertEqual(button.format_counter(button.counter, 1), "Next Track") self.assertEqual(button.format_counter(button.counter, 2), "2 Tracks") - trackdb.Stack.Counter.increment() + tagdb.Stack.Counter.increment() self.assertEqual(button.pause.get_icon_name(), "media-playback-pause") self.assertEqual(button.count.get_text(), "0") - trackdb.Stack.Counter.decrement() + tagdb.Stack.Counter.decrement() self.assertEqual(button.pause.get_icon_name(), "media-playback-start") self.assertEqual(button.count.get_text(), " ") diff --git a/audio/test_player.py b/audio/test_player.py index e3920ec..8f91329 100644 --- a/audio/test_player.py +++ b/audio/test_player.py @@ -8,7 +8,7 @@ from lib import publisher from lib import settings from gi.repository import Gst import pathlib -import trackdb +import tagdb import unittest test_album = pathlib.Path("./data/Test Album/") @@ -17,18 +17,18 @@ test_track = test_album / "01 - Test Track.ogg" class TestPlayer(unittest.TestCase): def setUpClass(): - trackdb.reset() - lib = trackdb.Library.add(test_album) + tagdb.reset() + lib = tagdb.Library.add(test_album) lib.scan().join() def setUp(self): self.changed = None settings.reset() - self.library = trackdb.Library.store[test_album] + self.library = tagdb.Library.store[test_album] self.track = [ t for t in self.library.tracks if t.tracknumber == 1 ][0] def tearDownClass(): - trackdb.reset() + tagdb.reset() def on_track_changed(self, prev, new): self.changed = (prev, new) @@ -63,10 +63,10 @@ class TestPlayer(unittest.TestCase): self.assertEqual(self.changed, (None, self.track) ) self.assertFalse(play.play_track(self.track)) - trackdb.tags.User["Previous"].tracks.clear() + tagdb.tags.User["Previous"].tracks.clear() play2 = player.Player() self.assertEqual(play2.track, self.track) - self.assertIn(self.track, trackdb.tags.User["Previous"].tracks) + self.assertIn(self.track, tagdb.tags.User["Previous"].tracks) def test_player_play_pause(self): play = player.Player() @@ -90,12 +90,12 @@ class TestPlayer(unittest.TestCase): play.next() self.assertEqual(play.track.trackid, 0) - self.assertEqual(self.changed, (None, trackdb.Tracks[0]) ) + self.assertEqual(self.changed, (None, tagdb.Tracks[0]) ) play.next() self.assertEqual(play.track.trackid, 1) - self.assertEqual(self.changed, (trackdb.Tracks[0], trackdb.Tracks[1]) ) + self.assertEqual(self.changed, (tagdb.Tracks[0], tagdb.Tracks[1]) ) play.previous() self.assertEqual(play.track.trackid, 0) - self.assertEqual(self.changed, (trackdb.Tracks[1], trackdb.Tracks[0]) ) + self.assertEqual(self.changed, (tagdb.Tracks[1], tagdb.Tracks[0]) ) diff --git a/emmental.py b/emmental.py index 9dfec62..46a0ec1 100755 --- a/emmental.py +++ b/emmental.py @@ -5,9 +5,9 @@ gi.require_version('Gtk', '4.0') gi.require_version('Gst', '1.0') import lib -import trackdb +import tagdb lib.settings.load() -trackdb.load() +tagdb.load() import ui ui.Application.run() diff --git a/playlist/__init__.py b/playlist/__init__.py index 5abaea6..42b8698 100644 --- a/playlist/__init__.py +++ b/playlist/__init__.py @@ -5,7 +5,7 @@ from . import model from . import runtime from gi.repository import Gtk import audio -import trackdb +import tagdb Model = model.TagModel() @@ -24,7 +24,7 @@ def on_row_activate(view, position): track = FilterModel.get_item(position) if audio.Player.play_track(track) == True: Model.tag.track_selected(track) - trackdb.save() + tagdb.save() View = Gtk.ColumnView() View.connect("activate", on_row_activate) diff --git a/playlist/controls.py b/playlist/controls.py index 398cf3f..d72048e 100644 --- a/playlist/controls.py +++ b/playlist/controls.py @@ -2,7 +2,7 @@ from . import filter from . import popover from gi.repository import Gtk -import trackdb +import tagdb class Controls(Gtk.Box): def __init__(self): @@ -50,11 +50,11 @@ class Controls(Gtk.Box): def random_toggled(self, toggle): self.tag.random = toggle.get_active() - trackdb.save() + tagdb.save() def loop_toggled(self, toggle): self.tag.loop = toggle.get_active() - trackdb.save() + tagdb.save() def search_changed(self, search): try: diff --git a/playlist/popover.py b/playlist/popover.py index 99dafeb..8a6561d 100644 --- a/playlist/popover.py +++ b/playlist/popover.py @@ -1,6 +1,6 @@ # Copyright 2021 (c) Anna Schumaker. from gi.repository import Gtk, Gio, GObject -import trackdb +import tagdb Exclude = [ "Collection", "New Tracks", "Previous" ] Icons = { "Favorites" : "emblem-favorites", @@ -32,7 +32,7 @@ class AddPopover(Gtk.Popover): self.listbox.connect("row-activated", self.row_activated) self.box.append(self.listbox) - for tag in trackdb.tags.User.tags(): + for tag in tagdb.tags.User.tags(): if tag.name not in Exclude: self.user_added(tag) @@ -42,8 +42,8 @@ class AddPopover(Gtk.Popover): self.entry.connect("activate", self.entry_activate) self.box.append(self.entry) - trackdb.tags.User.Added.register(self.user_added) - trackdb.tags.User.Removed.register(self.user_removed) + tagdb.tags.User.Added.register(self.user_added) + tagdb.tags.User.Removed.register(self.user_removed) self.set_child(self.box) def do_add_selected(self, tag): @@ -55,14 +55,14 @@ class AddPopover(Gtk.Popover): track = FilterModel.get_item(i) track.add_to_playlist(tag.name) - trackdb.save() + tagdb.save() self.popdown() def row_activated(self, listbox, row): self.do_add_selected(row.tag) def entry_activate(self, entry): - tag = trackdb.tags.User.add(entry.get_text()) + tag = tagdb.tags.User.add(entry.get_text()) self.do_add_selected(tag) entry.set_text("") @@ -77,7 +77,7 @@ class AddPopover(Gtk.Popover): self.listbox.append(AddPopoverRow(tag)) def user_removed(self, tag): - for i in range(len(trackdb.tags.User)): + for i in range(len(tagdb.tags.User)): row = self.listbox.get_row_at_index(i) if row is not None and row.tag == tag: self.listbox.remove(row) diff --git a/playlist/test_controls.py b/playlist/test_controls.py index 01b6051..1dc58e9 100644 --- a/playlist/test_controls.py +++ b/playlist/test_controls.py @@ -3,7 +3,7 @@ from . import controls from . import filter from . import popover from gi.repository import Gtk -import trackdb +import tagdb import unittest class TestPlaylistControls(unittest.TestCase): @@ -35,8 +35,8 @@ class TestPlaylistControls(unittest.TestCase): def test_playlist_controls_set_tag(self): ctrl = controls.Controls() - fav = trackdb.tags.User["Favorites"] - prev = trackdb.tags.User["Previous"] + fav = tagdb.tags.User["Favorites"] + prev = tagdb.tags.User["Previous"] self.assertIsNone(ctrl.tag) self.assertFalse(ctrl.random.get_sensitive()) diff --git a/playlist/test_popover.py b/playlist/test_popover.py index 1b3bae5..97dab33 100644 --- a/playlist/test_popover.py +++ b/playlist/test_popover.py @@ -1,12 +1,12 @@ # Copyright 2021 (c) Anna Schumaker. from . import popover from gi.repository import Gtk -import trackdb +import tagdb import unittest class TestAddPopover(unittest.TestCase): def setUp(self): - trackdb.reset() + tagdb.reset() def test_add_popover_init(self): pop = popover.AddPopover() @@ -25,7 +25,7 @@ class TestAddPopover(unittest.TestCase): self.assertIn(pop.entry, pop.box) def test_add_popover_row(self): - tag = trackdb.tags.User["Favorites"] + tag = tagdb.tags.User["Favorites"] row = popover.AddPopoverRow(tag) self.assertEqual(popover.Exclude, @@ -48,7 +48,7 @@ class TestAddPopover(unittest.TestCase): def test_add_popover_list(self): pop = popover.AddPopover() - user = trackdb.tags.User + user = tagdb.tags.User self.assertEqual(pop.listbox.get_row_at_index(0).tag, user["Favorites"]) self.assertEqual(pop.listbox.get_row_at_index(1).tag, user["Up Next"]) @@ -70,7 +70,7 @@ class TestAddPopover(unittest.TestCase): pop.entry.set_text("Test") pop.entry_activate(pop.entry) - tag = trackdb.tags.User["Test"] + tag = tagdb.tags.User["Test"] self.assertIsNotNone(tag) self.assertEqual(pop.entry.get_text(), "") diff --git a/sidebar/__init__.py b/sidebar/__init__.py index 0868bc8..68cc519 100644 --- a/sidebar/__init__.py +++ b/sidebar/__init__.py @@ -6,7 +6,7 @@ from . import user from lib import settings from gi.repository import Gtk import audio -import trackdb +import tagdb Switcher = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0) Stack = Gtk.Stack() @@ -34,7 +34,7 @@ def switch_page(toggle): def on_tag_push_pop(old, new): old.widgets.set_label() new.widgets.set_label() -trackdb.Stack.PushPop.register(on_tag_push_pop) +tagdb.Stack.PushPop.register(on_tag_push_pop) def add_stack_page(name, page): toggle = Gtk.ToggleButton() @@ -51,11 +51,11 @@ def add_stack_page(name, page): toggle.set_active(settings.get("sidebar.page") == name) add_stack_page("Playlists", user.TagBox) -add_stack_page("Artists", tagbox.ParentTagBox(trackdb.tags.Artist, "avatar-default-symbolic", - trackdb.tags.Album, "media-optical", header=True)) -add_stack_page("Genres", tagbox.TagBox(trackdb.tags.Genre, "emblem-generic", header=True)) -add_stack_page("Decades", tagbox.ParentTagBox(trackdb.tags.Decade, "x-office-calendar", - trackdb.tags.Year, "x-office-calendar-symbolic")) +add_stack_page("Artists", tagbox.ParentTagBox(tagdb.tags.Artist, "avatar-default-symbolic", + tagdb.tags.Album, "media-optical", header=True)) +add_stack_page("Genres", tagbox.TagBox(tagdb.tags.Genre, "emblem-generic", header=True)) +add_stack_page("Decades", tagbox.ParentTagBox(tagdb.tags.Decade, "x-office-calendar", + tagdb.tags.Year, "x-office-calendar-symbolic")) add_stack_page("Libraries", library.Box) diff --git a/sidebar/library.py b/sidebar/library.py index 675018f..54bbec1 100644 --- a/sidebar/library.py +++ b/sidebar/library.py @@ -3,7 +3,7 @@ from . import tagbox from . import tagrow from gi.repository import Gtk import pathlib -import trackdb +import tagdb class LibraryTagRow(tagrow.TagRow): @@ -28,13 +28,13 @@ class LibraryTagRow(tagrow.TagRow): self.tag.scan() def remove_clicked(self, button): - trackdb.Library.remove(self.tag) + tagdb.Library.remove(self.tag) class LibraryTagBox(tagbox.TagBox): def __alloc_tagrow__(self, tag): return LibraryTagRow(tag, self.icon) -TagBox = LibraryTagBox(trackdb.Library, "folder-music") +TagBox = LibraryTagBox(tagdb.Library, "folder-music") # @@ -55,7 +55,7 @@ def selected_path(): def on_select(button): if (path := selected_path()) != None: - trackdb.Library.add(path).scan() + tagdb.Library.add(path).scan() Popover.popdown() DirSelect = Gtk.Button.new_with_label("Select Folder") diff --git a/sidebar/tagbox.py b/sidebar/tagbox.py index 9f253c1..cb82d5e 100644 --- a/sidebar/tagbox.py +++ b/sidebar/tagbox.py @@ -3,7 +3,7 @@ from . import tagrow from gi.repository import Gtk import lib import playlist -import trackdb +import tagdb class TagBox(Gtk.ScrolledWindow): def __init__(self, tagstore, icon, header=False): @@ -48,7 +48,7 @@ class TagBox(Gtk.ScrolledWindow): cur.set_header(None) def row_activated(self, listbox, row): - trackdb.Stack.push(row.tag) + tagdb.Stack.push(row.tag) def row_selected(self, listbox, row): playlist.Model.switch_tag(row.tag) diff --git a/sidebar/tagrow.py b/sidebar/tagrow.py index a8f82e4..d925f84 100644 --- a/sidebar/tagrow.py +++ b/sidebar/tagrow.py @@ -1,6 +1,6 @@ # Copyright 2021 (c) Anna Schumaker. from gi.repository import Gtk, GLib, Pango -import trackdb +import tagdb class TagRow(Gtk.ListBoxRow): def __init__(self, tag, icon): @@ -24,7 +24,7 @@ class TagRow(Gtk.ListBoxRow): def set_label(self): count = len(self.tag) - bold = trackdb.Stack.current() == self.tag + bold = tagdb.Stack.current() == self.tag text = f"{self.tag.name}\n{count} Track{'s' if count != 1 else ''}" self.label.set_markup(("%s" if bold else "%s") % GLib.markup_escape_text(text)) diff --git a/sidebar/test_library.py b/sidebar/test_library.py index 75e9438..8b57e03 100644 --- a/sidebar/test_library.py +++ b/sidebar/test_library.py @@ -3,7 +3,7 @@ from . import library from . import tagbox from gi.repository import Gtk, Gio, GLib import pathlib -import trackdb +import tagdb import unittest main_context = GLib.main_context_default() @@ -12,7 +12,7 @@ test_artist1 = test_library / "Test Artist 01" class TestLibrarySidebar(unittest.TestCase): def tearDown(self): - trackdb.reset() + tagdb.reset() library.TagBox.clear() def test_library_sidebar_init(self): @@ -28,8 +28,8 @@ class TestLibrarySidebar(unittest.TestCase): self.assertIn(library.Add, library.Box) def test_library_sidebar_row(self): - library.TagBox = library.LibraryTagBox(trackdb.Library, "folder-music") - lib_tag = trackdb.Library.add(test_artist1) + library.TagBox = library.LibraryTagBox(tagdb.Library, "folder-music") + lib_tag = tagdb.Library.add(test_artist1) lib_tag.scan().join() library.TagBox.bus.complete() @@ -95,5 +95,5 @@ class TestLibrarySidebar(unittest.TestCase): library.on_select(library.DirSelect) self.assertFalse(library.Popover.is_visible()) - self.assertIn(test_artist1, trackdb.Library.store) - trackdb.Library[test_artist1].scan.join() + self.assertIn(test_artist1, tagdb.Library.store) + tagdb.Library[test_artist1].scan.join() diff --git a/sidebar/test_user.py b/sidebar/test_user.py index 7388922..100c488 100644 --- a/sidebar/test_user.py +++ b/sidebar/test_user.py @@ -3,7 +3,7 @@ from . import tagbox from . import tagrow from . import user from gi.repository import Gtk -import trackdb +import tagdb import unittest Expected = [ ("Collection", "media-playback-start", tagrow.TagRow), @@ -25,7 +25,7 @@ class TestUserSidebar(unittest.TestCase): self.assertEqual(user.Icons["Up Next"], "edit-redo") def test_user_sidebar_row(self): - tag = trackdb.tags.User.add("Test") + tag = tagdb.tags.User.add("Test") row = user.UserTagRow(tag, "audio-x-generic") self.assertIsInstance(row.remove, Gtk.Button) @@ -34,14 +34,14 @@ class TestUserSidebar(unittest.TestCase): self.assertIn(row.remove, row.grid) row.remove_tag(row.remove) - self.assertIsNone(trackdb.tags.User["Test"]) + self.assertIsNone(tagdb.tags.User["Test"]) def test_user_sidebar(self): - user.TagBox = user.UserTagBox(trackdb.tags.User, "audio-x-generic") - tag = trackdb.tags.User.add("Test") + user.TagBox = user.UserTagBox(tagdb.tags.User, "audio-x-generic") + tag = tagdb.tags.User.add("Test") user.TagBox.bus.complete() for (i, (tag, icon, type)) in enumerate(Expected): self.assertIsInstance(user.TagBox[i], type) - self.assertEqual(user.TagBox[i].tag, trackdb.tags.User[tag]) + self.assertEqual(user.TagBox[i].tag, tagdb.tags.User[tag]) self.assertEqual(user.TagBox[i].image.get_icon_name(), icon) diff --git a/sidebar/user.py b/sidebar/user.py index f5f9094..e0a8b94 100644 --- a/sidebar/user.py +++ b/sidebar/user.py @@ -2,7 +2,7 @@ from . import tagbox from . import tagrow from gi.repository import Gtk, Gdk -import trackdb +import tagdb Icons = { "Collection" : "media-playback-start", "Favorites" : "emblem-favorites", @@ -24,10 +24,10 @@ class UserTagRow(tagrow.TagRow): def on_key_released(self, controller, keyval, keycode, state): if Gdk.keyval_name(keyval) == "Delete": - trackdb.tags.User.remove(self.tag) + tagdb.tags.User.remove(self.tag) def remove_tag(self, button): - trackdb.tags.User.remove(self.tag) + tagdb.tags.User.remove(self.tag) class UserTagBox(tagbox.TagBox): @@ -37,4 +37,4 @@ class UserTagBox(tagbox.TagBox): return tagrow.TagRow(tag, Icons.get(tag.name, self.icon)) -TagBox = UserTagBox(trackdb.tags.User, "audio-x-generic") +TagBox = UserTagBox(tagdb.tags.User, "audio-x-generic") diff --git a/trackdb/__init__.py b/tagdb/__init__.py similarity index 99% rename from trackdb/__init__.py rename to tagdb/__init__.py index cf09f89..15735bc 100644 --- a/trackdb/__init__.py +++ b/tagdb/__init__.py @@ -7,7 +7,7 @@ import lib import pathlib import threading -File = "trackdb.pickle" +File = "tagdb.pickle" Bus = lib.bus.Bus(500) Tracks = allocator.TrackAllocator() Stack = stack.TagStack() diff --git a/trackdb/allocator.py b/tagdb/allocator.py similarity index 100% rename from trackdb/allocator.py rename to tagdb/allocator.py diff --git a/trackdb/stack.py b/tagdb/stack.py similarity index 100% rename from trackdb/stack.py rename to tagdb/stack.py diff --git a/trackdb/tags.py b/tagdb/tags.py similarity index 100% rename from trackdb/tags.py rename to tagdb/tags.py diff --git a/trackdb/test_allocator.py b/tagdb/test_allocator.py similarity index 100% rename from trackdb/test_allocator.py rename to tagdb/test_allocator.py diff --git a/trackdb/test_stack.py b/tagdb/test_stack.py similarity index 100% rename from trackdb/test_stack.py rename to tagdb/test_stack.py diff --git a/tagdb/test_tagdb.py b/tagdb/test_tagdb.py new file mode 100644 index 0000000..569b3db --- /dev/null +++ b/tagdb/test_tagdb.py @@ -0,0 +1,171 @@ +# Copyright 2020 (c) Anna Schumaker. +import lib +import pathlib +import tagdb +import unittest + +test_tracks = pathlib.Path("./data/Test Album") + +class TestLibraryTag(unittest.TestCase): + def tearDown(self): + tagdb.reset() + + def test_library_tag_init(self): + library = tagdb.LibraryTag(test_tracks) + self.assertIsInstance(library, lib.tag.Tag) + self.assertIsInstance(library.clear, lib.thread.Thread) + self.assertIsInstance(library.scan, lib.thread.Thread) + + def test_library_tag_state(self): + lib = tagdb.LibraryTag(test_tracks) + lib.scan().join() + + state = lib.__getstate__() + self.assertEqual(set(state.keys()), + set([ "name", "sort", "current", "loop", "random", "tracks" ])) + self.assertEqual(state["name"], test_tracks) + self.assertEqual(state["tracks"], [ i for i in range(12) ]) + + lib.__dict__.clear() + lib.__setstate__(state) + lib.fix_tracks() + self.assertEqual(lib.name, test_tracks) + self.assertEqual(lib.tracks, [ tagdb.Tracks[i] for i in range(12) ]) + self.assertEqual(lib.clear.func, lib.__do_clear__) + self.assertEqual(lib.scan.func, lib.__do_scan__) + + def test_library_tag_scan(self): + lib = tagdb.LibraryTag(test_tracks) + lib.scan().join() + for i in range(12): + self.assertEqual(lib.tracks[i], tagdb.Tracks[i]) + + def test_library_tag_scan_new(self): + lib = tagdb.LibraryTag(test_tracks) + lib.scan().join() + for trak in [ tagdb.Tracks[0], tagdb.Tracks[11] ]: + lib.remove_track(trak) + tagdb.Tracks.remove(trak) + lib.scan().join() + self.assertEqual(len(lib.tracks), 12) + + def test_library_tag_scan_remove(self): + lib = tagdb.LibraryTag(test_tracks) + lib.scan().join() + + trak = tagdb.track.Track(tagdb.Tracks.nextid, + test_tracks / "01 - Test Track.ogg", lib) + trak.path = pathlib.Path("No Such File") + lib.tracks.append(trak) + tagdb.Tracks.tracks[trak.trackid] = trak + lib.scan().join() + self.assertNotIn(trak, lib.tracks) + + def test_library_tag_clear(self): + lib = tagdb.LibraryTag(test_tracks) + lib.scan().join() + self.assertEqual(len(lib), 12) + + lib.clear().join() + self.assertEqual(len(lib), 0) + self.assertEqual(len(tagdb.Tracks), 0) + + +class TestLibraryStore(unittest.TestCase): + def test_library_store(self): + store = tagdb.LibraryStore() + lib = store.add(test_tracks) + self.assertIsInstance(lib, tagdb.LibraryTag) + + lib.scan().join() + self.assertEqual(len(lib), 12) + + store.remove(lib) + lib.clear.join() + self.assertEqual(len(lib), 0) + + +class TestTrackDB(unittest.TestCase): + def tearDown(self): + tagdb.reset() + + def test_tagdb_init(self): + self.assertIsInstance(tagdb.Bus, lib.bus.Bus) + self.assertIsInstance(tagdb.Tracks, tagdb.allocator.TrackAllocator) + self.assertIsInstance(tagdb.Stack, tagdb.stack.TagStack) + self.assertIsInstance(tagdb.Library, tagdb.LibraryStore) + + self.assertEqual(tagdb.File, "tagdb.pickle") + self.assertEqual(tagdb.Bus.timeout, 500) + + self.assertIn(tagdb.save, tagdb.Library.Added.subscribers) + self.assertIn(tagdb.save, tagdb.Library.Removed.subscribers) + self.assertIn(tagdb.save, tagdb.Tracks.Added.subscribers) + self.assertIn(tagdb.save, tagdb.Tracks.Removed.subscribers) + self.assertIn(tagdb.save, tagdb.Tracks.Updated.subscribers) + self.assertIn(tagdb.save, tagdb.tags.User.Added.subscribers) + self.assertIn(tagdb.save, tagdb.tags.User.Removed.subscribers) + self.assertIn(tagdb.save, tagdb.Stack.PushPop.subscribers) + self.assertIn(tagdb.save, tagdb.Stack.NextTrack.subscribers) + + def test_tagdb_save_load(self): + db_file = lib.data.DataFile(tagdb.File, lib.data.READ) + library = tagdb.Library.add(test_tracks) + library.scan() + tagdb.Stack.push(library) + + tagdb.save() + self.assertEqual(tagdb.Bus.passengers, [ (tagdb._do_save, ()) ]) + self.assertFalse(db_file.exists()) + + library.scan.join() + tagdb.Bus.complete() + self.assertTrue(db_file.exists()) + + tagdb.tags.reset() + tagdb.Library.reset() + tagdb.Tracks.reset() + tagdb.Stack.reset() + tagdb.load() + + self.assertEqual(len(tagdb.Tracks), 12) + self.assertEqual(len(tagdb.Library), 1) + self.assertEqual(len(tagdb.Library[test_tracks]), 12) + self.assertEqual(len(tagdb.tags.Artist), 3) + self.assertEqual(len(tagdb.tags.Album), 12) + self.assertEqual(len(tagdb.tags.Genre), 4) + self.assertEqual(len(tagdb.tags.Decade), 2) + self.assertEqual(len(tagdb.tags.Year), 2) + self.assertEqual(tagdb.Stack.tags, [ tagdb.Library[test_tracks] ]) + + self.assertIn(tagdb.save, tagdb.Library.Added.subscribers) + self.assertIn(tagdb.save, tagdb.Tracks.Added.subscribers) + self.assertIn(tagdb.save, tagdb.tags.User.Added.subscribers) + + def test_tagdb_stress(self): + lib = tagdb.Library.add(pathlib.Path("./trier/Test Library/")) + lib.scan().join() + tagdb.Bus.complete() + + tagdb.Library.remove(lib) + lib.clear.join() + tagdb.Bus.complete() + + def test_tagdb_reset(self): + tagdb.Tracks.Added.register(1) + tagdb.Tracks.Removed.register(1) + tagdb.Tracks.Updated.register(1) + tagdb.Library.Added.register(1) + tagdb.Library.Removed.register(1) + tagdb.Library.store = { "a" : 1, "b" : 2, "c" : 3 } + with lib.data.DataFile(tagdb.File, lib.data.WRITE) as f: + f.pickle([ 0, [] ]) + + tagdb.reset() + self.assertEqual(len(tagdb.Library), 0) + self.assertIn(tagdb.save, tagdb.Tracks.Added.subscribers) + self.assertIn(tagdb.save, tagdb.Tracks.Removed.subscribers) + self.assertIn(tagdb.save, tagdb.Tracks.Updated.subscribers) + self.assertIn(tagdb.save, tagdb.Library.Added.subscribers) + self.assertIn(tagdb.save, tagdb.Library.Removed.subscribers) + self.assertFalse(lib.data.DataFile(tagdb.File, lib.data.READ).exists()) diff --git a/trackdb/test_tags.py b/tagdb/test_tags.py similarity index 100% rename from trackdb/test_tags.py rename to tagdb/test_tags.py diff --git a/trackdb/test_track.py b/tagdb/test_track.py similarity index 100% rename from trackdb/test_track.py rename to tagdb/test_track.py diff --git a/trackdb/test_user.py b/tagdb/test_user.py similarity index 100% rename from trackdb/test_user.py rename to tagdb/test_user.py diff --git a/trackdb/track.py b/tagdb/track.py similarity index 100% rename from trackdb/track.py rename to tagdb/track.py diff --git a/trackdb/user.py b/tagdb/user.py similarity index 100% rename from trackdb/user.py rename to tagdb/user.py diff --git a/trackdb/test_trackdb.py b/trackdb/test_trackdb.py deleted file mode 100644 index 1064d93..0000000 --- a/trackdb/test_trackdb.py +++ /dev/null @@ -1,171 +0,0 @@ -# Copyright 2020 (c) Anna Schumaker. -import lib -import pathlib -import trackdb -import unittest - -test_tracks = pathlib.Path("./data/Test Album") - -class TestLibraryTag(unittest.TestCase): - def tearDown(self): - trackdb.reset() - - def test_library_tag_init(self): - library = trackdb.LibraryTag(test_tracks) - self.assertIsInstance(library, lib.tag.Tag) - self.assertIsInstance(library.clear, lib.thread.Thread) - self.assertIsInstance(library.scan, lib.thread.Thread) - - def test_library_tag_state(self): - lib = trackdb.LibraryTag(test_tracks) - lib.scan().join() - - state = lib.__getstate__() - self.assertEqual(set(state.keys()), - set([ "name", "sort", "current", "loop", "random", "tracks" ])) - self.assertEqual(state["name"], test_tracks) - self.assertEqual(state["tracks"], [ i for i in range(12) ]) - - lib.__dict__.clear() - lib.__setstate__(state) - lib.fix_tracks() - self.assertEqual(lib.name, test_tracks) - self.assertEqual(lib.tracks, [ trackdb.Tracks[i] for i in range(12) ]) - self.assertEqual(lib.clear.func, lib.__do_clear__) - self.assertEqual(lib.scan.func, lib.__do_scan__) - - def test_library_tag_scan(self): - lib = trackdb.LibraryTag(test_tracks) - lib.scan().join() - for i in range(12): - self.assertEqual(lib.tracks[i], trackdb.Tracks[i]) - - def test_library_tag_scan_new(self): - lib = trackdb.LibraryTag(test_tracks) - lib.scan().join() - for trak in [ trackdb.Tracks[0], trackdb.Tracks[11] ]: - lib.remove_track(trak) - trackdb.Tracks.remove(trak) - lib.scan().join() - self.assertEqual(len(lib.tracks), 12) - - def test_library_tag_scan_remove(self): - lib = trackdb.LibraryTag(test_tracks) - lib.scan().join() - - trak = trackdb.track.Track(trackdb.Tracks.nextid, - test_tracks / "01 - Test Track.ogg", lib) - trak.path = pathlib.Path("No Such File") - lib.tracks.append(trak) - trackdb.Tracks.tracks[trak.trackid] = trak - lib.scan().join() - self.assertNotIn(trak, lib.tracks) - - def test_library_tag_clear(self): - lib = trackdb.LibraryTag(test_tracks) - lib.scan().join() - self.assertEqual(len(lib), 12) - - lib.clear().join() - self.assertEqual(len(lib), 0) - self.assertEqual(len(trackdb.Tracks), 0) - - -class TestLibraryStore(unittest.TestCase): - def test_library_store(self): - store = trackdb.LibraryStore() - lib = store.add(test_tracks) - self.assertIsInstance(lib, trackdb.LibraryTag) - - lib.scan().join() - self.assertEqual(len(lib), 12) - - store.remove(lib) - lib.clear.join() - self.assertEqual(len(lib), 0) - - -class TestTrackDB(unittest.TestCase): - def tearDown(self): - trackdb.reset() - - def test_trackdb_init(self): - self.assertIsInstance(trackdb.Bus, lib.bus.Bus) - self.assertIsInstance(trackdb.Tracks, trackdb.allocator.TrackAllocator) - self.assertIsInstance(trackdb.Stack, trackdb.stack.TagStack) - self.assertIsInstance(trackdb.Library, trackdb.LibraryStore) - - self.assertEqual(trackdb.File, "trackdb.pickle") - self.assertEqual(trackdb.Bus.timeout, 500) - - self.assertIn(trackdb.save, trackdb.Library.Added.subscribers) - self.assertIn(trackdb.save, trackdb.Library.Removed.subscribers) - self.assertIn(trackdb.save, trackdb.Tracks.Added.subscribers) - self.assertIn(trackdb.save, trackdb.Tracks.Removed.subscribers) - self.assertIn(trackdb.save, trackdb.Tracks.Updated.subscribers) - self.assertIn(trackdb.save, trackdb.tags.User.Added.subscribers) - self.assertIn(trackdb.save, trackdb.tags.User.Removed.subscribers) - self.assertIn(trackdb.save, trackdb.Stack.PushPop.subscribers) - self.assertIn(trackdb.save, trackdb.Stack.NextTrack.subscribers) - - def test_trackdb_save_load(self): - db_file = lib.data.DataFile(trackdb.File, lib.data.READ) - library = trackdb.Library.add(test_tracks) - library.scan() - trackdb.Stack.push(library) - - trackdb.save() - self.assertEqual(trackdb.Bus.passengers, [ (trackdb._do_save, ()) ]) - self.assertFalse(db_file.exists()) - - library.scan.join() - trackdb.Bus.complete() - self.assertTrue(db_file.exists()) - - trackdb.tags.reset() - trackdb.Library.reset() - trackdb.Tracks.reset() - trackdb.Stack.reset() - trackdb.load() - - self.assertEqual(len(trackdb.Tracks), 12) - self.assertEqual(len(trackdb.Library), 1) - self.assertEqual(len(trackdb.Library[test_tracks]), 12) - self.assertEqual(len(trackdb.tags.Artist), 3) - self.assertEqual(len(trackdb.tags.Album), 12) - self.assertEqual(len(trackdb.tags.Genre), 4) - self.assertEqual(len(trackdb.tags.Decade), 2) - self.assertEqual(len(trackdb.tags.Year), 2) - self.assertEqual(trackdb.Stack.tags, [ trackdb.Library[test_tracks] ]) - - self.assertIn(trackdb.save, trackdb.Library.Added.subscribers) - self.assertIn(trackdb.save, trackdb.Tracks.Added.subscribers) - self.assertIn(trackdb.save, trackdb.tags.User.Added.subscribers) - - def test_trackdb_stress(self): - lib = trackdb.Library.add(pathlib.Path("./trier/Test Library/")) - lib.scan().join() - trackdb.Bus.complete() - - trackdb.Library.remove(lib) - lib.clear.join() - trackdb.Bus.complete() - - def test_trackdb_reset(self): - trackdb.Tracks.Added.register(1) - trackdb.Tracks.Removed.register(1) - trackdb.Tracks.Updated.register(1) - trackdb.Library.Added.register(1) - trackdb.Library.Removed.register(1) - trackdb.Library.store = { "a" : 1, "b" : 2, "c" : 3 } - with lib.data.DataFile(trackdb.File, lib.data.WRITE) as f: - f.pickle([ 0, [] ]) - - trackdb.reset() - self.assertEqual(len(trackdb.Library), 0) - self.assertIn(trackdb.save, trackdb.Tracks.Added.subscribers) - self.assertIn(trackdb.save, trackdb.Tracks.Removed.subscribers) - self.assertIn(trackdb.save, trackdb.Tracks.Updated.subscribers) - self.assertIn(trackdb.save, trackdb.Library.Added.subscribers) - self.assertIn(trackdb.save, trackdb.Library.Removed.subscribers) - self.assertFalse(lib.data.DataFile(trackdb.File, lib.data.READ).exists())