Skip to content

Commit a019f5d

Browse files
committed
update names
1 parent 8c8e5ed commit a019f5d

9 files changed

Lines changed: 121 additions & 32 deletions

vetiver/__init__.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
"""vetiver - Python parallel to R vetiver package"""
22

3-
__version__ = "0.1.3"
3+
__version__ = "0.1.4"
44
__author__ = "Isabel Zimmerman <isabel.zimmerman@rstudio.com>"
55
__all__ = []
66

77
import importlib
88
from .ptype import *
9-
from .vetiver_model import *
10-
from .server import *
11-
from .mock import *
12-
from .pin_read_write import *
9+
from .vetiver_model import VetiverModel
10+
from .server import VetiverAPI, vetiver_endpoint
11+
from .mock import get_mock_data, get_mock_model
12+
from .pin_read_write import vetiver_pin_write
1313
from .attach_pkgs import *
1414
from .meta import *
15-
from .write_docker import *
16-
from .write_fastapi import *
15+
from .write_docker import write_docker
16+
from .write_fastapi import write_app
1717
from .handlers._interface import create_handler, InvalidModelError
1818
from .handlers.base import VetiverHandler
1919
from .handlers.sklearn import SKLearnHandler

vetiver/meta.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
def vetiver_meta(user: dict = None, version: str = None,
1+
def _model_meta(user: dict = None, version: str = None,
22
url: str = None, required_pkgs: list = None):
33
"""Populate relevant metadata for VetiverModel
44

vetiver/pin_read_write.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import json
55

66
from .vetiver_model import VetiverModel
7-
from .meta import vetiver_meta
7+
from .meta import _model_meta
88
from .write_fastapi import _choose_version
99

1010
def vetiver_pin_write(board, model: VetiverModel, versioned: bool=True):
@@ -65,6 +65,9 @@ def vetiver_pin_read(board, name: str, version: str = None) -> VetiverModel:
6565
If reading a board from RSConnect, the `board` argument must be in "username/modelname" format.
6666
6767
"""
68+
69+
raise DeprecationWarning("vetiver_pin_read is now a classmethod VetiverModel.from_pin()")
70+
6871
version = version if version is not None else _choose_version(board.pin_versions(name))
6972

7073
model = board.pin_read(name, version)
@@ -73,7 +76,7 @@ def vetiver_pin_read(board, name: str, version: str = None) -> VetiverModel:
7376
v = VetiverModel(model = model,
7477
model_name = name,
7578
description = meta.description,
76-
metadata = vetiver_meta(user = meta.user,
79+
metadata = _model_meta(user = meta.user,
7780
version = version,
7881
url = meta.user.get("url"), # None all the time, besides Connect
7982
required_pkgs = meta.user.get("required_pkgs")

vetiver/tests/test_build_vetiver_model.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22

33
from vetiver.vetiver_model import VetiverModel
44
from vetiver.mock import get_mock_data, get_mock_model
5+
from vetiver.pin_read_write import pin_write
56

67
import pandas as pd
7-
from numpy import int64
8+
import pydantic
9+
import pins
810

911
# Load data, model
1012
X_df, y = get_mock_data()
@@ -24,6 +26,7 @@ def test_vetiver_model_array_ptype():
2426
)
2527

2628
assert vt1.model == model
29+
assert isinstance(vt1.ptype.construct(), pydantic.BaseModel)
2730
assert list(vt1.ptype.__fields__.values())[0].type_ == int
2831

2932

@@ -39,6 +42,7 @@ def test_vetiver_model_df_ptype():
3942
)
4043

4144
assert vt2.model == model
45+
assert isinstance(vt2.ptype.construct(), pydantic.BaseModel)
4246
assert list(vt2.ptype.__fields__.values())[0].type_ == int
4347

4448

@@ -54,6 +58,7 @@ def test_vetiver_model_dict_ptype():
5458
)
5559

5660
assert vt3.model == model
61+
assert isinstance(vt3.ptype.construct(), pydantic.BaseModel)
5762
assert list(vt3.ptype.__fields__.values())[0].type_ == int
5863

5964

@@ -70,3 +75,21 @@ def test_vetiver_model_no_ptype():
7075

7176
assert vt4.model == model
7277
assert vt4.ptype == None
78+
79+
def test_vetiver_model_from_pin():
80+
81+
v = VetiverModel(
82+
model=model,
83+
ptype_data=None,
84+
model_name="iris",
85+
versioned=None,
86+
description=None,
87+
metadata=None,
88+
)
89+
board = pins.board_temp(allow_pickle_read=True)
90+
vetiver_pin_write(board=board, model=v)
91+
v = VetiverModel.from_pin(board, "model")
92+
assert isinstance(v, VetiverModel)
93+
assert vt5.model == model
94+
assert isinstance(vt5.ptype.construct(), pydantic.BaseModel)
95+
board.pin_delete("model")

vetiver/tests/test_write_app.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@
77
X_df, y = vetiver.get_mock_data()
88
model = vetiver.get_mock_model().fit(X_df, y)
99

10-
def test_vetiver_write_app():
10+
def test_write_app():
1111
file = "app.py"
1212
v = vetiver.VetiverModel(model=model, ptype_data=X_df,
1313
model_name="model", versioned=None)
1414
model_board = pins.board_folder(path=".", versioned=True, allow_pickle_read=True)
1515
vetiver.vetiver_pin_write(board=model_board, model=v)
16-
vetiver.vetiver_write_app(model_board, "model", file = "app.py")
16+
vetiver.write_app(model_board, "model", file = "app.py")
1717
contents = open(file).read()
1818
os.remove(file)
1919
version = model_board.pin_versions("model").sort_values(by='created', ascending=False)

vetiver/tests/test_write_docker.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
def test_vetiver_write_app_no_rspm():
1111
py_version = str(sys.version_info.major) + "." + str(sys.version_info.minor)
1212
file = "Dockerfile"
13-
vetiver.vetiver_write_docker(rspm_env=False, path = "./")
13+
vetiver.write_docker(rspm_env=False, path = "./")
1414
contents = open(file).read()
1515
os.remove(file)
1616
assert(contents == f"""# # Generated by the vetiver package; edit with care
@@ -38,7 +38,7 @@ def test_vetiver_write_app_no_rspm():
3838

3939
def test_vetiver_write_app_rspm():
4040
file = "Dockerfile"
41-
vetiver.vetiver_write_docker(rspm_env=True, path = "./")
41+
vetiver.write_docker(rspm_env=True, path = "./")
4242
contents = open(file).read()
4343
os.remove(file)
4444
py_version = str(sys.version_info.major) + "." + str(sys.version_info.minor)

vetiver/vetiver_model.py

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1+
import json
2+
13
from vetiver.handlers._interface import create_handler
4+
from .meta import _model_meta
5+
from .write_fastapi import _choose_version
6+
27

38

49
class NoModelAvailableError(Exception):
@@ -62,11 +67,38 @@ def __init__(
6267
self.model = translator.model
6368
self.ptype = translator.construct_ptype()
6469
self.model_name = model_name
65-
self.description = description if description else translator.describe()
70+
self.description = (
71+
description if description else translator.describe()
72+
)
6673
self.versioned = versioned
67-
self.metadata = translator.create_meta(
74+
self.metadata = metadata if metadata else translator.create_meta(
6875
metadata, required_pkgs=["vetiver"]
6976
)
7077
self.handler_predict = translator.handler_predict
7178

72-
79+
@classmethod
80+
def from_pin(cls, board, name: str, version: str = None):
81+
version = (
82+
version
83+
if version is not None
84+
else _choose_version(board.pin_versions(name))
85+
)
86+
87+
model = board.pin_read(name, version)
88+
meta = board.pin_meta(name)
89+
90+
return cls(
91+
model=model,
92+
model_name=name,
93+
description=meta.description,
94+
metadata=_model_meta(
95+
user=meta.user,
96+
version=version,
97+
url=meta.user.get("url"), # None all the time, besides Connect
98+
required_pkgs=meta.user.get("required_pkgs"),
99+
),
100+
ptype_data=json.loads(meta.user.get("ptype"))
101+
if meta.user.get("ptype")
102+
else None,
103+
versioned=True,
104+
)

vetiver/write_docker.py

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,32 @@
11
import sys
2+
import warnings
23

3-
def vetiver_write_docker(app_file: str = "app.py",
4+
5+
def vetiver_write_docker(
6+
app_file: str = "app.py",
47
path: str = "./",
58
rspm_env: bool = False,
69
host: str = "0.0.0.0",
7-
port: str = "8080"):
10+
port: str = "8080",
11+
):
12+
13+
warnings.warn(
14+
"vetiver_write_docker will be replaced by write_docker in v1.0.0",
15+
DeprecationWarning,
16+
)
17+
18+
return write_docker(
19+
app_file=app_file, path=path, rspm_env=rspm_env, host=host, port=port
20+
)
21+
22+
23+
def write_docker(
24+
app_file: str = "app.py",
25+
path: str = "./",
26+
rspm_env: bool = False,
27+
host: str = "0.0.0.0",
28+
port: str = "8080",
29+
):
830
"""Writes a Dockerfile to run VetiverAPI in a container
931
1032
Args
@@ -27,7 +49,6 @@ def vetiver_write_docker(app_file: str = "app.py",
2749
else:
2850
rspm = ""
2951

30-
3152
docker_script = f"""# # Generated by the vetiver package; edit with care
3253
# start with python base image
3354
FROM python:{py_version}

vetiver/write_fastapi.py

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import pandas as pd
33
import warnings
44

5+
56
def _choose_version(df: pd.DataFrame):
67
"""Choose pin version to load
78
@@ -10,10 +11,10 @@ def _choose_version(df: pd.DataFrame):
1011
df: pd.DataFrame
1112
Available pins versions
1213
"""
13-
if 'active' in df.columns:
14+
if "active" in df.columns:
1415
version = df.active[0]
15-
elif 'created' in df.columns:
16-
version_desc = df.sort_values(by='created', ascending=False)
16+
elif "created" in df.columns:
17+
version_desc = df.sort_values(by="created", ascending=False)
1718
version = version_desc.version[0]
1819
else:
1920
version = df.version[0]
@@ -24,6 +25,7 @@ def _choose_version(df: pd.DataFrame):
2425
)
2526
return version
2627

28+
2729
def _glue_required_pkgs(required_pkgs: list):
2830
"""Generate import statements
2931
@@ -39,8 +41,17 @@ def _glue_required_pkgs(required_pkgs: list):
3941

4042
return load_required_pkgs
4143

42-
def vetiver_write_app(board, pin_name: str,
43-
version: str = None, file: str = "app.py"):
44+
45+
def vetiver_write_app(board, pin_name: str, version: str = None, file: str = "app.py"):
46+
47+
warnings.warn(
48+
"vetiver_write_app will be replaced by write_app in v1.0.0", DeprecationWarning
49+
)
50+
51+
return write_app(board=board, pin_name=pin_name, version=version, file=file)
52+
53+
54+
def write_app(board, pin_name: str, version: str = None, file: str = "app.py"):
4455
"""Write VetiverAPI app to a file
4556
4657
Args
@@ -49,9 +60,9 @@ def vetiver_write_app(board, pin_name: str,
4960
API to be written
5061
pin_name : string
5162
Name of pin containing VetiverModel
52-
version :
63+
version :
5364
Pins version of VetiverModel
54-
file :
65+
file :
5566
Name of file
5667
"""
5768

@@ -60,15 +71,14 @@ def vetiver_write_app(board, pin_name: str,
6071
version = board.pin_versions(pin_name)
6172
version = _choose_version(version)
6273
pin_read = f"v = vetiver.vetiver_pin_read(b, {repr(pin_name)}, version = {repr(version)})"
63-
74+
6475
else:
6576
pin_read = f"v = vetiver.pin_read_write.vetiver_pin_read(b, {repr(pin_name)})"
6677

67-
infra_pkgs = ['vetiver', 'pins']
68-
78+
infra_pkgs = ["vetiver", "pins"]
6979

7080
load_board = pins.board_deparse(board)
71-
81+
7282
f = open(file, "x")
7383

7484
app = f"""{_glue_required_pkgs(infra_pkgs)}

0 commit comments

Comments
 (0)