From 77b27d30572be11103b8bcff8c149b76bc898dd2 Mon Sep 17 00:00:00 2001 From: Hamel Husain Date: Thu, 19 Sep 2024 14:37:13 -0700 Subject: [PATCH] make `nb_export` a cli [Enhancement] --- nbdev/_modidx.py | 1 + nbdev/cli.py | 10 +++++- nbdev/export.py | 13 +++++-- nbs/api/04_export.ipynb | 15 ++++++--- nbs/api/13_cli.ipynb | 75 ++++++++++++++++++++++++++--------------- settings.ini | 1 + 6 files changed, 79 insertions(+), 36 deletions(-) diff --git a/nbdev/_modidx.py b/nbdev/_modidx.py index 5b1b87358..004968d89 100644 --- a/nbdev/_modidx.py +++ b/nbdev/_modidx.py @@ -23,6 +23,7 @@ 'nbdev.cli._update_repo_meta': ('api/cli.html#_update_repo_meta', 'nbdev/cli.py'), 'nbdev.cli.chelp': ('api/cli.html#chelp', 'nbdev/cli.py'), 'nbdev.cli.extract_tgz': ('api/cli.html#extract_tgz', 'nbdev/cli.py'), + 'nbdev.cli.nb_export_cli': ('api/cli.html#nb_export_cli', 'nbdev/cli.py'), 'nbdev.cli.nbdev_filter': ('api/cli.html#nbdev_filter', 'nbdev/cli.py'), 'nbdev.cli.nbdev_new': ('api/cli.html#nbdev_new', 'nbdev/cli.py'), 'nbdev.cli.nbdev_update_license': ('api/cli.html#nbdev_update_license', 'nbdev/cli.py')}, diff --git a/nbdev/cli.py b/nbdev/cli.py index a451743be..535727070 100644 --- a/nbdev/cli.py +++ b/nbdev/cli.py @@ -13,6 +13,7 @@ from .test import * from .clean import * from .quarto import nbdev_readme, refresh_quarto_yml +from .export import nb_export from .frontmatter import FrontmatterProc from execnb.nbio import * @@ -27,7 +28,7 @@ import os, tarfile, sys # %% auto 0 -__all__ = ['mapping', 'nbdev_filter', 'extract_tgz', 'nbdev_new', 'nbdev_update_license', 'chelp'] +__all__ = ['mapping', 'nbdev_filter', 'extract_tgz', 'nbdev_new', 'nbdev_update_license', 'nb_export_cli', 'chelp'] # %% ../nbs/api/13_cli.ipynb @call_parse @@ -158,6 +159,13 @@ def nbdev_update_license( lic.write(body) print(f"License updated from {curr_lic} to {to}") +# %% ../nbs/api/13_cli.ipynb +@call_parse +@delegates(nb_export, but=['procs', 'mod_maker']) +def nb_export_cli(nbname, lib_path, name, debug:Param("debug flag", store_true), **kwargs): + "Export a single nbdev notebook to a python script." + return nb_export(nbname=nbname, lib_path=lib_path, name=name, debug=debug, **kwargs) + # %% ../nbs/api/13_cli.ipynb @call_parse def chelp(): diff --git a/nbdev/export.py b/nbdev/export.py index c6c2fe24e..6d32e1c20 100644 --- a/nbdev/export.py +++ b/nbdev/export.py @@ -14,6 +14,7 @@ from fastcore.script import * from fastcore.basics import * from fastcore.imports import * +from fastcore.meta import * from collections import defaultdict @@ -63,12 +64,18 @@ def scrub_magics(cell): # Cell to format def optional_procs(): "An explicit list of processors that could be used by `nb_export`" return L([p for p in nbdev.export.__all__ - if p not in ["nb_export", "ExportModuleProc", "optional_procs"]]) + if p not in ["nb_export", "nb_export_cli", "ExportModuleProc", "optional_procs"]]) # %% ../nbs/api/04_export.ipynb -def nb_export(nbname, lib_path=None, procs=None, debug=False, mod_maker=ModuleMaker, name=None): +def nb_export(nbname:str, # Filename of notebook + lib_path:str=None, # Path to destination library. If not in a nbdev project, defaults to current directory. + procs=None, # Processors to use + name:str=None, # Name of python script {name}.py to create. + mod_maker=ModuleMaker, + debug:bool=False, # Debug mode + ): "Create module(s) from notebook" - if lib_path is None: lib_path = get_config().lib_path + if lib_path is None: lib_path = get_config().lib_path if is_nbdev() else '.' exp = ExportModuleProc() nb = NBProcessor(nbname, [exp]+L(procs), debug=debug) nb.process() diff --git a/nbs/api/04_export.ipynb b/nbs/api/04_export.ipynb index b3d6989fa..5e2f9fc91 100644 --- a/nbs/api/04_export.ipynb +++ b/nbs/api/04_export.ipynb @@ -34,6 +34,7 @@ "from fastcore.script import *\n", "from fastcore.basics import *\n", "from fastcore.imports import *\n", + "from fastcore.meta import *\n", "\n", "from collections import defaultdict" ] @@ -210,7 +211,7 @@ "def optional_procs():\n", " \"An explicit list of processors that could be used by `nb_export`\"\n", " return L([p for p in nbdev.export.__all__\n", - " if p not in [\"nb_export\", \"ExportModuleProc\", \"optional_procs\"]])" + " if p not in [\"nb_export\", \"nb_export_cli\", \"ExportModuleProc\", \"optional_procs\"]])" ] }, { @@ -237,9 +238,15 @@ "outputs": [], "source": [ "#|export\n", - "def nb_export(nbname, lib_path=None, procs=None, debug=False, mod_maker=ModuleMaker, name=None):\n", + "def nb_export(nbname:str, # Filename of notebook \n", + " lib_path:str=None, # Path to destination library. If not in a nbdev project, defaults to current directory.\n", + " procs=None, # Processors to use\n", + " name:str=None, # Name of python script {name}.py to create.\n", + " mod_maker=ModuleMaker,\n", + " debug:bool=False, # Debug mode\n", + " ):\n", " \"Create module(s) from notebook\"\n", - " if lib_path is None: lib_path = get_config().lib_path\n", + " if lib_path is None: lib_path = get_config().lib_path if is_nbdev() else '.'\n", " exp = ExportModuleProc()\n", " nb = NBProcessor(nbname, [exp]+L(procs), debug=debug)\n", " nb.process()\n", @@ -269,7 +276,7 @@ "metadata": {}, "outputs": [], "source": [ - " #|eval: false\n", + "#|eval: false\n", "shutil.rmtree('tmp', ignore_errors=True)\n", "nb_export('../../tests/00_some.thing.ipynb', 'tmp')\n", "\n", diff --git a/nbs/api/13_cli.ipynb b/nbs/api/13_cli.ipynb index a19412486..711e2a688 100644 --- a/nbs/api/13_cli.ipynb +++ b/nbs/api/13_cli.ipynb @@ -38,6 +38,7 @@ "from nbdev.test import *\n", "from nbdev.clean import *\n", "from nbdev.quarto import nbdev_readme, refresh_quarto_yml\n", + "from nbdev.export import nb_export\n", "from nbdev.frontmatter import FrontmatterProc\n", "\n", "from execnb.nbio import *\n", @@ -286,6 +287,21 @@ " print(f\"License updated from {curr_lic} to {to}\")" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "412b4cd2", + "metadata": {}, + "outputs": [], + "source": [ + "#|export\n", + "@call_parse\n", + "@delegates(nb_export, but=['procs', 'mod_maker'])\n", + "def nb_export_cli(nbname, lib_path, name, debug:Param(\"debug flag\", store_true), **kwargs): \n", + " \"Export a single nbdev notebook to a python script.\"\n", + " return nb_export(nbname=nbname, lib_path=lib_path, name=name, debug=debug, **kwargs)" + ] + }, { "cell_type": "code", "execution_count": null, @@ -332,34 +348,37 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[1m\u001b[94mnbdev_bump_version\u001b[0m Increment version in settings.ini by one\n", - "\u001b[1m\u001b[94mnbdev_changelog\u001b[0m Create a CHANGELOG.md file from closed and labeled GitHub issues\n", - "\u001b[1m\u001b[94mnbdev_clean\u001b[0m Clean all notebooks in `fname` to avoid merge conflicts\n", - "\u001b[1m\u001b[94mnbdev_conda\u001b[0m Create a `meta.yaml` file ready to be built into a package, and optionally build and upload it\n", - "\u001b[1m\u001b[94mnbdev_create_config\u001b[0m Create a config file.\n", - "\u001b[1m\u001b[94mnbdev_docs\u001b[0m Create Quarto docs and README.md\n", - "\u001b[1m\u001b[94mnbdev_export\u001b[0m Export notebooks in `path` to Python modules\n", - "\u001b[1m\u001b[94mnbdev_filter\u001b[0m A notebook filter for Quarto\n", - "\u001b[1m\u001b[94mnbdev_fix\u001b[0m Create working notebook from conflicted notebook `nbname`\n", - "\u001b[1m\u001b[94mnbdev_help\u001b[0m Show help for all console scripts\n", - "\u001b[1m\u001b[94mnbdev_install\u001b[0m Install Quarto and the current library\n", - "\u001b[1m\u001b[94mnbdev_install_hooks\u001b[0m Install Jupyter and git hooks to automatically clean, trust, and fix merge conflicts in notebooks\n", - "\u001b[1m\u001b[94mnbdev_install_quarto\u001b[0m Install latest Quarto on macOS or Linux, prints instructions for Windows\n", - "\u001b[1m\u001b[94mnbdev_merge\u001b[0m Git merge driver for notebooks\n", - "\u001b[1m\u001b[94mnbdev_migrate\u001b[0m Convert all markdown and notebook files in `path` from v1 to v2\n", - "\u001b[1m\u001b[94mnbdev_new\u001b[0m Create an nbdev project.\n", - "\u001b[1m\u001b[94mnbdev_prepare\u001b[0m Export, test, and clean notebooks, and render README if needed\n", - "\u001b[1m\u001b[94mnbdev_preview\u001b[0m Preview docs locally\n", - "\u001b[1m\u001b[94mnbdev_proc_nbs\u001b[0m Process notebooks in `path` for docs rendering\n", - "\u001b[1m\u001b[94mnbdev_pypi\u001b[0m Create and upload Python package to PyPI\n", - "\u001b[1m\u001b[94mnbdev_readme\u001b[0m None\n", - "\u001b[1m\u001b[94mnbdev_release_both\u001b[0m Release both conda and PyPI packages\n", - "\u001b[1m\u001b[94mnbdev_release_gh\u001b[0m Calls `nbdev_changelog`, lets you edit the result, then pushes to git and calls `nbdev_release_git`\n", - "\u001b[1m\u001b[94mnbdev_release_git\u001b[0m Tag and create a release in GitHub for the current version\n", - "\u001b[1m\u001b[94mnbdev_sidebar\u001b[0m Create sidebar.yml\n", - "\u001b[1m\u001b[94mnbdev_test\u001b[0m Test in parallel notebooks matching `path`, passing along `flags`\n", - "\u001b[1m\u001b[94mnbdev_trust\u001b[0m Trust notebooks matching `fname`\n", - "\u001b[1m\u001b[94mnbdev_update\u001b[0m Propagate change in modules matching `fname` to notebooks that created them\n" + "\u001b[1m\u001b[94mnb_export\u001b[22m\u001b[39m Export a single nbdev notebook to a python script.\n", + "\u001b[1m\u001b[94mnbdev_bump_version\u001b[22m\u001b[39m Increment version in settings.ini by one\n", + "\u001b[1m\u001b[94mnbdev_changelog\u001b[22m\u001b[39m Create a CHANGELOG.md file from closed and labeled GitHub issues\n", + "\u001b[1m\u001b[94mnbdev_clean\u001b[22m\u001b[39m Clean all notebooks in `fname` to avoid merge conflicts\n", + "\u001b[1m\u001b[94mnbdev_conda\u001b[22m\u001b[39m Create a `meta.yaml` file ready to be built into a package, and optionally build and upload it\n", + "\u001b[1m\u001b[94mnbdev_create_config\u001b[22m\u001b[39m Create a config file.\n", + "\u001b[1m\u001b[94mnbdev_docs\u001b[22m\u001b[39m Create Quarto docs and README.md\n", + "\u001b[1m\u001b[94mnbdev_export\u001b[22m\u001b[39m Export notebooks in `path` to Python modules\n", + "\u001b[1m\u001b[94mnbdev_filter\u001b[22m\u001b[39m A notebook filter for Quarto\n", + "\u001b[1m\u001b[94mnbdev_fix\u001b[22m\u001b[39m Create working notebook from conflicted notebook `nbname`\n", + "\u001b[1m\u001b[94mnbdev_help\u001b[22m\u001b[39m Show help for all console scripts\n", + "\u001b[1m\u001b[94mnbdev_install\u001b[22m\u001b[39m Install Quarto and the current library\n", + "\u001b[1m\u001b[94mnbdev_install_hooks\u001b[22m\u001b[39m Install Jupyter and git hooks to automatically clean, trust, and fix merge conflicts in notebooks\n", + "\u001b[1m\u001b[94mnbdev_install_quarto\u001b[22m\u001b[39m Install latest Quarto on macOS or Linux, prints instructions for Windows\n", + "\u001b[1m\u001b[94mnbdev_merge\u001b[22m\u001b[39m Git merge driver for notebooks\n", + "\u001b[1m\u001b[94mnbdev_migrate\u001b[22m\u001b[39m Convert all markdown and notebook files in `path` from v1 to v2\n", + "\u001b[1m\u001b[94mnbdev_new\u001b[22m\u001b[39m Create an nbdev project.\n", + "\u001b[1m\u001b[94mnbdev_prepare\u001b[22m\u001b[39m Export, test, and clean notebooks, and render README if needed\n", + "\u001b[1m\u001b[94mnbdev_preview\u001b[22m\u001b[39m Preview docs locally\n", + "\u001b[1m\u001b[94mnbdev_proc_nbs\u001b[22m\u001b[39m Process notebooks in `path` for docs rendering\n", + "\u001b[1m\u001b[94mnbdev_pypi\u001b[22m\u001b[39m Create and upload Python package to PyPI\n", + "\u001b[1m\u001b[94mnbdev_readme\u001b[22m\u001b[39m Create README.md from readme_nb (index.ipynb by default)\n", + "\u001b[1m\u001b[94mnbdev_release_both\u001b[22m\u001b[39m Release both conda and PyPI packages\n", + "\u001b[1m\u001b[94mnbdev_release_gh\u001b[22m\u001b[39m Calls `nbdev_changelog`, lets you edit the result, then pushes to git and calls `nbdev_release_git`\n", + "\u001b[1m\u001b[94mnbdev_release_git\u001b[22m\u001b[39m Tag and create a release in GitHub for the current version\n", + "\u001b[1m\u001b[94mnbdev_requirements\u001b[22m\u001b[39m Writes a `requirements.txt` file to `directory` based on settings.ini.\n", + "\u001b[1m\u001b[94mnbdev_sidebar\u001b[22m\u001b[39m Create sidebar.yml\n", + "\u001b[1m\u001b[94mnbdev_test\u001b[22m\u001b[39m Test in parallel notebooks matching `path`, passing along `flags`\n", + "\u001b[1m\u001b[94mnbdev_trust\u001b[22m\u001b[39m Trust notebooks matching `fname`\n", + "\u001b[1m\u001b[94mnbdev_update\u001b[22m\u001b[39m Propagate change in modules matching `fname` to notebooks that created them\n", + "\u001b[1m\u001b[94mnbdev_update_license\u001b[22m\u001b[39m Allows you to update the license of your project.\n" ] } ], diff --git a/settings.ini b/settings.ini index 62c973ee2..5fe59afb6 100644 --- a/settings.ini +++ b/settings.ini @@ -50,6 +50,7 @@ console_scripts = nbdev_create_config=nbdev.config:nbdev_create_config nbdev_requirements=nbdev.release:write_requirements nbdev_proc_nbs=nbdev.quarto:nbdev_proc_nbs nbdev_help=nbdev.cli:chelp + nb_export=nbdev.cli:nb_export_cli tst_flags = notest nbs_path = nbs doc_path = _docs