Skip to content

Commit 7a2eaf8

Browse files
authored
Merge pull request #127 from ganesh-k13/enh_py_version
ENH: Added Python version to `vetiver_pin_write`
2 parents 84d03ff + 9325d35 commit 7a2eaf8

File tree

4 files changed

+46
-1
lines changed

4 files changed

+46
-1
lines changed

vetiver/meta.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import sys
12
from dataclasses import dataclass, asdict, field
23
from typing import Mapping
34

@@ -10,6 +11,7 @@ class VetiverMeta:
1011
version: "str | None" = None
1112
url: "str | None" = None
1213
required_pkgs: "list | None" = field(default_factory=list)
14+
python_version: "tuple | None" = None
1315

1416
def to_dict(self) -> Mapping:
1517
data = asdict(self)
@@ -25,9 +27,10 @@ def from_dict(cls, metadata, pip_name=None) -> "VetiverMeta":
2527
version = metadata.get("version", None)
2628
url = metadata.get("url", None)
2729
required_pkgs = metadata.get("required_pkgs", [])
30+
python_version = tuple(metadata.get("python_version", sys.version_info))
2831

2932
if pip_name:
3033
if not list(filter(lambda x: pip_name in x, required_pkgs)):
3134
required_pkgs = required_pkgs + [f"{pip_name}"]
3235

33-
return cls(user, version, url, required_pkgs)
36+
return cls(user, version, url, required_pkgs, python_version)

vetiver/pin_read_write.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ def vetiver_pin_write(board, model: VetiverModel, versioned: bool = True):
7070
"vetiver_meta": {
7171
"required_pkgs": model.metadata.required_pkgs,
7272
"prototype": None if not model.prototype else model.prototype().json(),
73+
"python_version": list(model.metadata.python_version),
7374
},
7475
},
7576
versioned=versioned,

vetiver/tests/test_build_vetiver_model.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import sklearn
2+
import sys
23

34
import vetiver as vt
45
from vetiver.meta import VetiverMeta
@@ -113,6 +114,7 @@ def test_vetiver_model_use_ptype():
113114
version=None,
114115
url=None,
115116
required_pkgs=["scikit-learn"],
117+
python_version=tuple(sys.version_info),
116118
)
117119

118120

@@ -137,5 +139,41 @@ def test_vetiver_model_from_pin():
137139
assert v2.metadata.user == {"test": 123}
138140
assert v2.metadata.version is not None
139141
assert v2.metadata.required_pkgs == ["scikit-learn"]
142+
assert v2.metadata.python_version == tuple(sys.version_info)
143+
144+
board.pin_delete("model")
145+
146+
147+
def test_vetiver_model_from_pin_user_metadata():
148+
"""
149+
Test if standard keys as part of :dataclass:`VetiverMeta` are picked
150+
"""
151+
custom_meta = {
152+
"test": 123,
153+
"required_pkgs": ["foo", "bar"],
154+
"python_version": [3, 10, 6, "final", 0],
155+
}
156+
loaded_pkgs = custom_meta["required_pkgs"] + ["scikit-learn"]
157+
158+
v = vt.VetiverModel(
159+
model=model,
160+
prototype_data=X_df,
161+
model_name="model",
162+
versioned=None,
163+
description=None,
164+
metadata=custom_meta,
165+
)
166+
167+
board = pins.board_temp(allow_pickle_read=True)
168+
vt.vetiver_pin_write(board=board, model=v)
169+
v2 = vt.VetiverModel.from_pin(board, "model")
170+
171+
assert isinstance(v2, vt.VetiverModel)
172+
assert isinstance(v2.model, sklearn.base.BaseEstimator)
173+
assert isinstance(v2.prototype.construct(), pydantic.BaseModel)
174+
assert v2.metadata.user == custom_meta
175+
assert v2.metadata.version is not None
176+
assert v2.metadata.required_pkgs == loaded_pkgs
177+
assert v2.metadata.python_version == tuple(custom_meta["python_version"])
140178

141179
board.pin_delete("model")

vetiver/vetiver_model.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ def from_pin(cls, board, name: str, version: str = None):
102102
if "vetiver_meta" in meta.user:
103103
get_prototype = meta.user.get("vetiver_meta").get("prototype", None)
104104
required_pkgs = meta.user.get("vetiver_meta").get("required_pkgs", None)
105+
python_version = meta.user.get("vetiver_meta").get("python_version", None)
105106
meta.user.pop("vetiver_meta")
106107
else:
107108
# ptype = meta.user.get("ptype", None)
@@ -113,6 +114,7 @@ def from_pin(cls, board, name: str, version: str = None):
113114
# get_prototype = None
114115

115116
required_pkgs = meta.user.get("required_pkgs")
117+
python_version = meta.user.get("python_version")
116118

117119
return cls(
118120
model=model,
@@ -123,6 +125,7 @@ def from_pin(cls, board, name: str, version: str = None):
123125
"version": meta.version.version,
124126
"url": meta.local.get("url"), # None all the time, besides Connect,
125127
"required_pkgs": required_pkgs,
128+
"python_version": python_version,
126129
},
127130
prototype_data=json.loads(get_prototype) if get_prototype else None,
128131
versioned=True,

0 commit comments

Comments
 (0)