diff --git a/javascript/package-lock.json b/javascript/package-lock.json index b22f71e..ca3ad69 100644 --- a/javascript/package-lock.json +++ b/javascript/package-lock.json @@ -1,12 +1,12 @@ { "name": "hypha-rpc", - "version": "0.20.21-post1", + "version": "0.20.22", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "hypha-rpc", - "version": "0.20.21-post1", + "version": "0.20.22", "license": "MIT", "dependencies": { "@msgpack/msgpack": "^2.7.1" diff --git a/javascript/package.json b/javascript/package.json index 4e90a14..ae76550 100644 --- a/javascript/package.json +++ b/javascript/package.json @@ -1,6 +1,6 @@ { "name": "hypha-rpc", - "version": "0.20.21-post1", + "version": "0.20.22", "description": "Hypha RPC client for connecting to Hypha server for data management and AI model serving.", "main": "index.js", "types": "index.d.ts", diff --git a/javascript/src/websocket-client.js b/javascript/src/websocket-client.js index 3e3d882..5fd0b68 100644 --- a/javascript/src/websocket-client.js +++ b/javascript/src/websocket-client.js @@ -336,7 +336,6 @@ export async function login(config) { async function webrtcGetService(wm, rtc_service_id, query, config) { config = config || {}; - config.case_conversion = config.case_conversion || "camel"; const webrtc = config.webrtc; const webrtc_config = config.webrtc_config; if (config.webrtc !== undefined) delete config.webrtc; @@ -620,7 +619,6 @@ export async function connectToServer(config) { const _getService = wm.getService; wm.getService = (query, config) => { config = config || {}; - config.case_conversion = config.case_conversion || "camel"; return _getService(query, config); }; wm.getService.__schema__ = _getService.__schema__; diff --git a/javascript/tests/websocket_client_test.js b/javascript/tests/websocket_client_test.js index b705d75..9f92ec4 100644 --- a/javascript/tests/websocket_client_test.js +++ b/javascript/tests/websocket_client_test.js @@ -80,6 +80,14 @@ describe("RPC", async () => { expect(await svc.echo("hello")).to.equal("hello"); // the function will be converted to camel case expect(await svc.myFunc(2, 3)).to.equal(5); + + const svc2 = await server.getService("echo-service-rtc"); + expect(await svc2.my_func(2, 3)).to.equal(5); + + const svc3 = await server.getService("echo-service-rtc", { + case_conversion: "snake", + }); + expect(await svc3.my_func(2, 3)).to.equal(5); }).timeout(20000); it("should login to the server", async () => { diff --git a/python/hypha_rpc/VERSION b/python/hypha_rpc/VERSION index be3df68..ba8e705 100644 --- a/python/hypha_rpc/VERSION +++ b/python/hypha_rpc/VERSION @@ -1,3 +1,3 @@ { - "version": "0.20.21.post3" + "version": "0.20.22" } \ No newline at end of file diff --git a/python/hypha_rpc/rpc.py b/python/hypha_rpc/rpc.py index 8e688d7..8063879 100644 --- a/python/hypha_rpc/rpc.py +++ b/python/hypha_rpc/rpc.py @@ -515,7 +515,7 @@ async def get_remote_service(self, service_uri=None, config=None): """Get a remote service.""" config = config or {} timeout = config.get("timeout", self._method_timeout) - case_conversion = config.get("case_conversion", None) + case_conversion = config.get("case_conversion") if service_uri is None and self._connection.manager_id: service_uri = "*/" + self._connection.manager_id elif ":" not in service_uri: diff --git a/python/hypha_rpc/utils/__init__.py b/python/hypha_rpc/utils/__init__.py index de713b0..b9cb4b7 100644 --- a/python/hypha_rpc/utils/__init__.py +++ b/python/hypha_rpc/utils/__init__.py @@ -114,7 +114,7 @@ def generate_password(length=50): def to_camel_case(snake_str): # Check if the string is already in camelCase if "_" not in snake_str: - return snake_str + return snake_str[0].lower() + snake_str[1:] # Convert from snake_case to camelCase components = snake_str.split("_") return components[0] + "".join(x.title() for x in components[1:]) diff --git a/python/hypha_rpc/websocket_client.py b/python/hypha_rpc/websocket_client.py index 49eca81..fb8fcc7 100644 --- a/python/hypha_rpc/websocket_client.py +++ b/python/hypha_rpc/websocket_client.py @@ -355,7 +355,6 @@ def connect_to_server(config): async def webrtc_get_service(wm, rtc_service_id, query, config=None): config = config or {} - config["case_conversion"] = config.get("case_conversion", "snake") webrtc = config.get("webrtc") webrtc_config = config.get("webrtc_config") if "webrtc" in config: @@ -673,7 +672,6 @@ async def handle_disconnect(message): def get_service(query, config=None): config = config or {} - config["case_conversion"] = config.get("case_conversion", "snake") return _get_service(query, config) get_service.__schema__ = wm.get_service.__schema__ diff --git a/python/pyproject.toml b/python/pyproject.toml index ad3b05f..1d8ea04 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "hypha_rpc" -version = "0.20.21.post3" +version = "0.20.22" description = "Hypha RPC client for connecting to Hypha server for data management and AI model serving" readme = "README.md" requires-python = ">=3.6" diff --git a/python/tests/test_websocket_rpc.py b/python/tests/test_websocket_rpc.py index 2f1eb91..7f28f62 100644 --- a/python/tests/test_websocket_rpc.py +++ b/python/tests/test_websocket_rpc.py @@ -245,6 +245,40 @@ def hello(name, key=12, context=None): assert svc.hello.__name__ == hello.__name__ +@pytest.mark.asyncio +async def test_case_conversion(websocket_server): + """Test case conversion.""" + ws = await connect_to_server({"name": "my plugin", "server_url": WS_SERVER_URL}) + await ws.export(ImJoyPlugin(ws)) + + def hello(name, key=12, context=None): + """Say hello.""" + print("Hello " + name) + return "Hello " + name + + info = await ws.register_service( + { + "name": "Hello World", + "id": "hello-world", + "description": "hello world service", + "config": { + "visibility": "protected", + "run_in_executor": True, + }, + "HelloWorld": hello, + } + ) + + svc = await ws.get_service(info.id) + assert await svc.HelloWorld("world") == "Hello world" + + svc = await ws.get_service(info.id, {"case_conversion": "camel"}) + assert await svc.helloWorld("world") == "Hello world" + + svc = await ws.get_service(info.id, {"case_conversion": "snake"}) + assert await svc.hello_world("world") == "Hello world" + + @pytest.mark.asyncio async def test_reconnect_to_server(websocket_server): """Test reconnecting to the server.""" @@ -263,7 +297,7 @@ async def test_reconnect_to_server(websocket_server): } ) # simulate abnormal close - await ws.rpc._connection._websocket.close(1010) + await ws.rpc._connection._websocket.close(1002) # will trigger reconnect svc = await ws.get_service("hello-world") assert await svc.hello("world") == "hello world"