From fbc5d5df73391776c4a76084e925175a1dfb0af1 Mon Sep 17 00:00:00 2001 From: isabelizimm Date: Tue, 19 Jul 2022 13:56:53 -0400 Subject: [PATCH] pre-commit fixing --- .pre-commit-config.yaml | 2 +- Makefile | 4 +++ examples/coffeeratings.py | 30 ++++++++++++++----- examples/coffeeratings/app.py | 4 +-- .../coffeeratings/vetiver_requirements.txt | 2 +- vetiver/__init__.py | 4 +-- vetiver/data/__init__.py | 1 + vetiver/pin_read_write.py | 6 ++-- vetiver/ptype.py | 2 +- vetiver/rsconnect.py | 11 ++++--- vetiver/tests/snapshots/test_monitor.json | 2 +- vetiver/tests/test_build_vetiver_model.py | 3 +- vetiver/tests/test_rsconnect.py | 11 +++---- vetiver/tests/test_write_docker.py | 1 - vetiver/utils.py | 5 ++-- vetiver/write_docker.py | 2 +- 16 files changed, 53 insertions(+), 37 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2549f627..ddf06e74 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ -exclude: "(.*\\.csv)|(^pins/tests/_snapshots)" +exclude: "(.*\\.csv)|(^examples/)" repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v2.4.0 diff --git a/Makefile b/Makefile index 56c681e0..5fe52656 100644 --- a/Makefile +++ b/Makefile @@ -20,6 +20,7 @@ help: @echo "clean-test - remove test and coverage artifacts" @echo "lint - check style with flake8" @echo "test - run tests quickly with the default Python" + @echo "test-rsc - run tests for rsconnect" @echo "coverage - check code coverage quickly with the default Python" @echo "docs - generate Sphinx HTML documentation, including API docs" @echo "cdocs - cleanout previous build & generate Sphinx HTML documentation, including API docs" @@ -54,6 +55,9 @@ lint: flake8 vetiver test: clean-test + pytest -m 'not rsc_test' + +test-rsc: clean-test pytest coverage: diff --git a/examples/coffeeratings.py b/examples/coffeeratings.py index b5b6fdec..0abf0bae 100644 --- a/examples/coffeeratings.py +++ b/examples/coffeeratings.py @@ -6,18 +6,32 @@ from pathlib import Path # Load training data -raw = pd.read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-07-07/coffee_ratings.csv') +raw = pd.read_csv( + "https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-07-07/coffee_ratings.csv" +) df = pd.DataFrame(raw) -coffee = df[["total_cup_points", "aroma", "flavor", "sweetness", "acidity", \ - "body", "uniformity", "balance"]].dropna() - -X_train, X_test, y_train, y_test = model_selection.train_test_split(coffee.iloc[:,1:],coffee['total_cup_points'],test_size=0.2) +coffee = df[ + [ + "total_cup_points", + "aroma", + "flavor", + "sweetness", + "acidity", + "body", + "uniformity", + "balance", + ] +].dropna() + +X_train, X_test, y_train, y_test = model_selection.train_test_split( + coffee.iloc[:, 1:], coffee["total_cup_points"], test_size=0.2 +) # fit model lr_fit = LinearRegression().fit(X_train, y_train) # create vetiver model -v = vetiver.VetiverModel(lr_fit, ptype_data=X_train, model_name = "v") +v = vetiver.VetiverModel(lr_fit, ptype_data=X_train, model_name="v") # version model via pin from pins import board_folder @@ -27,12 +41,12 @@ model_board = board_folder(path=path, versioned=True, allow_pickle_read=True) vetiver_pin_write(board=model_board, model=v) -myapp = vetiver.VetiverAPI(v, check_ptype = True) +myapp = vetiver.VetiverAPI(v, check_ptype=True) api = myapp.app # next, run myapp.run() to start API and see visual documentation # create app.py file that includes pinned VetiverAPI to be deployed -vetiver.vetiver_write_app(model_board, "v", file = path+"app.py") +vetiver.vetiver_write_app(model_board, "v", file=path + "app.py") # automatically create requirements.txt vetiver.load_pkgs(model=v, path=path) diff --git a/examples/coffeeratings/app.py b/examples/coffeeratings/app.py index 4d162930..089f2d62 100644 --- a/examples/coffeeratings/app.py +++ b/examples/coffeeratings/app.py @@ -2,8 +2,8 @@ import pins # edited to reflect Docker container path, and allow_pickle_read=True -b = pins.board_folder('/code/app', allow_pickle_read=True) -v = vetiver.vetiver_pin_read(b, 'v', version = '20220415T174503Z-06d9b') +b = pins.board_folder("/code/app", allow_pickle_read=True) +v = vetiver.vetiver_pin_read(b, "v", version="20220415T174503Z-06d9b") vetiver_api = vetiver.VetiverAPI(v) api = vetiver_api.app diff --git a/examples/coffeeratings/vetiver_requirements.txt b/examples/coffeeratings/vetiver_requirements.txt index b541702d..e86ec873 100644 --- a/examples/coffeeratings/vetiver_requirements.txt +++ b/examples/coffeeratings/vetiver_requirements.txt @@ -72,4 +72,4 @@ uvicorn==0.17.6 # via vetiver # manually edited to reflect appropriate versions of packages currently being developed -git+https://github.com/isabelizimm/vetiver-python.git@37dff15a63238b1e6c44788af70473f19c29d83e \ No newline at end of file +git+https://github.com/isabelizimm/vetiver-python.git@37dff15a63238b1e6c44788af70473f19c29d83e diff --git a/vetiver/__init__.py b/vetiver/__init__.py index d20aeb1c..b296a134 100644 --- a/vetiver/__init__.py +++ b/vetiver/__init__.py @@ -14,8 +14,8 @@ from .handlers.base import BaseHandler, create_handler, InvalidModelError # noqa from .handlers.sklearn import SKLearnHandler # noqa from .handlers.torch import TorchHandler # noqa -from .rsconnect import deploy_rsconnect # noqa -from .monitor import compute_metrics, pin_metrics, plot_metrics, _rolling_df # noqa +from .rsconnect import deploy_rsconnect # noqa +from .monitor import compute_metrics, pin_metrics, plot_metrics, _rolling_df # noqa __author__ = "Isabel Zimmerman " __all__ = [] diff --git a/vetiver/data/__init__.py b/vetiver/data/__init__.py index f48bbb96..d6d8aad7 100644 --- a/vetiver/data/__init__.py +++ b/vetiver/data/__init__.py @@ -12,6 +12,7 @@ def __dir__(): def __getattr__(k): import pandas as pd + f_path = sources.get("mtcars") if k == "chicago": f_path = sources.get("chicago") diff --git a/vetiver/pin_read_write.py b/vetiver/pin_read_write.py index f7853c35..f8d49dde 100644 --- a/vetiver/pin_read_write.py +++ b/vetiver/pin_read_write.py @@ -61,12 +61,14 @@ def vetiver_pin_read(board, name: str, version: str = None) -> VetiverModel: Notes ----- - If reading a board from RSConnect, the `board` argument must be in "username/modelname" format. + If reading a board from RSConnect, the `board` argument must be in + "username/modelname" format. """ warnings.warn( - "vetiver_pin_read will be removed in v1.0.0. Use classmethod VetiverModel.from_pin() instead", + "vetiver_pin_read will be removed in v1.0.0. Use classmethod " + "VetiverModel.from_pin() instead", DeprecationWarning, ) diff --git a/vetiver/ptype.py b/vetiver/ptype.py index ba9642c8..f27211c7 100644 --- a/vetiver/ptype.py +++ b/vetiver/ptype.py @@ -19,7 +19,7 @@ class NoAvailablePTypeError(Exception): def __init__( self, - message="There is no method available to create a 0-row input data prototype for `model`", + message="There is no method to create a 0-row input data prototype for `model`", ): self.message = message super().__init__(self.message) diff --git a/vetiver/rsconnect.py b/vetiver/rsconnect.py index 6160b1d2..2da218f5 100644 --- a/vetiver/rsconnect.py +++ b/vetiver/rsconnect.py @@ -26,16 +26,16 @@ def deploy_rsconnect( Parameters ---------- - connect_server: + connect_server: RSConnect Server - board: + board: Pins board pin_name: str Name of pin version: str Version of pin extra_files: typing.List[str] - Any extra files to include in + Any extra files to include in new: Force as a new deploy app_id: @@ -46,7 +46,7 @@ def deploy_rsconnect( Optional name of a Python executable conda_mode: bool Use conda to build an environment.yml - force_generate: bool + force_generate: bool Force generating "requirements.txt" or "environment.yml" log_callback: typing.Callable Callback to use to write the log to @@ -64,11 +64,10 @@ def deploy_rsconnect( shutil.copyfile(file, os.path.join(temp, filename)) new_files = new_files + [os.path.join(temp, filename)] extra_files = new_files - + if board.fs.protocol == "file": shutil.copytree(board.path_to_pin(pin_name), os.path.join(temp, pin_name)) - tmp_app = temp + "/app.py" write_app( diff --git a/vetiver/tests/snapshots/test_monitor.json b/vetiver/tests/snapshots/test_monitor.json index 7a145446..e9494d4a 100644 --- a/vetiver/tests/snapshots/test_monitor.json +++ b/vetiver/tests/snapshots/test_monitor.json @@ -1 +1 @@ -{"index":{"0":1325376000000,"1":1325376000000,"2":1325376002000,"3":1325376002000,"4":1325376004000,"5":1325376004000,"6":1325376006000,"7":1325376006000,"8":1325376008000,"9":1325376008000},"n":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2},"metric":{"0":"mean_squared_error","1":"mean_absolute_error","2":"mean_squared_error","3":"mean_absolute_error","4":"mean_squared_error","5":"mean_absolute_error","6":"mean_squared_error","7":"mean_absolute_error","8":"mean_squared_error","9":"mean_absolute_error"},"estimate":{"0":0.0,"1":0.0,"2":0.0,"3":0.0,"4":0.0,"5":0.0,"6":0.0,"7":0.0,"8":0.0,"9":0.0}} \ No newline at end of file +{"index":{"0":1325376000000,"1":1325376000000,"2":1325376002000,"3":1325376002000,"4":1325376004000,"5":1325376004000,"6":1325376006000,"7":1325376006000,"8":1325376008000,"9":1325376008000},"n":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2},"metric":{"0":"mean_squared_error","1":"mean_absolute_error","2":"mean_squared_error","3":"mean_absolute_error","4":"mean_squared_error","5":"mean_absolute_error","6":"mean_squared_error","7":"mean_absolute_error","8":"mean_squared_error","9":"mean_absolute_error"},"estimate":{"0":0.0,"1":0.0,"2":0.0,"3":0.0,"4":0.0,"5":0.0,"6":0.0,"7":0.0,"8":0.0,"9":0.0}} diff --git a/vetiver/tests/test_build_vetiver_model.py b/vetiver/tests/test_build_vetiver_model.py index 4f78ec37..400e2638 100644 --- a/vetiver/tests/test_build_vetiver_model.py +++ b/vetiver/tests/test_build_vetiver_model.py @@ -1,4 +1,3 @@ -import pytest import sklearn import vetiver as vt @@ -74,7 +73,7 @@ def test_vetiver_model_no_ptype(): ) assert vt4.model == model - assert vt4.ptype == None + assert vt4.ptype is None def test_vetiver_model_from_pin(): diff --git a/vetiver/tests/test_rsconnect.py b/vetiver/tests/test_rsconnect.py index a25973bd..9b32ad92 100644 --- a/vetiver/tests/test_rsconnect.py +++ b/vetiver/tests/test_rsconnect.py @@ -4,8 +4,6 @@ from pins.boards import BoardRsConnect from pins.rsconnect.api import RsConnectApi from pins.rsconnect.fs import RsConnectFs -from vetiver import VetiverModel, vetiver_pin_write, mock -import sklearn from rsconnect.api import RSConnectServer import vetiver @@ -25,6 +23,7 @@ def server_from_key(name): api_key = json.load(f)[name] return RSConnectServer(RSC_SERVER_URL, api_key) + def rsc_from_key(name): with open(RSC_KEYS_FNAME) as f: api_key = json.load(f)[name] @@ -60,7 +59,6 @@ def rsc_short(): rsc_delete_user_content(fs_susan.api) - def test_board_pin_write(rsc_short): v = vetiver.VetiverModel( model=model, ptype_data=X_df, model_name="susan/model", versioned=None @@ -68,6 +66,7 @@ def test_board_pin_write(rsc_short): vetiver.vetiver_pin_write(board=rsc_short, model=v) assert isinstance(rsc_short.pin_read("susan/model"), sklearn.dummy.DummyRegressor) + @pytest.mark.xfail def test_deploy(rsc_short): # TODO: test in Dockerfile @@ -76,11 +75,9 @@ def test_deploy(rsc_short): ) vetiver.vetiver_pin_write(board=rsc_short, model=v) - + vetiver.deploy_rsconnect( - connect_server=server_from_key("susan"), - board=rsc_short, - pin_name="susan/model" + connect_server=server_from_key("susan"), board=rsc_short, pin_name="susan/model" ) response = vetiver.predict(RSC_SERVER_URL + "/predict/", json=X_df) assert response.status_code == 200, response.text diff --git a/vetiver/tests/test_write_docker.py b/vetiver/tests/test_write_docker.py index 68eb43bd..e94b9c67 100644 --- a/vetiver/tests/test_write_docker.py +++ b/vetiver/tests/test_write_docker.py @@ -1,4 +1,3 @@ -import pytest import os import sys import vetiver diff --git a/vetiver/utils.py b/vetiver/utils.py index 73f8d2b8..dd290c5b 100644 --- a/vetiver/utils.py +++ b/vetiver/utils.py @@ -3,7 +3,7 @@ no_notebook = False try: - from IPython import get_ipython + from IPython import get_ipython # noqa except ImportError: no_notebook = True @@ -12,7 +12,8 @@ def _jupyter_nb(): if not no_notebook: warnings.warn( - "WARNING: Jupyter Notebooks are not considered stable environments for production code" + "WARNING: Jupyter Notebooks are not considered stable environments " + "for production code" ) nest_asyncio.apply() else: diff --git a/vetiver/write_docker.py b/vetiver/write_docker.py index 05ff0989..3a63d56d 100644 --- a/vetiver/write_docker.py +++ b/vetiver/write_docker.py @@ -45,7 +45,7 @@ def write_docker( py_version = str(sys.version_info.major) + "." + str(sys.version_info.minor) if rspm_env: - rspm = "\nRUN pip config set global.index-url https://colorado.rstudio.com/rspm/pypi/latest/simple" + rspm = "\nRUN pip config set global.index-url https://colorado.rstudio.com/rspm/pypi/latest/simple" # noqa else: rspm = ""