feed: Raise the new InvalidFeedConfig on missing feed.url
authorW. Trevor King <wking@tremily.us>
Wed, 9 Jan 2013 15:27:22 +0000 (10:27 -0500)
committerW. Trevor King <wking@tremily.us>
Wed, 9 Jan 2013 15:27:22 +0000 (10:27 -0500)
You can't fetch a feed without a URL.  This new error message makes
the cause explicit, compared to the somewhat ambigious former error
messages:

  fetch $NAME (None -> $TO)
  process $NAME (None -> $TO)
  HTTP status 200
  could not get HTTP headers: $NAME (None -> $TO)
  unrecognized version: $NAME (None -> $TO)
  sax parsing error: <unknown>:2:0: no element found: $NAME (None -> $TO)

I was getting URL-less feeds when I clobbered my
~/.config/rss2email/config [1], removing some newer entries.  However,
because I never deleted the feeds explicitly, they were repopulated
(without their URL) from ~/.config/rss2email/feeds.dat, and subsequent
runs generated the above error.

[1]: The clobbering was related to my dotfile management, and not due
to an rss2email issue.

Signed-off-by: W. Trevor King <wking@tremily.us>
rss2email/error.py
rss2email/feed.py

index d4c990ef177849f19968196f3937143ec6f851f0..7223d367b424cdb975a506dc3d8d6169222be73e 100644 (file)
@@ -112,10 +112,21 @@ class FeedError (RSS2EmailError):
         self.feed = feed
 
 
-class InvalidFeedName (FeedError):
+class InvalidFeedConfig (FeedError):
+    def __init__(self, setting, feed, message=None, **kwargs):
+        if not message:
+            message = "invalid feed configuration {}".format(
+                {setting: getattr(feed, setting)})
+        super(InvalidFeedConfig, self).__init__(
+            feed=feed, message=message, **kwargs)
+        self.setting = setting
+
+
+class InvalidFeedName (InvalidFeedConfig):
     def __init__(self, name, **kwargs):
         message = "invalid feed name '{}'".format(name)
-        super(InvalidFeedName, self).__init__(message=message, **kwargs)
+        super(InvalidFeedName, self).__init__(
+            setting='name', message=message, **kwargs)
 
 
 class ProcessingError (FeedError):
@@ -183,10 +194,11 @@ class NoDataFile (DataFileError):
             "'r2e new' first.")
 
 
-class NoToEmailAddress (FeedsError, FeedError):
-    def __init__(self, **kwargs):
+class NoToEmailAddress (InvalidFeedConfig, FeedsError):
+    def __init__(self, feed, **kwargs):
         message = 'no target email address has been defined'
-        super(NoToEmailAddress, self).__init__(message=message, **kwargs)
+        super(NoToEmailAddress, self).__init__(
+            setting='to', feed=feed, message=message, **kwargs)
 
     def log(self):
         super(NoToEmailAddress, self).log()
index 3c6513d7b1618c2275bfaf33e390e3d85a30c38a..ccb502ad4794095dd94a1cfc04626f0dba488eeb 100644 (file)
@@ -106,6 +106,14 @@ class Feed (object):
       ...
     rss2email.error.InvalidFeedName: invalid feed name 'invalid name'
 
+    You must define a URL:
+
+    >>> Feed(name='feed-without-a-url', to='a@b.com').run(send=False)
+    Traceback (most recent call last):
+      ...
+    rss2email.error.InvalidFeedConfig: invalid feed configuration {'url': None}
+
+
     Cleanup `CONFIG`.
 
     >>> CONFIG['DEFAULT']['to'] = ''
@@ -285,6 +293,8 @@ class Feed (object):
         200
         """
         _LOG.info('fetch {}'.format(self))
+        if not self.url:
+            raise _error.InvalidFeedConfig(setting='url', feed=self)
         if self.section in self.config:
             config = self.config[self.section]
         else: