Page Menu
Home
Software Heritage
Search
Configure Global Search
Log In
Files
F9336764
D4327.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
3 KB
Subscribers
None
D4327.diff
View Options
diff --git a/swh/core/api/__init__.py b/swh/core/api/__init__.py
--- a/swh/core/api/__init__.py
+++ b/swh/core/api/__init__.py
@@ -429,11 +429,14 @@
def __init__(self, *args, backend_class=None, backend_factory=None, **kwargs):
super().__init__(*args, **kwargs)
+ if backend_class is None and backend_factory is not None:
+ raise ValueError(
+ "backend_factory should only be provided if backend_class is"
+ )
self.backend_class = backend_class
if backend_class is not None:
- if backend_factory is None:
- backend_factory = backend_class
+ backend_factory = backend_factory or backend_class
for (meth_name, meth) in backend_class.__dict__.items():
if hasattr(meth, "_endpoint_path"):
self.__add_endpoint(meth_name, meth, backend_factory)
diff --git a/swh/core/api/tests/test_rpc_server.py b/swh/core/api/tests/test_rpc_server.py
--- a/swh/core/api/tests/test_rpc_server.py
+++ b/swh/core/api/tests/test_rpc_server.py
@@ -25,24 +25,43 @@
extra_type_decoders = extra_decoders
+class TestStorage:
+ @remote_api_endpoint("test_endpoint_url")
+ def endpoint_test(self, test_data, db=None, cur=None):
+ assert test_data == "spam"
+ return "egg"
+
+ @remote_api_endpoint("path/to/endpoint")
+ def something(self, data, db=None, cur=None):
+ return data
+
+ @remote_api_endpoint("serializer_test")
+ def serializer_test(self, data, db=None, cur=None):
+ assert data == ["foo", ExtraType("bar", b"baz")]
+ return ExtraType({"spam": "egg"}, "qux")
+
+
@pytest.fixture
def app():
- class TestStorage:
- @remote_api_endpoint("test_endpoint_url")
- def test_endpoint(self, test_data, db=None, cur=None):
- assert test_data == "spam"
- return "egg"
+ return MyRPCServerApp("testapp", backend_class=TestStorage)
- @remote_api_endpoint("path/to/endpoint")
- def something(self, data, db=None, cur=None):
- return data
- @remote_api_endpoint("serializer_test")
- def serializer_test(self, data, db=None, cur=None):
- assert data == ["foo", ExtraType("bar", b"baz")]
- return ExtraType({"spam": "egg"}, "qux")
+def test_api_rpc_server_app_ok(app):
+ assert isinstance(app, MyRPCServerApp)
- return MyRPCServerApp("testapp", backend_class=TestStorage)
+ actual_rpc_server2 = MyRPCServerApp(
+ "app2", backend_class=TestStorage, backend_factory=TestStorage
+ )
+ assert isinstance(actual_rpc_server2, MyRPCServerApp)
+
+ actual_rpc_server3 = MyRPCServerApp("app3")
+ assert isinstance(actual_rpc_server3, MyRPCServerApp)
+
+
+def test_api_rpc_server_app_misconfigured():
+ expected_error = "backend_factory should only be provided if backend_class is"
+ with pytest.raises(ValueError, match=expected_error):
+ MyRPCServerApp("failed-app", backend_factory="something-to-make-it-raise")
def test_api_endpoint(flask_app_client):
@@ -82,7 +101,7 @@
def test_rpc_server(flask_app_client):
res = flask_app_client.post(
- url_for("test_endpoint"),
+ url_for("endpoint_test"),
headers=[
("Content-Type", "application/x-msgpack"),
("Accept", "application/x-msgpack"),
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Jul 3 2025, 7:42 AM (10 w, 5 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3215968
Attached To
D4327: api.RPCServerApp: Adapt sync rpc server with async rpc server
Event Timeline
Log In to Comment