From 2e8e0f6daf05b9395d738e2e1836f89158ba8e6b Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 22 Feb 2013 18:48:33 +0530 Subject: [PATCH] Finish writing one-one fields --- src/calibre/db/tests/writing.py | 32 ++++++++++++++++++++++++++++---- src/calibre/db/write.py | 10 +++++++++- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/calibre/db/tests/writing.py b/src/calibre/db/tests/writing.py index 7b7e815587..f6cf4d2d45 100644 --- a/src/calibre/db/tests/writing.py +++ b/src/calibre/db/tests/writing.py @@ -41,11 +41,11 @@ class WritingTest(BaseTest): self.create_setter(name, setter)) def run_tests(self, tests): - cl = self.cloned_library results = {} for test in tests: results[test] = [] for val in test.vals: + cl = self.cloned_library cache = self.init_cache(cl) cache.set_field(test.name, {1: val}) cached_res = cache.field_for(test.name, 1) @@ -65,11 +65,16 @@ class WritingTest(BaseTest): test.name, old_sqlite_res, sqlite_res)) del db - - def test_one_one(self): 'Test setting of values in one-one fields' - tests = [] + tests = [self.create_test('#yesno', (True, False, 'true', 'false', None))] + for name, getter, setter in ( + ('series_index', 'series_index', 'set_series_index'), + ('#float', None, None), + ): + vals = ['1.5', None, 0, 1.0] + tests.append(self.create_test(name, tuple(vals), getter, setter)) + for name, getter, setter in ( ('pubdate', 'pubdate', 'set_pubdate'), ('timestamp', 'timestamp', 'set_timestamp'), @@ -78,6 +83,25 @@ class WritingTest(BaseTest): tests.append(self.create_test( name, ('2011-1-12', UNDEFINED_DATE, None), getter, setter)) + for name, getter, setter in ( + ('title', 'title', 'set_title'), + ('uuid', 'uuid', 'set_uuid'), + ('author_sort', 'author_sort', 'set_author_sort'), + ('sort', 'title_sort', 'set_title_sort'), + ('#comments', None, None), + ('comments', 'comments', 'set_comment'), + ): + vals = ['something', None] + if name not in {'comments', '#comments'}: + # Setting text column to '' returns None in the new backend + # and '' in the old. I think None is more correct. + vals.append('') + if name == 'comments': + # Again new behavior of deleting comment rather than setting + # empty string is more correct. + vals.remove(None) + tests.append(self.create_test(name, tuple(vals), getter, setter)) + self.run_tests(tests) def tests(): diff --git a/src/calibre/db/write.py b/src/calibre/db/write.py index 14ddea8dfb..b3449f1387 100644 --- a/src/calibre/db/write.py +++ b/src/calibre/db/write.py @@ -98,10 +98,14 @@ def get_adapter(name, metadata): if name == 'title': return lambda x: ans(x) or _('Unknown') + if name == 'author_sort': + return lambda x: ans(x) or '' if name == 'authors': return lambda x: ans(x) or (_('Unknown'),) if name in {'timestamp', 'last_modified'}: return lambda x: ans(x) or UNDEFINED_DATE + if name == 'series_index': + return lambda x: 1.0 if ans(x) is None else ans(x) return ans # }}} @@ -148,13 +152,17 @@ class Writer(object): if dt == 'composite' or field.name in { 'id', 'cover', 'size', 'path', 'formats', 'news'}: self.set_books_func = dummy + elif self.name[0] == '#' and self.name.endswith('_index'): + # TODO: Implement this + pass elif field.is_many: # TODO: Implement this pass + # TODO: Remember to change commas to | when writing authors to sqlite else: self.set_books_func = (one_one_in_books if field.metadata['table'] == 'books' else one_one_in_other) - if self.name in {'timestamp', 'uuid'}: + if self.name in {'timestamp', 'uuid', 'sort'}: self.accept_vals = bool def set_books(self, book_id_val_map, db):