feeds: Raise an exception when adding a feed with a duplicate name
authorW. Trevor King <wking@tremily.us>
Mon, 1 Sep 2014 22:48:21 +0000 (15:48 -0700)
committerW. Trevor King <wking@tremily.us>
Mon, 1 Sep 2014 22:52:41 +0000 (15:52 -0700)
Avoid:

  $ r2e add example http://example.com/feed1
  $ r2e add example http://example.com/feed2
  $ r2e list
  1: [*] example (http://example.com/feed2 -> lkmorlan)
  2: [*] example (http://example.com/feed2 -> lkmorlan)

Instead, the second addition now prints:

  duplicate feed name 'example'

to stderr and exits with status 1.

Reported-by: Liam K Morland <Liam@Morland.ca>
Signed-off-by: W. Trevor King <wking@tremily.us>
CHANGELOG
rss2email/error.py
rss2email/feeds.py

index 382e626e105f3dbd970c9e289c8f04e27b6726c4..dbcc6dd7852d3eca63267f246eb8987bd96d8d0a 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,4 +1,5 @@
 v3.9 (unreleased)
+    * Catch and error out if a user adds a feed with a duplicate name.
     * Split sender into both sendmail's -F and -f.
     * Fix an error with SMTPConnectionError inhertence order ("does not take keyword arguments").
     * Add a new `smtp-ssl-protocol` setting, to select acceptable protocols for SMTP connections.
index 49a1c936a0a0df3a399f67ec890a65f6d4ee9afa..9567b323a67b3d43095e810cf3d1749b7c7e3ee3 100644 (file)
@@ -153,12 +153,20 @@ class InvalidFeedConfig (FeedError):
 
 
 class InvalidFeedName (InvalidFeedConfig):
-    def __init__(self, name, **kwargs):
-        message = "invalid feed name '{}'".format(name)
+    def __init__(self, name, message=None, **kwargs):
+        if not message:
+            message = 'invalid feed name {!r}'.format(name)
         super(InvalidFeedName, self).__init__(
             setting='name', message=message, **kwargs)
 
 
+class DuplicateFeedName (InvalidFeedName):
+    def __init__(self, name, **kwargs):
+        message = 'duplicate feed name {!r}'.format(name)
+        super(DuplicateFeedName, self).__init__(
+            name=name, message=message, **kwargs)
+
+
 class ProcessingError (FeedError):
     def __init__(self, parsed, feed, message=None, **kwargs):
         if message is None:
index edd5f6678945de0a5e7fa31bcc8dcea5d7f31a96..5b5a34cf62133d2f70968282b9a2e10ee0a38d7e 100644 (file)
@@ -388,15 +388,22 @@ class Feeds (list):
         feed-0 (None -> a@b.com)
         >>> print(feeds.new_feed())
         feed-1 (None -> a@b.com)
+        >>> print(feeds.new_feed(name='feed-1'))
+        Traceback (most recent call last):
+          ...
+        rss2email.error.DuplicateFeedName: duplicate feed name 'feed-1'
         """
+        feed_names = [feed.name for feed in self]
         if name is None:
             i = 0
             while True:
                 name = '{}{}'.format(prefix, i)
-                feed_names = [feed.name for feed in self]
                 if name not in feed_names:
                     break
                 i += 1
+        elif name in feed_names:
+            feed = self[name]
+            raise _error.DuplicateFeedName(name=feed.name, feed=feed)
         feed = _feed.Feed(name=name, **kwargs)
         self.append(feed)
         return feed