Raise RepoAlreadyExists exception instead of generic HTTP exception
authorSybren A. Stüvel <sybren@stuvel.eu>
Fri, 3 Nov 2017 12:43:54 +0000 (13:43 +0100)
committerSybren A. Stüvel <sybren@stuvel.eu>
Fri, 3 Nov 2017 12:43:54 +0000 (13:43 +0100)
IMO '409 Conflict' isn't descriptive enough to handle at the application
level (contrary to things like '404 Not Found')

svnman/exceptions.py
svnman/remote.py

index 177e7dd..217a214 100644 (file)
@@ -4,3 +4,20 @@
 class SVNManException(Exception):
     """Base exception for all SVNMan-specific exceptions."""
 
+
+class RemoteError(SVNManException):
+    """Errors sent to us by the remote SVNMan API.
+
+    Note that not all errors that have anything to do with the remote server
+    communication are wrapped in this error; it's very possible you can get
+    exceptions from the Requests library, for example.
+    """
+
+
+class RepoAlreadyExists(RemoteError):
+    def __init__(self, repo_id: str):
+        self.repo_id = repo_id
+
+    def __repr__(self):
+        return f'RepoAlreadyExists({self.repo_id!r})'
+
index 2921e20..e26ab8f 100644 (file)
@@ -5,6 +5,8 @@ import requests
 
 from pillar import attrs_extra
 
+from . import exceptions
+
 
 @attr.s
 class RepoDescription(object):
@@ -38,7 +40,11 @@ class API(object):
         """Fetches repository information from the remote."""
 
         resp = self._request('GET', f'repo/{repo_id}')
+
+        if resp.status_code == requests.codes.conflict:
+            raise exceptions.RepoAlreadyExists(repo_id)
         resp.raise_for_status()
+
         return RepoDescription(**resp.json())
 
     def _request(self, method: str, rel_url: str, **kwargs) -> requests.Response: