Changeset 1603:7a78a7302c20 in orange-bioinformatics for obiKEGG2/caching.py


Ignore:
Timestamp:
03/21/12 19:18:34 (2 years ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Configurable cache invalidation.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • obiKEGG2/caching.py

    r1537 r1603  
    88import cPickle as pickle 
    99 
    10 from datetime import datetime 
    11  
     10from datetime import datetime, date, timedelta 
     11from . import conf 
    1212 
    1313class Store(object): 
     
    2424        pass 
    2525     
    26      
    27 class ShelveStore(Store): 
    28     def __init__(self): 
    29         import shelve 
    30         self.fname = shelve.open 
    31  
    3226 
    3327class Sqlite3Store(Store, UserDict.DictMixin): 
     
    10094        self.expires = expires 
    10195         
     96_SESSION_START = datetime.now() 
    10297 
    10398class cached_wrapper(object): 
     
    158153                if not self.is_entry_valid(entry, args): 
    159154                    valid = False 
    160                      
    161155            if not valid: 
    162156                rval = self.function(self.instance, *args) 
     
    170164     
    171165    def is_entry_valid(self, entry, args): 
    172         return self.min_timestamp(args) < entry.mtime  
     166        # Need to check datetime first (it subclasses date) 
     167        if isinstance(entry.mtime, datetime): 
     168            mtime = entry.mtime 
     169        elif isinstance(entry.mtime, date): 
     170            mtime = datetime(entry.mtime.year, entry.mtime.month, 
     171                             entry.mtime.day, 1, 1, 1) 
     172        else: 
     173            return False 
     174         
     175        if self.min_timestamp(args) > mtime: 
     176            return False 
     177         
     178        last_modified = self.last_modified_from_args(args) 
     179         
     180        if isinstance(last_modified, date): 
     181            last_modified = datetime(last_modified.year, last_modified.month, 
     182                                     last_modified.day, 1, 1, 1) 
     183        elif isinstance(last_modified, basestring): 
     184            # Could have settable format 
     185            mtime = mtime.strftime("%Y %m %d %H %M %S")  
     186         
     187        elif last_modified is None: 
     188            if conf.params["cache.invalidate"] == "always": 
     189                return False 
     190            elif conf.params["cache.invalidate"] == "session": 
     191                last_modified = _SESSION_START 
     192            elif conf.params["cache.invalidate"] == "daily": 
     193                last_modified = datetime.now().replace(hour=0, minute=0, 
     194                                                       second=0, microsecond=0) 
     195            elif conf.params["cache.invalidate"] == "weekly": 
     196                last_modified = datetime.now() - timedelta(7) 
     197            else: # ??? 
     198                pass 
     199        if last_modified > mtime: 
     200            return False 
     201         
     202        return self.min_timestamp(args) < entry.mtime 
    173203     
    174204         
Note: See TracChangeset for help on using the changeset viewer.