123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- """Convert a jupytext-compliant format in to a python script
- and execute it with parsed arguments.
- Any cell with 'remove-cell-ci' tag in metadata will not be included
- in the converted python script.
- """
- import argparse
- import subprocess
- import sys
- import tempfile
- from pathlib import Path
- import jupytext
- parser = argparse.ArgumentParser(description=__doc__)
- parser.add_argument(
- "--path",
- help="path to the jupytext-compatible file",
- )
- parser.add_argument(
- "--find-recursively",
- action="store_true",
- help="if true, will attempt to find path recursively in cwd",
- )
- parser.add_argument(
- "--no-postprocess",
- action="store_true",
- help="if true, will not postprocess the notebook",
- )
- def filter_out_cells_with_remove_cell_ci_tag(cells: list):
- """Filters out cells which contain the 'remove-cell-ci' tag in metadata"""
- def should_keep_cell(cell):
- tags = cell.metadata.get("tags")
- if tags:
- # Both - and _ for consistent behavior with built-in tags
- return "remove_cell_ci" not in tags and "remove-cell-ci" not in tags
- return True
- return [cell for cell in cells if should_keep_cell(cell)]
- def postprocess_notebook(notebook):
- notebook.cells = filter_out_cells_with_remove_cell_ci_tag(notebook.cells)
- return notebook
- DISPLAY_FUNCTION = """
- def display(*args, **kwargs):
- print(*args, **kwargs)
- """
- if __name__ == "__main__":
- args, remainder = parser.parse_known_args()
- path = Path(args.path)
- cwd = Path.cwd()
- if args.find_recursively and not path.exists():
- path = next((p for p in cwd.rglob("*") if str(p).endswith(args.path)), None)
- assert path and path.exists()
- with open(path, "r") as f:
- notebook = jupytext.read(f)
- if not args.no_postprocess:
- notebook = postprocess_notebook(notebook)
- name = ""
- with tempfile.NamedTemporaryFile("w", delete=False) as f:
- # Define the display function, which is available in notebooks,
- # but not in normal Python scripts.
- f.write(DISPLAY_FUNCTION)
- jupytext.write(notebook, f, fmt="py:percent")
- name = f.name
- remainder.insert(0, name)
- remainder.insert(0, sys.executable)
- # Run the notebook
- subprocess.run(remainder, check=True)
|