Skip to content

Commit e6d18e2

Browse files
committed
wrapping rsconnect
1 parent 28fe053 commit e6d18e2

2 files changed

Lines changed: 76 additions & 41 deletions

File tree

vetiver/rsconnect.py

Lines changed: 36 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,47 @@
1-
from tempfile import tempdir
2-
import rsconnect
1+
import tempfile
2+
from rsconnect.actions import deploy_python_fastapi
33
import typing
44

55
from .write_fastapi import write_app
66

7+
78
def deploy_rsconnect(
89
connect_server,
910
board,
1011
pin_name,
11-
version,
12-
directory: str,
13-
extra_files: typing.List[str],
14-
excludes: typing.List[str],
15-
entry_point: str,
16-
new: bool,
17-
app_id: int,
18-
title: str,
19-
python: str,
20-
conda_mode: bool,
21-
force_generate: bool,
22-
log_callback: typing.Callable,
12+
version = None,
13+
extra_files: typing.List[str] = None,
14+
new: bool = False,
15+
app_id: int = None,
16+
title: str = None,
17+
python: str = None,
18+
conda_mode: bool = False,
19+
force_generate: bool = False,
20+
log_callback: typing.Callable = None,
2321
image: str = None,
2422
):
25-
tmp = tempdir()
26-
27-
write_app(board = board, pin_name = pin_name, version = version, file = tmp+"app.py", overwrite = False)
23+
with tempfile.TemporaryDirectory() as temp:
24+
tmp_app = temp + "/app.py"
25+
write_app(
26+
board=board,
27+
pin_name=pin_name,
28+
version=version,
29+
file=tmp_app,
30+
overwrite=False,
31+
)
2832

29-
rsconnect.actions.deploy_python_fastapi(
30-
connect_server = connect_server,
31-
directory = directory,
32-
extra_files = extra_files,
33-
excludes = excludes,
34-
entry_point = entry_point,
35-
new = new,
36-
app_id = app_id,
37-
title = title,
38-
python = python,
39-
conda_mode = conda_mode,
40-
force_generate = force_generate,
41-
log_callback = log_callback,
42-
image = image,
43-
)
33+
deploy_python_fastapi(
34+
connect_server=connect_server,
35+
directory=temp,
36+
extra_files=extra_files,
37+
excludes=None,
38+
entry_point="vetiver_api:api",
39+
new=new,
40+
app_id=app_id,
41+
title=title,
42+
python=python,
43+
conda_mode=conda_mode,
44+
force_generate=force_generate,
45+
log_callback=log_callback,
46+
image=image,
47+
)

vetiver/tests/test_rsconnect.py

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,38 @@
11
import pytest
22
import json
3-
from pins.rsconnect.fs import RsConnectFs
3+
import requests
4+
5+
import sklearn
46
from pins.boards import BoardRsConnect
57

8+
from vetiver import VetiverModel, vetiver_pin_write, mock
9+
from vetiver.rsconnect import deploy_rsconnect
10+
11+
# Load data, model
12+
X_df, y = mock.get_mock_data()
13+
model = mock.get_mock_model().fit(X_df, y)
14+
615
RSC_SERVER_URL = "http://localhost:3939"
716
RSC_KEYS_FNAME = "vetiver/tests/rsconnect_api_keys.json"
817

918
pytestmark = pytest.mark.rsc_test # noqa
1019

20+
21+
def server_from_key(name):
22+
from rsconnect.api import RSConnectServer
23+
24+
with open(RSC_KEYS_FNAME) as f:
25+
api_key = json.load(f)[name]
26+
return RSConnectServer(RSC_SERVER_URL, api_key)
27+
1128
def rsc_from_key(name):
1229
from pins.rsconnect.api import RsConnectApi
1330

1431
with open(RSC_KEYS_FNAME) as f:
1532
api_key = json.load(f)[name]
1633
return RsConnectApi(RSC_SERVER_URL, api_key)
1734

35+
1836
def rsc_fs_from_key(name):
1937
from pins.rsconnect.fs import RsConnectFs
2038

@@ -29,6 +47,7 @@ def rsc_delete_user_content(rsc):
2947
for entry in content:
3048
rsc.delete_content_item(entry["guid"])
3149

50+
3251
@pytest.fixture(scope="function")
3352
def rsc_short():
3453
# tears down content after each test
@@ -37,18 +56,30 @@ def rsc_short():
3756
# delete any content that might already exist
3857
rsc_delete_user_content(fs_susan.api)
3958

40-
yield BoardRsConnect("", fs_susan, allow_pickle_read=True) #fs_susan.ls to list content
59+
yield BoardRsConnect(
60+
"", fs_susan, allow_pickle_read=True
61+
) # fs_susan.ls to list content
4162

4263
rsc_delete_user_content(fs_susan.api)
4364

44-
from vetiver import VetiverModel, vetiver_pin_write, mock
45-
import sklearn
46-
# Load data, model
47-
X_df, y = mock.get_mock_data()
48-
model = mock.get_mock_model().fit(X_df, y)
4965

5066
def test_board_pin_write(rsc_short):
51-
v = VetiverModel(model=model, ptype_data=X_df,
52-
model_name="susan/model", versioned=None)
67+
v = VetiverModel(
68+
model=model, ptype_data=X_df, model_name="susan/model", versioned=None
69+
)
5370
vetiver_pin_write(board=rsc_short, model=v)
5471
assert isinstance(rsc_short.pin_read("susan/model"), sklearn.dummy.DummyRegressor)
72+
73+
74+
def test_deploy(rsc_short):
75+
v = VetiverModel(
76+
model=model, ptype_data=X_df, model_name="susan/model", versioned=None
77+
)
78+
79+
vetiver_pin_write(board=rsc_short, model=v)
80+
deploy_rsconnect(
81+
connect_server=server_from_key("susan"), board=rsc_short, pin_name="susan/model"
82+
)
83+
response = requests.post(RSC_SERVER_URL + "/predict/", json=X_df)
84+
assert response.status_code == 200, response.text
85+
assert response.json() == {"prediction": [44.47, 44.47]}, response.json()

0 commit comments

Comments
 (0)