Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions novem/api_ref.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,39 @@ class NovemAuthError(NovemException):
pass


def raise_on_response(r: requests.Response) -> None:
"""Raise the appropriate ``NovemException`` for a non-ok API response.

Surfaces the server's ``message`` and any ``rejected`` lines (e.g. the
recipient-write reject contract) so callers get a real exception to catch
instead of a silent no-op. No-op on a successful response.
"""
if r.ok or r.status_code == 409:
return

try:
resp = r.json()
except ValueError:
resp = {}

message = resp.get("message") or r.text or f"HTTP {r.status_code}"

rejected = resp.get("rejected")
if rejected:
lines = "; ".join(f'{item.get("line")}: {item.get("reason")}' for item in rejected if isinstance(item, dict))
if lines:
message = f"{message} [{lines}]"

code = r.status_code
if code == 401:
raise Novem401(message)
if code == 403:
raise Novem403(message)
if code == 404:
raise Novem404(message)
raise NovemException(message)


class NovemAPI(object):
"""
Novem API class
Expand Down
12 changes: 10 additions & 2 deletions novem/exceptions/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
from ..api_ref import Novem401, Novem403, Novem404, NovemAuthError, NovemException
from ..api_ref import Novem401, Novem403, Novem404, Novem409, NovemAuthError, NovemException, raise_on_response

__all__ = ["NovemException", "Novem404", "Novem403", "Novem401", "NovemAuthError"]
__all__ = [
"NovemException",
"Novem404",
"Novem403",
"Novem401",
"Novem409",
"NovemAuthError",
"raise_on_response",
]
29 changes: 3 additions & 26 deletions novem/group/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from typing import Any, Optional

from novem.exceptions import Novem403, Novem404
from novem.exceptions import Novem403, Novem404, raise_on_response

from ..api_ref import NovemAPI
from .profile import NovemGroupProfile
Expand Down Expand Up @@ -147,17 +147,8 @@ def api_create(self, relpath: str) -> None:
# as creating objects that already exist is not a problem
return

# TODO: verify result and raise exception if not ok
if not r.ok:
print(r)
print(f"PUT: {path}")
print("body")
print("---")
print(r.text)
print("headers")
print("---")
print(r.headers)
print("should raise a general error")
raise_on_response(r)

def api_write(self, relpath: str, value: str) -> None:
"""
Expand All @@ -180,22 +171,8 @@ def api_write(self, relpath: str, value: str) -> None:
if r.status_code == 404:
raise Novem404(path)

if r.status_code == 403:
raise Novem403

# TODO: verify result and raise exception if not ok
if not r.ok:
print(r)
print(f"POST: {path} {value}")
print("body")
print("---")
print(r.text)
print(r.status_code)
print("headers")
print("---")
for k, v in r.headers.items():
print(f" {k}: {v}")
print("should raise a general error")
raise_on_response(r)

@property
def permissions(self) -> str:
Expand Down
29 changes: 3 additions & 26 deletions novem/job/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import sys
from typing import Any, Dict, List, Optional, Tuple

from novem.exceptions import Novem403, Novem404
from novem.exceptions import Novem403, Novem404, raise_on_response

from ..api_ref import NovemAPI
from ..shared import NovemShare
Expand Down Expand Up @@ -182,17 +182,8 @@ def api_create(self, relpath: str) -> None:
# as creating objects that already exist is not a problem
return

# TODO: verify result and raise exception if not ok
if not r.ok:
print(r)
print(f"PUT: {path}")
print("body")
print("---")
print(r.text)
print("headers")
print("---")
print(r.headers)
print("should raise a general error")
raise_on_response(r)

def api_write(self, relpath: str, value: str) -> None:
"""
Expand All @@ -218,22 +209,8 @@ def api_write(self, relpath: str, value: str) -> None:
if r.status_code == 404:
raise Novem404(path)

if r.status_code == 403:
raise Novem403

# TODO: verify result and raise exception if not ok
if not r.ok:
print(r)
print(f"POST: {path} {value}")
print("body")
print("---")
print(r.text)
print(r.status_code)
print("headers")
print("---")
for k, v in r.headers.items():
print(f" {k}: {v}")
print("should raise a general error")
raise_on_response(r)

# chainable utility function for setting values
def w(self, key: str, value: str) -> Any:
Expand Down
29 changes: 3 additions & 26 deletions novem/repo/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from typing import Any, Optional

from novem.exceptions import Novem403, Novem404
from novem.exceptions import Novem403, Novem404, raise_on_response

from ..api_ref import NovemAPI
from ..shared import NovemShare
Expand Down Expand Up @@ -144,17 +144,8 @@ def api_create(self, relpath: str) -> None:
# as creating objects that already exist is not a problem
return

# TODO: verify result and raise exception if not ok
if not r.ok:
print(r)
print(f"PUT: {path}")
print("body")
print("---")
print(r.text)
print("headers")
print("---")
print(r.headers)
print("should raise a general error")
raise_on_response(r)

def api_write(self, relpath: str, value: str) -> None:
"""
Expand All @@ -177,22 +168,8 @@ def api_write(self, relpath: str, value: str) -> None:
if r.status_code == 404:
raise Novem404(path)

if r.status_code == 403:
raise Novem403

# TODO: verify result and raise exception if not ok
if not r.ok:
print(r)
print(f"POST: {path} {value}")
print("body")
print("---")
print(r.text)
print(r.status_code)
print("headers")
print("---")
for k, v in r.headers.items():
print(f" {k}: {v}")
print("should raise a general error")
raise_on_response(r)

# chainable utility function for setting values
def w(self, key: str, value: str) -> Any:
Expand Down
29 changes: 3 additions & 26 deletions novem/vis/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import warnings
from typing import Any, Dict, List, Optional, Tuple

from novem.exceptions import Novem403, Novem404
from novem.exceptions import Novem403, Novem404, raise_on_response

from ..api_ref import NovemAPI
from ..shared import NovemShare
Expand Down Expand Up @@ -383,17 +383,8 @@ def api_create(self, relpath: str) -> None:
# as creating objects that already exist is not a problem
return

# TODO: verify result and raise exception if not ok
if not r.ok:
print(r)
print(f"PUT: {path}")
print("body")
print("---")
print(r.text)
print("headers")
print("---")
print(r.headers)
print("should raise a general error")
raise_on_response(r)

def api_write(self, relpath: str, value: str) -> None:
"""
Expand All @@ -419,22 +410,8 @@ def api_write(self, relpath: str, value: str) -> None:
if r.status_code == 404:
raise Novem404(path)

if r.status_code == 403:
raise Novem403

# TODO: verify result and raise exception if not ok
if not r.ok:
print(r)
print(f"POST: {path} {value}")
print("body")
print("---")
print(r.text)
print(r.status_code)
print("headers")
print("---")
for k, v in r.headers.items():
print(f" {k}: {v}")
print("should raise a general error")
raise_on_response(r)

@property
def log(self) -> None:
Expand Down