From 442d0ab26746240ebb55d8e26ecaf23f2e905a7d Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 6 Sep 2011 23:56:18 -0600 Subject: [PATCH] ... --- src/calibre/db/fields.py | 17 ++++-- src/calibre/db/tables.py | 2 - src/calibre/db/tests/metadata.db | Bin 230400 -> 230400 bytes src/calibre/db/tests/reading.py | 87 ++++++++++++++++++++++++++++++- src/calibre/debug.py | 1 + 5 files changed, 99 insertions(+), 8 deletions(-) diff --git a/src/calibre/db/fields.py b/src/calibre/db/fields.py index 0a497555c4..5c0dffd383 100644 --- a/src/calibre/db/fields.py +++ b/src/calibre/db/fields.py @@ -164,7 +164,7 @@ class ManyToOneField(Field): def for_book(self, book_id, default_value=None): ids = self.table.book_col_map.get(book_id, None) if ids is not None: - ans = self.id_map[ids] + ans = self.table.id_map[ids] else: ans = default_value return ans @@ -182,7 +182,7 @@ class ManyToOneField(Field): return self.table.id_map.iterkeys() def sort_keys_for_books(self, get_metadata, all_book_ids): - keys = {id_ : self._sort_key(self.id_map.get(id_, '')) for id_ in + keys = {id_ : self._sort_key(self.table.id_map.get(id_, '')) for id_ in all_book_ids} return {id_ : keys.get( self.book_col_map.get(id_, None), '') for id_ in all_book_ids} @@ -196,7 +196,7 @@ class ManyToManyField(Field): def for_book(self, book_id, default_value=None): ids = self.table.book_col_map.get(book_id, ()) if ids: - ans = tuple(self.id_map[i] for i in ids) + ans = tuple(self.table.id_map[i] for i in ids) else: ans = default_value return ans @@ -211,7 +211,7 @@ class ManyToManyField(Field): return self.table.id_map.iterkeys() def sort_keys_for_books(self, get_metadata, all_book_ids): - keys = {id_ : self._sort_key(self.id_map.get(id_, '')) for id_ in + keys = {id_ : self._sort_key(self.table.id_map.get(id_, '')) for id_ in all_book_ids} def sort_key_for_book(book_id): @@ -222,6 +222,13 @@ class ManyToManyField(Field): return {id_ : sort_key_for_book(id_) for id_ in all_book_ids} +class IdentifiersField(ManyToManyField): + + def for_book(self, book_id, default_value=None): + ids = self.table.book_col_map.get(book_id, ()) + if not ids: + ids = default_value + return ids class AuthorsField(ManyToManyField): @@ -249,6 +256,8 @@ def create_field(name, table): cls = OnDeviceField elif name == 'formats': cls = FormatsField + elif name == 'identifiers': + cls = IdentifiersField elif table.metadata['datatype'] == 'composite': cls = CompositeField return cls(name, table) diff --git a/src/calibre/db/tables.py b/src/calibre/db/tables.py index 185d15d86b..6a6730c2b4 100644 --- a/src/calibre/db/tables.py +++ b/src/calibre/db/tables.py @@ -66,8 +66,6 @@ class VirtualTable(Table): self.table_type = table_type Table.__init__(self, name, metadata) - - class OneToOneTable(Table): ''' diff --git a/src/calibre/db/tests/metadata.db b/src/calibre/db/tests/metadata.db index 8fb89cbb8e87ff051c764bb653fef03e64094284..812bf296ba52f6b02fb4d33ae8b76a81e50749ba 100644 GIT binary patch delta 2189 zcmc&#Yiv|S6uvXx?B1nxTb5QRZE0^=p`{eq?LJycQA(?YKy5>7BuWAW*0R_K(ru(h zq{PIa2@!MENt8dtAN(@0dy~B;#DqelCJ2`DP_RfFAyJH_1c_Kp>&$JtTORt)xY=`O z@|`p1oO{lh?{*zb={lHlIFpk6ceB@sXZO~lGiNG_Lg_Ar?n0^I&3KE<#*@l`lA9}* zi(*j}^1gn|c}oA-X%?4goDxgg%CpRHn~!2w;QAGyKt#0lQ6YeD}g;) zaC>elvy7P?mNBBM|A5MD5Qd1B-^Qe##`Q(NL%)@;8e{A4sQ-F+)6a0(E$1Yj2{T4t z5SiHT%Y+gZ-FikPOh4N+kHGk;$;IL+G>@+*B>LHyNXQsJp3G)k!=H3N{fM40(ocLv zbpOdsG*d1wk~RElHQbK31C=(V`aK^%`ZPXyqS(KpNK4YhZ^53%NVv6WL77(SnS$J% zq4w4`33=mC+|29o>fNUvU+nb;rj+fWJ>gKhuwUVyf+FFTPM!+cg;o5PqN>=|<0&nJisYJzuHo*w!3w-x=DYHN4X1f^qBg7}A&v`6Qtc z!-8nvnN(SwYgToxIoK?gf;>`hB_qcP(d)!-jV$^VjG*6e6?~2vg~Dx-R?!jRUu2PG zv21b&PSt9yO+I0dX#$!z4I=g=IrzA#;2v%YFW+FHHZirr7ZJMIPUMmVq9Tom1Zb>) z+)H&ZYjAMi5XH*L)I>d?82Bf}269Jr+7pQq7Hg2XPlG6%KB%$H zf5IEMtCyTKw1T^|TsA7<(rWH~E~)f6X;3@OSavm*A+AR9f8aQ(4TDmqk5s1{OuG(! zWVtPmGI8q!K?sJJxSoI<24GmhZy3d};qnhclWm#kvtSZAMUS%L!?`5MK`aA`n1`|q zgMIxSW>3|0a&|?P`S5x=M<@r7A_|khsX1Ir=ded>o}=SPgH6($;3)^Oc2p3BU?+a- zI8_NT$MeZ32+Yy#bX=9|OVr-S#2XEotP6h$zEhOGW9&6B?%Ici=Hk7$0@g2D&CgX} zA+Oz!bzE!1O7qhQ>Os!)RTZe>M_xt1+_xKVf?VK(omgZRHsdnLMc%z1i_N7waS7xS zcfA3(nZFeSP`}+P2&34~k3J90EZi)Nk6{y-LuuJ9nZ&~#JFt?Lmg>*+%ujajXpDp` zxJcvOO-R=}dme)~7~~@%q}K%FROF5{Hc2M(1{2g3Zr|1_pkV0~Ik`iv9W4SW@x_ri zg?YXDJ3S?4AcV7&T;_*fN4BXo;75?}c}_ht&73;i02$yfZ$!G8u>rq;T;*ML2%9Zy zp<}I66p$!f5&t2vmC`5VoREGY=Y?Dla&c1RUSd)wZKSO{GsuV5A)61@VFnkD3o*8+ z%KWe#A&?(ptHD^6ody*eq#J2?g89Xv2LoIZm=qc8!9aro>q`VtE!K5Ud@V$<3K{Ik M|NjYT6lq@h8|D%vng9R* delta 1820 zcmb_cYiv|S6uxJ^*$3P1mZhb%^tG@8g)X?ew3aOrq|cS>5gmyA2R+ zQvVnyX+%1$>6Jz4dJu~Ni zbMAL$&YW}F_PE;ixb{tD+O_wKm#Xo|rh{2oY`ezjkVc0PGy(p%r8i0P-A z3W<#0n%rF6K0}HtdZ(6H`{%@Q~I6Uf^zGHJT5^I`XxpznlhhJ@1SnC=K%woiV%&@K&b*od|V#if8miMzmjF*VeV%I zR>BPpHw<^>b%-0aEdLQ8UC&(dZauT}ap0HPE$Dw#*s=+BvScb$m5c9hIB2vYRrRFQ z?SK)JLtEL1P2A3bQ(B{J===TWiO;iWK~24@wXpVvCfHFG;44ZlD@iN4q~yXqQTn}d za$qy|kpt>mhbUL`$B9_BMSO>Pr2*Lszhw&p+GV*5)d z7QInSuw`n+J6RR2_r9+YvcFrM|NqwSDy#B)anui2>W`u=iim7ZLWlW%R&0+UPZqom z)u7Ia(m1Bd(x}Ql`boUE6vfiB4cBlOo4{=scBxhotQ1F9!XxKwzy;7H;a&`{oV6Zl zSTxmJLL#dX3!xf{zPhu-;ceWU3}+gQh&95e@9lJm!7#GdJk)TKo0}4k^`J;%OYAWy z9BXNQ3`%4g#we)o>wHF5g>i~eS{zx1*>dh$oC94Jz0YH&oU_K@870bm(FQ7`c yuEN{kJ*uL_=~m1T^~><0@HAkd{B$K6K)u4f1T*C9<+upCdYC^4RnO1jF8%@E)c?8w diff --git a/src/calibre/db/tests/reading.py b/src/calibre/db/tests/reading.py index 6149839a88..91ec2a92f6 100644 --- a/src/calibre/db/tests/reading.py +++ b/src/calibre/db/tests/reading.py @@ -8,7 +8,9 @@ __copyright__ = '2011, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, shutil, unittest, tempfile +import os, shutil, unittest, tempfile, datetime + +from calibre.utils.date import local_tz def create_db(library_path): from calibre.library.database2 import LibraryDatabase2 @@ -19,6 +21,14 @@ def create_db(library_path): shutil.copyfile(src, db) return db +def init_cache(library_path): + from calibre.db.backend import DB + from calibre.db.cache import Cache + backend = DB(library_path) + cache = Cache(backend) + cache.init() + return cache + class ReadingTest(unittest.TestCase): def setUp(self): @@ -29,5 +39,78 @@ class ReadingTest(unittest.TestCase): shutil.rmtree(self.library_path) def test_read(self): - pass + cache = init_cache(self.library_path) + tests = { + 2 : { + 'title': 'Title One', + 'sort': 'One', + 'authors': ('Author One',), + 'author_sort': 'One, Author', + 'series' : 'Series One', + 'series_index': 1.0, + 'tags':('Tag One',), + 'rating': 4.0, + 'identifiers': {'test':'one'}, + 'timestamp': datetime.datetime(2011, 9, 5, 15, 6, + tzinfo=local_tz), + 'pubdate': datetime.datetime(2011, 9, 5, 15, 6, + tzinfo=local_tz), + 'publisher': 'Publisher One', + 'languages': ('eng',), + 'comments': '

Comments One

', + '#enum':'One', + '#authors':('Custom One', 'Custom Two'), + '#date':datetime.datetime(2011, 9, 5, 0, 0, + tzinfo=local_tz), + '#rating':2.0, + '#series':'My Series One', + '#series_index': 1.0, + '#tags':('My Tag One', 'My Tag Two'), + '#yesno':True, + '#comments': '
My Comments One

', + }, + 1 : { + 'title': 'Title Two', + 'sort': 'Title Two', + 'authors': ('Author Two', 'Author One'), + 'author_sort': 'Two, Author & One, Author', + 'series' : 'Series Two', + 'series_index': 2.0, + 'rating': 6.0, + 'tags': ('Tag Two',), + 'identifiers': {'test':'two'}, + 'timestamp': datetime.datetime(2011, 9, 6, 0, 0, + tzinfo=local_tz), + 'pubdate': datetime.datetime(2011, 8, 5, 0, 0, + tzinfo=local_tz), + 'publisher': 'Publisher Two', + 'languages': ('deu',), + 'comments': '

Comments Two

', + '#enum':'Two', + '#authors':('My Author Two',), + '#date':datetime.datetime(2011, 9, 1, 0, 0, + tzinfo=local_tz), + '#rating':4.0, + '#series':'My Series Two', + '#series_index': 3.0, + '#tags':('My Tag Two',), + '#yesno':False, + '#comments': '
My Comments Two

', + + }, + } + for book_id, test in tests.iteritems(): + for field, expected_val in test.iteritems(): + self.assertEqual(expected_val, + cache.field_for(field, book_id)) + break + +def tests(): + return unittest.TestLoader().loadTestsFromTestCase(ReadingTest) + +def run(): + unittest.TextTestRunner(verbosity=2).run(tests()) + +if __name__ == '__main__': + run() diff --git a/src/calibre/debug.py b/src/calibre/debug.py index 79110d9585..20f8617396 100644 --- a/src/calibre/debug.py +++ b/src/calibre/debug.py @@ -180,6 +180,7 @@ def main(args=sys.argv): sys.path.insert(0, base) g = globals() g['__name__'] = '__main__' + g['__file__'] = ef execfile(ef, g) return