Skip to content

Commit fd436e1

Browse files
committed
move get_board_pkgs to attach_pkgs.py
1 parent 9533565 commit fd436e1

5 files changed

Lines changed: 61 additions & 53 deletions

File tree

vetiver/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from .server import VetiverAPI, vetiver_endpoint, predict # noqa
88
from .mock import get_mock_data, get_mock_model # noqa
99
from .pin_read_write import vetiver_pin_write # noqa
10-
from .attach_pkgs import load_pkgs # noqa
10+
from .attach_pkgs import load_pkgs, get_board_pkgs # noqa
1111
from .meta import VetiverMeta # noqa
1212
from .write_docker import write_docker, prepare_docker # noqa
1313
from .write_fastapi import write_app, vetiver_write_app # noqa

vetiver/attach_pkgs.py

Lines changed: 46 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,33 @@
11
import tempfile
22
import os
3+
import warnings
4+
from typing import List
35
from .vetiver_model import VetiverModel
46
from .meta import VetiverMeta
57

68

79
def load_pkgs(model: VetiverModel = None, packages: list = None, path=""):
810
"""Load packages necessary for predictions
911
10-
Args
11-
----
12-
model: VetiverModel
13-
VetiverModel to extract packages from
14-
packages: list
15-
List of extra packages to include
16-
path: str
17-
Where to save output file
12+
Parameters
13+
----------
14+
model: VetiverModel
15+
VetiverModel to extract packages from
16+
packages: list
17+
List of extra packages to include
18+
path: str
19+
Where to save output file
1820
"""
1921

2022
required_pkgs = ["vetiver"]
2123
if packages:
22-
required_pkgs = list(set(required_pkgs + packages))
24+
required_pkgs += packages
2325

2426
if isinstance(model.metadata, dict):
2527
model.metadata = VetiverMeta.from_dict(model.metadata)
2628

2729
if model.metadata.required_pkgs:
28-
required_pkgs = list(set(required_pkgs + model.metadata.required_pkgs))
30+
required_pkgs += model.metadata.required_pkgs
2931

3032
tmp = tempfile.NamedTemporaryFile(suffix=".in", delete=False)
3133
tmp.close()
@@ -36,3 +38,37 @@ def load_pkgs(model: VetiverModel = None, packages: list = None, path=""):
3638

3739
os.system(f"pip-compile {tmp.name} --output-file={path}requirements.txt")
3840
os.remove(tmp.name)
41+
42+
43+
def get_board_pkgs(board) -> List[str]:
44+
"""
45+
Extract packages required for pin board authorization
46+
47+
Parameters
48+
----------
49+
board:
50+
A pin board, created by `pins.board_folder()` or another `board_` function.
51+
52+
Returns
53+
--------
54+
list[str]
55+
"""
56+
prot = board.fs.protocol
57+
58+
if prot == "rsc":
59+
return ["rsconnect-python"]
60+
elif prot == "file":
61+
return []
62+
elif prot == ["s3", "s3a"]:
63+
return ["s3fs"]
64+
elif prot == "abfs":
65+
return ["adlfs"]
66+
elif prot == ("gcs", "gs"):
67+
return ["gcsfs"]
68+
else:
69+
warnings.warn(
70+
f"required packages unknown for board protocol: {prot}, "
71+
"add to model's metadata to export",
72+
UserWarning,
73+
)
74+
return []

vetiver/pin_read_write.py

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from .utils import inform
44
import warnings
55
import logging
6-
from typing import List
76

87
_log = logging.getLogger(__name__)
98

@@ -116,36 +115,3 @@ def vetiver_pin_read(board, name: str, version: str = None) -> VetiverModel:
116115
v = VetiverModel.from_pin(board=board, name=name, version=version)
117116

118117
return v
119-
120-
121-
def _get_board_pkgs(board) -> List[str]:
122-
"""
123-
Extract packages required for pin board authorization
124-
125-
Parameters
126-
----------
127-
board:
128-
A pin board, created by `pins.board_folder()` or another `board_` function.
129-
130-
Returns
131-
--------
132-
list[str]
133-
"""
134-
prot = board.fs.protocol
135-
136-
if prot == "rsc":
137-
return ["rsconnect-python"]
138-
elif prot == "file":
139-
return []
140-
elif prot == ["s3", "s3a"]:
141-
return ["s3fs"]
142-
elif prot == "abfs":
143-
return ["adlfs"]
144-
elif prot == ("gcs", "gs"):
145-
return ["gcsfs"]
146-
else:
147-
warnings.warn(
148-
f"required packages unknown for board protocol: {prot}, "
149-
"add to model's metadata to export"
150-
)
151-
return []

vetiver/vetiver_model.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import json
22
from warnings import warn
33
from vetiver.handlers.base import create_handler
4-
from .pin_read_write import _get_board_pkgs
54

65

76
class NoModelAvailableError(Exception):
@@ -100,15 +99,13 @@ def from_pin(cls, board, name: str, version: str = None):
10099

101100
if "vetiver_meta" in meta.user:
102101
get_prototype = meta.user.get("vetiver_meta").get("prototype", None)
103-
required_pkgs = meta.user.get("vetiver_meta").get(
104-
"required_pkgs", None
105-
) + _get_board_pkgs(board)
102+
required_pkgs = meta.user.get("vetiver_meta").get("required_pkgs", None)
106103
python_version = meta.user.get("vetiver_meta").get("python_version", None)
107104
meta.user.pop("vetiver_meta")
108105
# old pin type
109106
else:
110107
get_prototype = meta.user.get("ptype")
111-
required_pkgs = meta.user.get("required_pkgs") + _get_board_pkgs(board)
108+
required_pkgs = meta.user.get("required_pkgs")
112109
python_version = meta.user.get("python_version")
113110

114111
return cls(

vetiver/write_docker.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from pathlib import Path
44

55
from .write_fastapi import write_app
6-
from .attach_pkgs import load_pkgs
6+
from .attach_pkgs import load_pkgs, get_board_pkgs
77
from .vetiver_model import VetiverModel
88

99

@@ -101,7 +101,7 @@ def prepare_docker(
101101
board,
102102
pin_name: str,
103103
path: str = "./",
104-
version=None,
104+
version: str = None,
105105
rspm_env: bool = False,
106106
host: str = "0.0.0.0",
107107
port: str = "8080",
@@ -137,11 +137,20 @@ def prepare_docker(
137137
>>> v = vetiver.VetiverModel(model, "my_model", prototype_data = X)
138138
>>> vetiver.vetiver_pin_write(board, v)
139139
>>> vetiver.prepare_docker(board = board, pin_name = "my_model", path = tmp.name)
140+
141+
Notes
142+
------
143+
This function uses `vetiver.get_board_pkgs(board)` for generating requirements.
144+
For more complex use cases, call `write_docker()`, `load_pkgs()`, and
145+
`write_app()` individually.
140146
"""
141147

142148
v = VetiverModel.from_pin(board=board, name=pin_name, version=version)
149+
143150
write_app(
144151
board=board, pin_name=pin_name, version=version, file=Path(path, "app.py")
145152
)
146-
load_pkgs(v, path=Path(path, "vetiver_"))
153+
154+
load_pkgs(v, path=Path(path, "vetiver_"), packages=get_board_pkgs(board))
155+
147156
write_docker(path=path, rspm_env=rspm_env, host=host, port=port)

0 commit comments

Comments
 (0)