Author: johnnyg

Revision: 6067

Log:
        Simplify logic flow a bit (should make local file support easier).
Improve docstrings.

Diff:
Modified: trunk/deluge/plugins/blocklist/blocklist/core.py
===================================================================
--- trunk/deluge/plugins/blocklist/blocklist/core.py    2009-12-28 21:50:13 UTC 
(rev 6066)
+++ trunk/deluge/plugins/blocklist/blocklist/core.py    2010-01-01 16:02:20 UTC 
(rev 6067)
@@ -98,8 +98,7 @@
             if not self.config["last_update"] or last_update + check_period < 
datetime.now():
                 update_now = True
             else:
-                self.use_cache = True
-                d = self.import_list()
+                d = 
self.import_list(deluge.configmanager.get_config_dir("blocklist.cache"))
                 d.addCallbacks(self.on_import_complete, self.on_import_error)
 
         # This function is called every 'check_after_days' days, to download
@@ -118,17 +117,19 @@
     @export
     def check_import(self, force=False):
         """
-        Imports latest blocklist specified by blocklist url.
-        Only downloads/imports if necessary or forced.
+        Imports latest blocklist specified by blocklist url
+        Only downloads/imports if necessary or forced
 
-        :param force: optional argument to force download/import.
+        :param force: optional argument to force download/import
         :type force: boolean
+        :returns: a Deferred which fires when the blocklist has been imported
+        :rtype: Deferred
         """
 
 
         # Reset variables
+        self.filename = None
         self.force_download = force
-        self.use_cache = False
         self.failed_attempts = 0
         self.auto_detected = False
         if force:
@@ -144,7 +145,12 @@
 
     @export
     def get_config(self):
-        """Returns the config dictionary"""
+        """
+        Returns the config dictionary
+        
+        :returns: the config dictionary
+        :rtype: dict
+        """
         return self.config.config
 
     @export
@@ -160,7 +166,12 @@
 
     @export
     def get_status(self):
-        """Returns the status of the plugin."""
+        """
+        Returns the status of the plugin
+        
+        :returns: the status dict of the plugin
+        :rtype: dict
+        """
         status = {}
         if self.is_downloading:
             status["state"] = "Downloading"
@@ -189,10 +200,14 @@
 
         :param blocklist: path of blocklist
         :type blocklist: string
+        :returns: path of blocklist
+        :rtype: string
         """
         log.debug("Updating blocklist info: %s", blocklist)
         self.config["last_update"] = time.time()
         self.config["list_size"] = os.path.getsize(blocklist)
+        self.filename = blocklist
+        return blocklist
 
     def download_list(self, url=None):
         """
@@ -229,14 +244,29 @@
         self.is_downloading = True
         return download_file(url, 
deluge.configmanager.get_config_dir("blocklist.download"), on_retrieve_data, 
headers)
 
-    def on_download_complete(self, result):
-        """Runs any download clean up functions"""
-        log.debug("Blocklist download complete: %s", result)
+    def on_download_complete(self, blocklist):
+        """
+        Runs any download clean up functions
+        
+        :param blocklist: path of blocklist
+        :type blocklist: string
+        :returns: a Deferred which fires when clean up is done
+        :rtype: Deferred
+        """
+        log.debug("Blocklist download complete: %s", blocklist)
         self.is_downloading = False
-        return threads.deferToThread(self.update_info, result)
+        return threads.deferToThread(self.update_info, blocklist)
 
     def on_download_error(self, f):
-        """Recovers from download error"""
+        """
+        Recovers from download error
+        
+        :param f: failure that occured
+        :type f: Failure
+        :returns: a Deferred if recovery was possible
+                  else the original failure
+        :rtype: Deferred or Failure
+        """
         self.is_downloading = False
         error_msg = f.getErrorMessage()
         d = f
@@ -253,11 +283,8 @@
             if "Not Modified" in error_msg:
                 log.debug("Blocklist is up-to-date!")
                 self.up_to_date = True
-                if 
os.path.exists(deluge.configmanager.get_config_dir("blocklist.cache")):
-                    self.use_cache = True
-                bl_filename = "blocklist.cache" if self.use_cache else 
"blocklist.download"
-                d = threads.deferToThread(self.update_info,
-                        deluge.configmanager.get_config_dir(bl_filename))
+                blocklist = 
deluge.configmanager.get_config_dir("blocklist.cache")
+                d = threads.deferToThread(self.update_info, blocklist)
                 f.trap(f.type)
             elif self.failed_attempts < self.config["try_times"]:
                 log.warning("Blocklist download failed!")
