From f97ae35cc57abd3a35d4838224daf2a2c9f5562c Mon Sep 17 00:00:00 2001 From: Charles Haley Date: Sun, 24 Nov 2013 09:33:18 +0100 Subject: [PATCH] Make the smart device cache return instances of USBMS.Book instead of Book.Metadata. --- src/calibre/devices/smart_device_app/driver.py | 2 +- src/calibre/ebooks/metadata/book/base.py | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/calibre/devices/smart_device_app/driver.py b/src/calibre/devices/smart_device_app/driver.py index ee6754331f..33ce6b98f1 100644 --- a/src/calibre/devices/smart_device_app/driver.py +++ b/src/calibre/devices/smart_device_app/driver.py @@ -688,7 +688,7 @@ class SMART_DEVICE_APP(DeviceConfig, DevicePlugin): lastmod = parse_date(lastmod) if key in self.known_uuids and self.known_uuids[key]['book'].last_modified == lastmod: self.known_uuids[key]['last_used'] = now() - return self.known_uuids[key]['book'].deepcopy() + return self.known_uuids[key]['book'].deepcopy(lambda : SDBook('', '')) except: traceback.print_exc() return None diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 5c4526a7ab..1c66835b07 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -184,11 +184,14 @@ class Metadata(object): def has_key(self, key): return key in object.__getattribute__(self, '_data') - def deepcopy(self): + def deepcopy(self, class_generator=lambda : Metadata(None)): ''' Do not use this method unless you know what you are doing, if you want to create a simple clone of this object, use :meth:`deepcopy_metadata` - instead. ''' - m = Metadata(None) + instead. Class_generator must be a function that returns an instance + of Metadata or a subclass of it.''' + m = class_generator() + if not isinstance(m, Metadata): + return None object.__setattr__(m, '__dict__', copy.deepcopy(self.__dict__)) return m