From e3a7457fad2b6e70c23d0bf095e737cb5ea86bde Mon Sep 17 00:00:00 2001 From: isabelizimm Date: Tue, 15 Nov 2022 16:13:18 -0500 Subject: [PATCH 1/2] differentiating from strings --- examples/vetiver/quartodoc.ipynb | 174 +++++++++++++++++++++++++++++++ quartodoc.py | 5 +- 2 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 examples/vetiver/quartodoc.ipynb diff --git a/examples/vetiver/quartodoc.ipynb b/examples/vetiver/quartodoc.ipynb new file mode 100644 index 00000000..b15a13af --- /dev/null +++ b/examples/vetiver/quartodoc.ipynb @@ -0,0 +1,174 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "from griffe.loader import GriffeLoader\n", + "from griffe.docstrings.parsers import Parser\n", + "\n", + "griffe = GriffeLoader(docstring_parser = Parser(\"numpy\"))\n", + "mod = griffe.load_module(\"vetiver\") # no editable install\n", + "\n", + "#f_obj = mod._modules_collection[\"vetiver.load_pkgs\"]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mod._modules_collection[\"vetiver.attach_pkgs.load_pkgs\"] # full path" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "# load_pkgs\n", + "\n", + "`load_pkgs(model: VetiverModel = None, packages: list = None, path='')`\n", + "\n", + "Load packages necessary for predictions\n", + "\n", + "Args\n", + "----\n", + " model: VetiverModel\n", + " VetiverModel to extract packages from\n", + " packages: list\n", + " List of extra packages to include\n", + " path: str\n", + " Where to save output file\n" + ] + } + ], + "source": [ + "from quartodoc import get_function, MdRenderer\n", + "\n", + "# get function object ---\n", + "f_obj = get_function(\"vetiver.attach_pkgs\", \"load_pkgs\") # not attach.laod\n", + "\n", + "\n", + "# render ---\n", + "renderer = MdRenderer(header_level = 1)\n", + "print(\n", + " renderer.to_md(f_obj)\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "# VetiverAPI\n", + "\n", + "`VetiverAPI(self, model: VetiverModel, check_ptype: bool = True, app_factory=FastAPI)`\n", + "\n", + "Create model aware API\n", + "\n", + "## Parameters\n", + "\n", + "| Name | Type | Description | Default |\n", + "|---------------|--------------|------------------------------------------------|-----------|\n", + "| `model` | VetiverModel | Model to be deployed in API | required |\n", + "| `check_ptype` | bool | Determine if data prototype should be enforced | `True` |\n", + "| `app_factory` | | Type of API to be deployed | `FastAPI` |\n", + "\n", + "Example\n", + "-------\n", + ">>> import vetiver\n", + ">>> X, y = vetiver.get_mock_data()\n", + ">>> model = vetiver.get_mock_model().fit(X, y)\n", + ">>> v = vetiver.VetiverModel(model = model, model_name = \"my_model\", ptype_data = X)\n", + ">>> v_api = vetiver.VetiverAPI(model = v, check_ptype = True)\n" + ] + } + ], + "source": [ + "c_obj = mod._modules_collection[\"vetiver.server.VetiverAPI\"]\n", + "\n", + "print(\n", + " renderer.to_md(c_obj)\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'# vetiver_post\\n\\n`vetiver_post(self, endpoint_fx: Callable, endpoint_name: str = \\'custom_endpoint\\')`\\n\\nCreate new POST endpoint that is aware of model input data\\n\\n## Parameters\\n\\n| Name | Type | Description | Default |\\n|-----------------|-----------------|---------------------------------------|---------------------|\\n| `endpoint_fx` | typing.Callable | Custom function to be run at endpoint | required |\\n| `endpoint_name` | str | Name of endpoint | `\\'custom_endpoint\\'` |\\n\\nExample\\n-------\\n>>> import vetiver\\n>>> X, y = vetiver.get_mock_data()\\n>>> model = vetiver.get_mock_model().fit(X, y)\\n>>> v = vetiver.VetiverModel(model = model, model_name = \"model\", ptype_data = X)\\n>>> v_api = vetiver.VetiverAPI(model = v, check_ptype = True)\\n>>> def sum_values(x):\\n... return x.sum()\\n>>> v_api.vetiver_post(sum_values, \"sums\")'" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "renderer.to_md(c_obj.members[\"vetiver_post\"]) # no -> none" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.11 64-bit ('pydemo')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.11" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "974018313955b4988b16ea215671657307c8736770f13695d4ded4c5899ccb5a" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/quartodoc.py b/quartodoc.py index 14167b4a..b9500c80 100644 --- a/quartodoc.py +++ b/quartodoc.py @@ -180,7 +180,10 @@ def to_md(self, el: ds.DocstringSectionParameters): def to_md(self, el: ds.DocstringParameter) -> Tuple[str]: # TODO: if default is not, should return the word "required" (unescaped) default = "required" if el.default is None else escape(el.default) - annotation = el.annotation.full if el.annotation else None + if isinstance(el.annotation, str): + annotation = el.annotation + else: + annotation = el.annotation.full if el.annotation else None return (escape(el.name), annotation, el.description, default) # examples ---- From 005d00102c2c233715ba1fba9eb1f756f61317fd Mon Sep 17 00:00:00 2001 From: isabelizimm Date: Tue, 15 Nov 2022 16:25:39 -0500 Subject: [PATCH 2/2] convert ipynb to qmd --- examples/vetiver/quartodoc.ipynb | 174 ------------------------------- examples/vetiver/quartodoc.qmd | 45 ++++++++ 2 files changed, 45 insertions(+), 174 deletions(-) delete mode 100644 examples/vetiver/quartodoc.ipynb create mode 100644 examples/vetiver/quartodoc.qmd diff --git a/examples/vetiver/quartodoc.ipynb b/examples/vetiver/quartodoc.ipynb deleted file mode 100644 index b15a13af..00000000 --- a/examples/vetiver/quartodoc.ipynb +++ /dev/null @@ -1,174 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "from griffe.loader import GriffeLoader\n", - "from griffe.docstrings.parsers import Parser\n", - "\n", - "griffe = GriffeLoader(docstring_parser = Parser(\"numpy\"))\n", - "mod = griffe.load_module(\"vetiver\") # no editable install\n", - "\n", - "#f_obj = mod._modules_collection[\"vetiver.load_pkgs\"]\n" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mod._modules_collection[\"vetiver.attach_pkgs.load_pkgs\"] # full path" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "# load_pkgs\n", - "\n", - "`load_pkgs(model: VetiverModel = None, packages: list = None, path='')`\n", - "\n", - "Load packages necessary for predictions\n", - "\n", - "Args\n", - "----\n", - " model: VetiverModel\n", - " VetiverModel to extract packages from\n", - " packages: list\n", - " List of extra packages to include\n", - " path: str\n", - " Where to save output file\n" - ] - } - ], - "source": [ - "from quartodoc import get_function, MdRenderer\n", - "\n", - "# get function object ---\n", - "f_obj = get_function(\"vetiver.attach_pkgs\", \"load_pkgs\") # not attach.laod\n", - "\n", - "\n", - "# render ---\n", - "renderer = MdRenderer(header_level = 1)\n", - "print(\n", - " renderer.to_md(f_obj)\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "# VetiverAPI\n", - "\n", - "`VetiverAPI(self, model: VetiverModel, check_ptype: bool = True, app_factory=FastAPI)`\n", - "\n", - "Create model aware API\n", - "\n", - "## Parameters\n", - "\n", - "| Name | Type | Description | Default |\n", - "|---------------|--------------|------------------------------------------------|-----------|\n", - "| `model` | VetiverModel | Model to be deployed in API | required |\n", - "| `check_ptype` | bool | Determine if data prototype should be enforced | `True` |\n", - "| `app_factory` | | Type of API to be deployed | `FastAPI` |\n", - "\n", - "Example\n", - "-------\n", - ">>> import vetiver\n", - ">>> X, y = vetiver.get_mock_data()\n", - ">>> model = vetiver.get_mock_model().fit(X, y)\n", - ">>> v = vetiver.VetiverModel(model = model, model_name = \"my_model\", ptype_data = X)\n", - ">>> v_api = vetiver.VetiverAPI(model = v, check_ptype = True)\n" - ] - } - ], - "source": [ - "c_obj = mod._modules_collection[\"vetiver.server.VetiverAPI\"]\n", - "\n", - "print(\n", - " renderer.to_md(c_obj)\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'# vetiver_post\\n\\n`vetiver_post(self, endpoint_fx: Callable, endpoint_name: str = \\'custom_endpoint\\')`\\n\\nCreate new POST endpoint that is aware of model input data\\n\\n## Parameters\\n\\n| Name | Type | Description | Default |\\n|-----------------|-----------------|---------------------------------------|---------------------|\\n| `endpoint_fx` | typing.Callable | Custom function to be run at endpoint | required |\\n| `endpoint_name` | str | Name of endpoint | `\\'custom_endpoint\\'` |\\n\\nExample\\n-------\\n>>> import vetiver\\n>>> X, y = vetiver.get_mock_data()\\n>>> model = vetiver.get_mock_model().fit(X, y)\\n>>> v = vetiver.VetiverModel(model = model, model_name = \"model\", ptype_data = X)\\n>>> v_api = vetiver.VetiverAPI(model = v, check_ptype = True)\\n>>> def sum_values(x):\\n... return x.sum()\\n>>> v_api.vetiver_post(sum_values, \"sums\")'" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "renderer.to_md(c_obj.members[\"vetiver_post\"]) # no -> none" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3.9.11 64-bit ('pydemo')", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.11" - }, - "orig_nbformat": 4, - "vscode": { - "interpreter": { - "hash": "974018313955b4988b16ea215671657307c8736770f13695d4ded4c5899ccb5a" - } - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/vetiver/quartodoc.qmd b/examples/vetiver/quartodoc.qmd new file mode 100644 index 00000000..ec24ce6f --- /dev/null +++ b/examples/vetiver/quartodoc.qmd @@ -0,0 +1,45 @@ +--- +jupyter: python3 +--- + +```{python} +from griffe.loader import GriffeLoader +from griffe.docstrings.parsers import Parser + +griffe = GriffeLoader(docstring_parser = Parser("numpy")) +mod = griffe.load_module("vetiver") # no editable install + +#f_obj = mod._modules_collection["vetiver.load_pkgs"] +``` + +```{python} +mod._modules_collection["vetiver.attach_pkgs.load_pkgs"] # full path +``` + +```{python} +from quartodoc import get_function, MdRenderer + +# get function object --- +f_obj = get_function("vetiver.attach_pkgs", "load_pkgs") # not attach.laod + + +# render --- +renderer = MdRenderer(header_level = 1) +print( + renderer.to_md(f_obj) +) +``` + +```{python} +c_obj = mod._modules_collection["vetiver.server.VetiverAPI"] + +print( + renderer.to_md(c_obj) +) +``` + +```{python} +renderer.to_md(c_obj.members["vetiver_post"]) # no -> none +``` + +