@@ -267,31 +294,37 @@
                 log.error(error_msg)
         return d
 
-    def import_list(self, force=False):
-        """Imports the downloaded blocklist into the session"""
+    def import_list(self, blocklist):
+        """
+        Imports the downloaded blocklist into the session
+        
+        :param blocklist: path of blocklist
+        :type blocklist: string
+        :returns: a Deferred that fires when the blocklist has been imported
+        :rtype: Deferred
+        """
         def on_read_ip_range(start, end):
             """Add ip range to blocklist"""
             self.blocklist.add_rule(start, end, BLOCK_RANGE)
             self.num_blocked += 1
 
         def on_finish_read(result):
-            # Add blocklist to session
+            """Add blocklist to session"""
             self.core.session.set_ip_filter(self.blocklist)
+            return result
 
         # TODO: double check logic
         if self.up_to_date and self.has_imported:
             log.debug("Latest blocklist is already imported")
-            return defer.succeed(None)
+            return defer.succeed(blocklist)
 
         self.is_importing = True
         self.num_blocked = 0
         self.blocklist = self.core.session.get_ip_filter()
+        
+        if not blocklist:
+            blocklist = self.filename
 
-        if self.use_cache:
-            blocklist = deluge.configmanager.get_config_dir("blocklist.cache")
-        else:
-            blocklist = 
deluge.configmanager.get_config_dir("blocklist.download")
-
         if not self.reader:
             self.auto_detect(blocklist)
             self.auto_detected = True
@@ -303,41 +336,56 @@
 
         return d
 
-    def on_import_complete(self, result):
-        """Runs any import clean up functions"""
-        d = None
+    def on_import_complete(self, blocklist):
+        """
+        Runs any import clean up functions
+        
+        :param blocklist: path of blocklist
+        :type blocklist: string
+        :returns: a Deferred that fires when clean up is done
+        :rtype: Deferred
+        """
+        d = blocklist
         self.is_importing = False
         self.has_imported = True
         log.debug("Blocklist import complete!")
         # Move downloaded blocklist to cache
-        if not self.use_cache and not self.up_to_date:
-            log.debug("Moving blocklist.download to blocklist.cache")
-            d = threads.deferToThread(shutil.move,
-                    deluge.configmanager.get_config_dir("blocklist.download"),
-                    deluge.configmanager.get_config_dir("blocklist.cache"))
+        cache = deluge.configmanager.get_config_dir("blocklist.cache")
+        if blocklist != cache:
+            log.debug("Moving %s to %s", blocklist, cache)
+            d = threads.deferToThread(shutil.move, blocklist, cache)
         return d
 
     def on_import_error(self, f):
-        """Recovers from import error"""
+        """
+        Recovers from import error
+        
+        :param f: failure that occured
+        :type f: Failure
+        :returns: a Deferred if recovery was possible
+                  else the original failure
+        :rtype: Deferred or Failure
+        """
         d = f
         self.is_importing = False
         try_again = False
-        blocklist = deluge.configmanager.get_config_dir("blocklist.cache")
+        cache = deluge.configmanager.get_config_dir("blocklist.cache")
 
         if f.check(ReaderParseError) and not self.auto_detected:
             # Invalid / corrupt list, let's detect it
             log.warning("Invalid / corrupt blocklist")
             self.reader = None
+            blocklist = None
             try_again = True
-        elif os.path.exists(blocklist) and not self.use_cache:
+        elif self.filename != cache and os.path.exists(cache):
             # If we have a backup and we haven't already used it
             e = f.trap(Exception)
             log.warning("Error reading blocklist: %s", e)
-            self.use_cache = True
+            blocklist = cache
             try_again = True
 
         if try_again:
-            d = self.import_list()
+            d = self.import_list(blocklist)
             d.addCallbacks(self.on_import_complete, self.on_import_error)
 
         return d

Modified: trunk/deluge/plugins/blocklist/blocklist/readers.py
===================================================================
--- trunk/deluge/plugins/blocklist/blocklist/readers.py 2009-12-28 21:50:13 UTC 
(rev 6066)
+++ trunk/deluge/plugins/blocklist/blocklist/readers.py 2010-01-01 16:02:20 UTC 
(rev 6067)
@@ -57,6 +57,7 @@
         """Calls callback on each ip range in the file"""
         for start, end in self.readranges():
             callback(remove_zeros(start), remove_zeros(end))
+        return self.file
 
     def is_ignored(self, line):
         """Ignore commented lines and blank lines"""


--

You received this message because you are subscribed to the Google Groups 
"deluge-commit" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/deluge-commit?hl=en.


Reply via email to