Skip to content

Commit 8b24166

Browse files
authored
Merge pull request #119 from rstudio/rsc-testing
remove xfail from `test_rsconnect`
2 parents 6f730c9 + 0721f16 commit 8b24166

6 files changed

Lines changed: 51 additions & 30 deletions

File tree

.github/workflows/tests.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,13 @@ jobs:
5151
- name: Install dependencies
5252
run: |
5353
python -m pip install --upgrade pip
54-
python -m pip install -e .[dev,torch]
54+
python -m pip install ".[dev]"
55+
python -m pip install --upgrade git+https://github.com/rstudio/vetiver-python@${{ github.sha }}
56+
echo {{ github.sha }}
5557
- name: run RStudio Connect
5658
run: |
5759
docker-compose up --build -d
60+
pip freeze > requirements.txt
5861
make dev
5962
env:
6063
RSC_LICENSE: ${{ secrets.RSC_LICENSE }}

docker-compose.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
version: '3.1'
1+
version: '3.2'
22

33
services:
44

55
rsconnect:
6-
image: rstudio/rstudio-connect:2021.12.1
6+
image: rstudio/rstudio-connect:latest
77
restart: always
88
ports:
99
- 3939:3939

script/setup-rsconnect/rstudio-connect.gcfg

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ Provider = pam
1212
DefaultUserRole = publisher
1313

1414
[Python]
15-
Enabled = false
15+
Enabled = true
16+
Executable = /opt/python/3.8.10/bin/python
17+
Executable = /opt/python/3.9.5/bin/python
1618

1719
[RPackageRepository "CRAN"]
1820
URL = https://packagemanager.rstudio.com/cran/__linux__/bionic/latest

setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ install_requires =
3434
pins
3535
rsconnect-python
3636
plotly
37+
pip-tools
3738
importlib-metadata>=4.4 # NOTE: Remove when python_requires>=3.8
3839

3940
[options.extras_require]

vetiver/attach_pkgs.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,5 @@ def load_pkgs(model: VetiverModel = None, packages: list = None, path=""):
2929
for package in required_pkgs:
3030
f.write(package + "\n")
3131

32-
os.system(f"pip-compile {tmp.name} --output-file={path}vetiver_requirements.txt")
32+
os.system(f"pip-compile {tmp.name} --output-file={path}requirements.txt")
3333
os.remove(tmp.name)

vetiver/tests/test_rsconnect.py

Lines changed: 40 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,27 @@
11
import pytest
22
import json
33
import sklearn
4+
import pins
5+
import pandas as pd
6+
import numpy as np
7+
48
from pins.boards import BoardRsConnect
59
from pins.rsconnect.api import RsConnectApi
610
from pins.rsconnect.fs import RsConnectFs
7-
from rsconnect.api import RSConnectServer
11+
from rsconnect.api import RSConnectServer, RSConnectClient
812

913
import vetiver
1014

11-
# Load data, model
12-
X_df, y = vetiver.mock.get_mock_data()
13-
model = vetiver.mock.get_mock_model().fit(X_df, y)
14-
1515
RSC_SERVER_URL = "http://localhost:3939"
1616
RSC_KEYS_FNAME = "vetiver/tests/rsconnect_api_keys.json"
1717

1818
pytestmark = pytest.mark.rsc_test # noqa
1919

2020

21-
def server_from_key(name):
21+
def get_key(name):
2222
with open(RSC_KEYS_FNAME) as f:
2323
api_key = json.load(f)[name]
24-
return RSConnectServer(RSC_SERVER_URL, api_key)
24+
return api_key
2525

2626

2727
def rsc_from_key(name):
@@ -59,27 +59,42 @@ def rsc_short():
5959
rsc_delete_user_content(fs_susan.api)
6060

6161

62-
def test_board_pin_write(rsc_short):
63-
v = vetiver.VetiverModel(
64-
model=model, ptype_data=X_df, model_name="susan/model", versioned=None
65-
)
66-
vetiver.vetiver_pin_write(board=rsc_short, model=v)
67-
assert isinstance(rsc_short.pin_read("susan/model"), sklearn.dummy.DummyRegressor)
62+
def test_deploy(rsc_short):
63+
np.random.seed(500)
6864

65+
# Load data, model
66+
X_df, y = vetiver.mock.get_mock_data()
67+
model = vetiver.mock.get_mock_model().fit(X_df, y)
6968

70-
@pytest.mark.xfail
71-
def test_deploy(rsc_short):
72-
v = vetiver.VetiverModel(
73-
model=model, ptype_data=X_df, model_name="susan/model", versioned=None
74-
)
69+
v = vetiver.VetiverModel(model=model, ptype_data=X_df, model_name="susan/model")
7570

76-
vetiver.vetiver_pin_write(board=rsc_short, model=v)
77-
connect_server = RSConnectServer(
78-
url=RSC_SERVER_URL, api_key=server_from_key("susan")
71+
board = pins.board_rsconnect(
72+
server_url=RSC_SERVER_URL, api_key=get_key("susan"), allow_pickle_read=True
7973
)
74+
75+
vetiver.vetiver_pin_write(board=board, model=v)
76+
connect_server = RSConnectServer(url=RSC_SERVER_URL, api_key=get_key("susan"))
77+
assert isinstance(board.pin_read("susan/model"), sklearn.dummy.DummyRegressor)
78+
8079
vetiver.deploy_rsconnect(
81-
connect_server=connect_server, board=rsc_short, pin_name="susan/model"
80+
connect_server=connect_server,
81+
board=board,
82+
pin_name="susan/model",
83+
title="testapi",
84+
extra_files=["requirements.txt"],
8285
)
83-
response = vetiver.predict(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()
86+
87+
# get url of where content lives
88+
client = RSConnectClient(connect_server)
89+
dicts = client.content_search()
90+
rsc_api = list(filter(lambda x: x["title"] == "testapi", dicts))
91+
content_url = rsc_api[0].get("content_url")
92+
93+
h = {"Authorization": f'Key {get_key("susan")}'}
94+
95+
endpoint = vetiver.vetiver_endpoint(content_url + "/predict")
96+
response = vetiver.predict(endpoint, X_df, headers=h)
97+
98+
assert isinstance(response, pd.DataFrame), response
99+
assert response.iloc[0, 0] == 44.47
100+
assert len(response) == 100

0 commit comments

Comments
 (0)