def test_remove_books(self): # {{{ 'Test removal of books' cl = self.cloned_library cache = self.init_cache() af, ae = self.assertFalse, self.assertEqual authors = cache.fields['authors'].table # Delete a single book, with no formats and check cleaning self.assertIn('Unknown', set(itervalues(authors.id_map))) olen = len(authors.id_map) item_id = {v:k for k, v in iteritems(authors.id_map)}['Unknown'] cache.remove_books((3,)) for c in (cache, self.init_cache()): table = c.fields['authors'].table self.assertNotIn(3, c.all_book_ids()) self.assertNotIn('Unknown', set(itervalues(table.id_map))) self.assertNotIn(item_id, table.asort_map) self.assertNotIn(item_id, table.alink_map) ae(len(table.id_map), olen-1) # Check that files are removed fmtpath = cache.format_abspath(1, 'FMT1') bookpath = os.path.dirname(fmtpath) authorpath = os.path.dirname(bookpath) os.mkdir(os.path.join(authorpath, '.DS_Store')) open(os.path.join(authorpath, 'Thumbs.db'), 'wb').close() item_id = {v:k for k, v in iteritems(cache.fields['#series'].table.id_map)}['My Series Two'] cache.remove_books((1,), permanent=True) for x in (fmtpath, bookpath, authorpath): af(os.path.exists(x), 'The file %s exists, when it should not' % x) for c in (cache, self.init_cache()): table = c.fields['authors'].table self.assertNotIn(1, c.all_book_ids()) self.assertNotIn('Author Two', set(itervalues(table.id_map))) self.assertNotIn(6, set(itervalues(c.fields['rating'].table.id_map))) self.assertIn('A Series One', set(itervalues(c.fields['series'].table.id_map))) self.assertNotIn('My Series Two', set(itervalues(c.fields['#series'].table.id_map))) self.assertNotIn(item_id, c.fields['#series'].table.col_book_map) self.assertNotIn(1, c.fields['#series'].table.book_col_map) # Test emptying the db cache.remove_books(cache.all_book_ids(), permanent=True) for f in ('authors', 'series', '#series', 'tags'): table = cache.fields[f].table self.assertFalse(table.id_map) self.assertFalse(table.book_col_map) self.assertFalse(table.col_book_map) # Test the delete service from calibre.db.delete_service import delete_service cache = self.init_cache(cl) # Check that files are removed fmtpath = cache.format_abspath(1, 'FMT1') bookpath = os.path.dirname(fmtpath) authorpath = os.path.dirname(bookpath) item_id = {v:k for k, v in iteritems(cache.fields['#series'].table.id_map)}['My Series Two'] cache.remove_books((1,)) delete_service().wait() for x in (fmtpath, bookpath, authorpath): af(os.path.exists(x), 'The file %s exists, when it should not' % x)
def test_remove_books(self): # {{{ "Test removal of books" cl = self.cloned_library cache = self.init_cache() af, ae, at = self.assertFalse, self.assertEqual, self.assertTrue authors = cache.fields["authors"].table # Delete a single book, with no formats and check cleaning self.assertIn(_("Unknown"), set(authors.id_map.itervalues())) olen = len(authors.id_map) item_id = {v: k for k, v in authors.id_map.iteritems()}[_("Unknown")] cache.remove_books((3,)) for c in (cache, self.init_cache()): table = c.fields["authors"].table self.assertNotIn(3, c.all_book_ids()) self.assertNotIn(_("Unknown"), set(table.id_map.itervalues())) self.assertNotIn(item_id, table.asort_map) self.assertNotIn(item_id, table.alink_map) ae(len(table.id_map), olen - 1) # Check that files are removed fmtpath = cache.format_abspath(1, "FMT1") bookpath = os.path.dirname(fmtpath) authorpath = os.path.dirname(bookpath) item_id = {v: k for k, v in cache.fields["#series"].table.id_map.iteritems()}["My Series Two"] cache.remove_books((1,), permanent=True) for x in (fmtpath, bookpath, authorpath): af(os.path.exists(x), "The file %s exists, when it should not" % x) for c in (cache, self.init_cache()): table = c.fields["authors"].table self.assertNotIn(1, c.all_book_ids()) self.assertNotIn("Author Two", set(table.id_map.itervalues())) self.assertNotIn(6, set(c.fields["rating"].table.id_map.itervalues())) self.assertIn("A Series One", set(c.fields["series"].table.id_map.itervalues())) self.assertNotIn("My Series Two", set(c.fields["#series"].table.id_map.itervalues())) self.assertNotIn(item_id, c.fields["#series"].table.col_book_map) self.assertNotIn(1, c.fields["#series"].table.book_col_map) # Test emptying the db cache.remove_books(cache.all_book_ids(), permanent=True) for f in ("authors", "series", "#series", "tags"): table = cache.fields[f].table self.assertFalse(table.id_map) self.assertFalse(table.book_col_map) self.assertFalse(table.col_book_map) # Test the delete service from calibre.db.delete_service import delete_service cache = self.init_cache(cl) # Check that files are removed fmtpath = cache.format_abspath(1, "FMT1") bookpath = os.path.dirname(fmtpath) authorpath = os.path.dirname(bookpath) item_id = {v: k for k, v in cache.fields["#series"].table.id_map.iteritems()}["My Series Two"] cache.remove_books((1,)) delete_service().wait() for x in (fmtpath, bookpath, authorpath): af(os.path.exists(x), "The file %s exists, when it should not" % x)
def test_remove_items(self): # {{{ ' Test removal of many-(many,one) items ' cache = self.init_cache() tmap = cache.get_id_map('tags') self.assertEqual(cache.remove_items('tags', tmap), {1, 2}) tmap = cache.get_id_map('#tags') t = {v:k for k, v in iteritems(tmap)}['My Tag Two'] self.assertEqual(cache.remove_items('#tags', (t,)), {1, 2}) smap = cache.get_id_map('series') self.assertEqual(cache.remove_items('series', smap), {1, 2}) smap = cache.get_id_map('#series') s = {v:k for k, v in iteritems(smap)}['My Series Two'] self.assertEqual(cache.remove_items('#series', (s,)), {1}) for c in (cache, self.init_cache()): self.assertFalse(c.get_id_map('tags')) self.assertFalse(c.all_field_names('tags')) for bid in c.all_book_ids(): self.assertFalse(c.field_for('tags', bid)) self.assertEqual(len(c.get_id_map('#tags')), 1) self.assertEqual(c.all_field_names('#tags'), {'My Tag One'}) for bid in c.all_book_ids(): self.assertIn(c.field_for('#tags', bid), ((), ('My Tag One',))) for bid in (1, 2): self.assertEqual(c.field_for('series_index', bid), 1.0) self.assertFalse(c.get_id_map('series')) self.assertFalse(c.all_field_names('series')) for bid in c.all_book_ids(): self.assertFalse(c.field_for('series', bid)) self.assertEqual(c.field_for('series_index', 1), 1.0) self.assertEqual(c.all_field_names('#series'), {'My Series One'}) for bid in c.all_book_ids(): self.assertIn(c.field_for('#series', bid), (None, 'My Series One')) # Now test with restriction cache = self.init_cache() cache.set_field('tags', {1:'a,b,c', 2:'b,a', 3:'x,y,z'}) cache.set_field('series', {1:'a', 2:'a', 3:'b'}) cache.set_field('series_index', {1:8, 2:9, 3:3}) tmap, smap = cache.get_id_map('tags'), cache.get_id_map('series') self.assertEqual(cache.remove_items('tags', tmap, restrict_to_book_ids=()), set()) self.assertEqual(cache.remove_items('tags', tmap, restrict_to_book_ids={1}), {1}) self.assertEqual(cache.remove_items('series', smap, restrict_to_book_ids=()), set()) self.assertEqual(cache.remove_items('series', smap, restrict_to_book_ids=(1,)), {1}) c2 = self.init_cache() for c in (cache, c2): self.assertEqual(c.field_for('tags', 1), ()) self.assertEqual(c.field_for('tags', 2), ('b', 'a')) self.assertNotIn('c', set(itervalues(c.get_id_map('tags')))) self.assertEqual(c.field_for('series', 1), None) self.assertEqual(c.field_for('series', 2), 'a') self.assertEqual(c.field_for('series_index', 1), 1.0) self.assertEqual(c.field_for('series_index', 2), 9)
def test_remove_items(self): # {{{ ' Test removal of many-(many,one) items ' cache = self.init_cache() tmap = cache.get_id_map('tags') self.assertEqual(cache.remove_items('tags', tmap), {1, 2}) tmap = cache.get_id_map('#tags') t = {v:k for k, v in tmap.iteritems()}['My Tag Two'] self.assertEqual(cache.remove_items('#tags', (t,)), {1, 2}) smap = cache.get_id_map('series') self.assertEqual(cache.remove_items('series', smap), {1, 2}) smap = cache.get_id_map('#series') s = {v:k for k, v in smap.iteritems()}['My Series Two'] self.assertEqual(cache.remove_items('#series', (s,)), {1}) for c in (cache, self.init_cache()): self.assertFalse(c.get_id_map('tags')) self.assertFalse(c.all_field_names('tags')) for bid in c.all_book_ids(): self.assertFalse(c.field_for('tags', bid)) self.assertEqual(len(c.get_id_map('#tags')), 1) self.assertEqual(c.all_field_names('#tags'), {'My Tag One'}) for bid in c.all_book_ids(): self.assertIn(c.field_for('#tags', bid), ((), ('My Tag One',))) for bid in (1, 2): self.assertEqual(c.field_for('series_index', bid), 1.0) self.assertFalse(c.get_id_map('series')) self.assertFalse(c.all_field_names('series')) for bid in c.all_book_ids(): self.assertFalse(c.field_for('series', bid)) self.assertEqual(c.field_for('series_index', 1), 1.0) self.assertEqual(c.all_field_names('#series'), {'My Series One'}) for bid in c.all_book_ids(): self.assertIn(c.field_for('#series', bid), (None, 'My Series One')) # Now test with restriction cache = self.init_cache() cache.set_field('tags', {1:'a,b,c', 2:'b,a', 3:'x,y,z'}) cache.set_field('series', {1:'a', 2:'a', 3:'b'}) cache.set_field('series_index', {1:8, 2:9, 3:3}) tmap, smap = cache.get_id_map('tags'), cache.get_id_map('series') self.assertEqual(cache.remove_items('tags', tmap, restrict_to_book_ids=()), set()) self.assertEqual(cache.remove_items('tags', tmap, restrict_to_book_ids={1}), {1}) self.assertEqual(cache.remove_items('series', smap, restrict_to_book_ids=()), set()) self.assertEqual(cache.remove_items('series', smap, restrict_to_book_ids=(1,)), {1}) c2 = self.init_cache() for c in (cache, c2): self.assertEqual(c.field_for('tags', 1), ()) self.assertEqual(c.field_for('tags', 2), ('b', 'a')) self.assertNotIn('c', set(c.get_id_map('tags').itervalues())) self.assertEqual(c.field_for('series', 1), None) self.assertEqual(c.field_for('series', 2), 'a') self.assertEqual(c.field_for('series_index', 1), 1.0) self.assertEqual(c.field_for('series_index', 2), 9)
def test_remove_books(self): # {{{ 'Test removal of books' cache = self.init_cache() af, ae, at = self.assertFalse, self.assertEqual, self.assertTrue authors = cache.fields['authors'].table # Delete a single book, with no formats and check cleaning self.assertIn(_('Unknown'), set(authors.id_map.itervalues())) olen = len(authors.id_map) item_id = {v:k for k, v in authors.id_map.iteritems()}[_('Unknown')] cache.remove_books((3,)) for c in (cache, self.init_cache()): table = c.fields['authors'].table self.assertNotIn(3, c.all_book_ids()) self.assertNotIn(_('Unknown'), set(table.id_map.itervalues())) self.assertNotIn(item_id, table.asort_map) self.assertNotIn(item_id, table.alink_map) ae(len(table.id_map), olen-1) # Check that files are removed fmtpath = cache.format_abspath(1, 'FMT1') bookpath = os.path.dirname(fmtpath) authorpath = os.path.dirname(bookpath) item_id = {v:k for k, v in cache.fields['#series'].table.id_map.iteritems()}['My Series Two'] cache.remove_books((1,), permanent=True) for x in (fmtpath, bookpath, authorpath): af(os.path.exists(x)) for c in (cache, self.init_cache()): table = c.fields['authors'].table self.assertNotIn(1, c.all_book_ids()) self.assertNotIn('Author Two', set(table.id_map.itervalues())) self.assertNotIn(6, set(c.fields['rating'].table.id_map.itervalues())) self.assertIn('A Series One', set(c.fields['series'].table.id_map.itervalues())) self.assertNotIn('My Series Two', set(c.fields['#series'].table.id_map.itervalues())) self.assertNotIn(item_id, c.fields['#series'].table.col_book_map) self.assertNotIn(1, c.fields['#series'].table.book_col_map) # Test emptying the db cache.remove_books(cache.all_book_ids(), permanent=True) for f in ('authors', 'series', '#series', 'tags'): table = cache.fields[f].table self.assertFalse(table.id_map) self.assertFalse(table.book_col_map) self.assertFalse(table.col_book_map)
def test_remove_items(self): # {{{ ' Test removal of many-(many,one) items ' cache = self.init_cache() tmap = cache.get_id_map('tags') self.assertEqual(cache.remove_items('tags', tmap), {1, 2}) tmap = cache.get_id_map('#tags') t = {v: k for k, v in tmap.iteritems()}['My Tag Two'] self.assertEqual(cache.remove_items('#tags', (t, )), {1, 2}) smap = cache.get_id_map('series') self.assertEqual(cache.remove_items('series', smap), {1, 2}) smap = cache.get_id_map('#series') s = {v: k for k, v in smap.iteritems()}['My Series Two'] self.assertEqual(cache.remove_items('#series', (s, )), {1}) for c in (cache, self.init_cache()): self.assertFalse(c.get_id_map('tags')) self.assertFalse(c.all_field_names('tags')) for bid in c.all_book_ids(): self.assertFalse(c.field_for('tags', bid)) self.assertEqual(len(c.get_id_map('#tags')), 1) self.assertEqual(c.all_field_names('#tags'), {'My Tag One'}) for bid in c.all_book_ids(): self.assertIn(c.field_for('#tags', bid), ((), ('My Tag One', ))) for bid in (1, 2): self.assertEqual(c.field_for('series_index', bid), 1.0) self.assertFalse(c.get_id_map('series')) self.assertFalse(c.all_field_names('series')) for bid in c.all_book_ids(): self.assertFalse(c.field_for('series', bid)) self.assertEqual(c.field_for('series_index', 1), 1.0) self.assertEqual(c.all_field_names('#series'), {'My Series One'}) for bid in c.all_book_ids(): self.assertIn(c.field_for('#series', bid), (None, 'My Series One'))
def test_remove_items(self): # {{{ ' Test removal of many-(many,one) items ' cache = self.init_cache() tmap = cache.get_id_map('tags') self.assertEqual(cache.remove_items('tags', tmap), {1, 2}) tmap = cache.get_id_map('#tags') t = {v:k for k, v in tmap.iteritems()}['My Tag Two'] self.assertEqual(cache.remove_items('#tags', (t,)), {1, 2}) smap = cache.get_id_map('series') self.assertEqual(cache.remove_items('series', smap), {1, 2}) smap = cache.get_id_map('#series') s = {v:k for k, v in smap.iteritems()}['My Series Two'] self.assertEqual(cache.remove_items('#series', (s,)), {1}) for c in (cache, self.init_cache()): self.assertFalse(c.get_id_map('tags')) self.assertFalse(c.all_field_names('tags')) for bid in c.all_book_ids(): self.assertFalse(c.field_for('tags', bid)) self.assertEqual(len(c.get_id_map('#tags')), 1) self.assertEqual(c.all_field_names('#tags'), {'My Tag One'}) for bid in c.all_book_ids(): self.assertIn(c.field_for('#tags', bid), ((), ('My Tag One',))) for bid in (1, 2): self.assertEqual(c.field_for('series_index', bid), 1.0) self.assertFalse(c.get_id_map('series')) self.assertFalse(c.all_field_names('series')) for bid in c.all_book_ids(): self.assertFalse(c.field_for('series', bid)) self.assertEqual(c.field_for('series_index', 1), 1.0) self.assertEqual(c.all_field_names('#series'), {'My Series One'}) for bid in c.all_book_ids(): self.assertIn(c.field_for('#series', bid), (None, 'My Series One'))