Full Code of mwouts/jupytext for AI

main e939bf5359be cached
805 files
8.1 MB
2.2M tokens
1385 symbols
1 requests
Download .txt
Showing preview only (8,640K chars total). Download the full file or copy to clipboard to get everything.
Repository: mwouts/jupytext
Branch: main
Commit: e939bf5359be
Files: 805
Total size: 8.1 MB

Directory structure:
gitextract_26hsbj6f/

├── .git-blame-ignore-revs
├── .git_archival.txt
├── .gitattributes
├── .github/
│   ├── codecov.yml
│   ├── dependabot.yml
│   └── workflows/
│       ├── ci.yml
│       ├── comment-pr.yml
│       ├── publish.yml
│       ├── step_build.yml
│       ├── step_coverage.yml
│       ├── step_pre-commit.yml
│       ├── step_static-analysis.yml
│       ├── step_tests-conda.yml
│       ├── step_tests-pip.yml
│       ├── step_tests-ui.yml
│       └── update-playwright-snapshots.yml
├── .gitignore
├── .pre-commit-config.yaml
├── .pre-commit-hooks.yaml
├── .readthedocs.yml
├── CHANGELOG.md
├── LICENSE
├── README.md
├── binder/
│   ├── labconfig/
│   │   └── default_setting_overrides.json
│   ├── postBuild
│   └── requirements.txt
├── demo/
│   ├── Benchmarking Jupytext.py
│   ├── Jupytext's word cloud.py
│   ├── Tests in a notebook.md
│   ├── World population.Rmd
│   ├── World population.ipynb
│   ├── World population.lgt.py
│   ├── World population.md
│   ├── World population.myst.md
│   ├── World population.pandoc.md
│   ├── World population.pct.py
│   ├── World population.spx.py
│   ├── get_started.md
│   └── vscode/
│       ├── notebook.ipynb
│       └── notebook.py
├── docs/
│   ├── Makefile
│   ├── advanced-options.md
│   ├── changelog.md
│   ├── conf.py
│   ├── config.md
│   ├── contributing.md
│   ├── developing.md
│   ├── doc-requirements.txt
│   ├── faq.md
│   ├── formats-markdown.md
│   ├── formats-scripts.md
│   ├── index.md
│   ├── install.md
│   ├── jupyter-collaboration.md
│   ├── jupyterlab-extension.md
│   ├── languages.md
│   ├── make.bat
│   ├── paired-notebooks.md
│   ├── text-notebooks.md
│   ├── tutorials.md
│   ├── using-cli.md
│   ├── using-pre-commit.md
│   └── vs-code.md
├── jupyterlab/
│   ├── .gitignore
│   ├── .prettierignore
│   ├── .yarnrc.yml
│   ├── install.json
│   ├── jupyter-config/
│   │   ├── jupyter_notebook_config.d/
│   │   │   └── jupytext.json
│   │   └── jupyter_server_config.d/
│   │       └── jupytext.json
│   ├── jupyterlab_jupytext/
│   │   └── __init__.py
│   ├── lerna.json
│   ├── package.json
│   ├── packages/
│   │   └── jupyterlab-jupytext-extension/
│   │       ├── .gitignore
│   │       ├── CHANGELOG.md
│   │       ├── README.md
│   │       ├── package.json
│   │       ├── schema/
│   │       │   └── plugin.json
│   │       ├── src/
│   │       │   ├── commands.ts
│   │       │   ├── factory.ts
│   │       │   ├── index.ts
│   │       │   ├── registry.ts
│   │       │   ├── svg.d.ts
│   │       │   ├── tokens.ts
│   │       │   └── utils.ts
│   │       ├── style/
│   │       │   ├── base.css
│   │       │   ├── index.css
│   │       │   └── index.js
│   │       ├── tsconfig.json
│   │       └── ui-tests/
│   │           ├── README.md
│   │           ├── jupyter_server_test_config.py
│   │           ├── package.json
│   │           ├── playwright.config.js
│   │           └── tests/
│   │               ├── jupytext-launcher.spec.ts
│   │               ├── jupytext-menu.spec.ts
│   │               ├── jupytext-notebook.spec.ts
│   │               └── jupytext-settings.spec.ts
│   ├── scripts/
│   │   └── install_extension.py
│   └── tsconfig.eslint.json
├── pyproject.toml
├── src/
│   ├── jupytext/
│   │   ├── __init__.py
│   │   ├── __main__.py
│   │   ├── async_contentsmanager.py
│   │   ├── async_pairs.py
│   │   ├── cell_metadata.py
│   │   ├── cell_reader.py
│   │   ├── cell_to_text.py
│   │   ├── cli.py
│   │   ├── combine.py
│   │   ├── compare.py
│   │   ├── config.py
│   │   ├── doxygen.py
│   │   ├── formats.py
│   │   ├── header.py
│   │   ├── jupytext.py
│   │   ├── kernels.py
│   │   ├── languages.py
│   │   ├── magics.py
│   │   ├── marimo.py
│   │   ├── metadata_filter.py
│   │   ├── myst.py
│   │   ├── paired_paths.py
│   │   ├── pairs.py
│   │   ├── pandoc.py
│   │   ├── pep8.py
│   │   ├── quarto.py
│   │   ├── reraise.py
│   │   ├── stringparser.py
│   │   ├── sync_contentsmanager.py
│   │   ├── sync_pairs.py
│   │   └── version.py
│   └── jupytext_config/
│       ├── __init__.py
│       ├── __main__.py
│       ├── jupytext_config.py
│       └── labconfig.py
├── tests/
│   ├── conftest.py
│   ├── data/
│   │   └── notebooks/
│   │       ├── inputs/
│   │       │   ├── R/
│   │       │   │   └── simple_r_script.R
│   │       │   ├── R_spin/
│   │       │   │   └── knitr-spin.R
│   │       │   ├── Rmd/
│   │       │   │   ├── R_sample.Rmd
│   │       │   │   ├── chunk_options.Rmd
│   │       │   │   ├── ioslides.Rmd
│   │       │   │   ├── knitr-spin.Rmd
│   │       │   │   └── markdown.Rmd
│   │       │   ├── hydrogen/
│   │       │   │   └── hydrogen_latex_html_R_magics.py
│   │       │   ├── ipynb_R/
│   │       │   │   ├── R notebook with invalid cell keys.ipynb
│   │       │   │   └── ir_notebook.ipynb
│   │       │   ├── ipynb_bash/
│   │       │   │   └── sample_bash_notebook.ipynb
│   │       │   ├── ipynb_clojure/
│   │       │   │   └── html-demo.ipynb
│   │       │   ├── ipynb_coconut/
│   │       │   │   └── coconut_homepage_demo.ipynb
│   │       │   ├── ipynb_cpp/
│   │       │   │   ├── root_cpp.ipynb
│   │       │   │   └── xcpp_by_quantstack.ipynb
│   │       │   ├── ipynb_cs/
│   │       │   │   └── csharp.ipynb
│   │       │   ├── ipynb_fs/
│   │       │   │   └── fsharp.ipynb
│   │       │   ├── ipynb_gnuplot/
│   │       │   │   └── gnuplot_notebook.ipynb
│   │       │   ├── ipynb_go/
│   │       │   │   └── hello_world_gonb.ipynb
│   │       │   ├── ipynb_groovy/
│   │       │   │   └── tailrecursive-factorial.ipynb
│   │       │   ├── ipynb_haskell/
│   │       │   │   └── haskell_notebook.ipynb
│   │       │   ├── ipynb_idl/
│   │       │   │   └── demo_gdl_fbp.ipynb
│   │       │   ├── ipynb_java/
│   │       │   │   └── simple-helloworld.ipynb
│   │       │   ├── ipynb_js/
│   │       │   │   └── ijavascript.ipynb
│   │       │   ├── ipynb_julia/
│   │       │   │   ├── julia_benchmark_plotly_barchart.ipynb
│   │       │   │   └── julia_functional_geometry.ipynb
│   │       │   ├── ipynb_logtalk/
│   │       │   │   └── logtalk_notebook.ipynb
│   │       │   ├── ipynb_lua/
│   │       │   │   └── lua_example.ipynb
│   │       │   ├── ipynb_m/
│   │       │   │   └── octave_notebook.ipynb
│   │       │   ├── ipynb_maxima/
│   │       │   │   └── maxima_example.ipynb
│   │       │   ├── ipynb_ocaml/
│   │       │   │   └── ocaml_notebook.ipynb
│   │       │   ├── ipynb_ps1/
│   │       │   │   └── powershell.ipynb
│   │       │   ├── ipynb_py/
│   │       │   │   ├── Line_breaks_in_LateX_305.ipynb
│   │       │   │   ├── Notebook with function and cell metadata 164.ipynb
│   │       │   │   ├── Notebook with html and latex cells.ipynb
│   │       │   │   ├── Notebook with many hash signs.ipynb
│   │       │   │   ├── Notebook with metadata and long cells.ipynb
│   │       │   │   ├── Notebook_with_R_magic.ipynb
│   │       │   │   ├── Notebook_with_more_R_magic_111.ipynb
│   │       │   │   ├── The flavors of raw cells.ipynb
│   │       │   │   ├── cat_variable.ipynb
│   │       │   │   ├── convert_to_py_then_test_with_update83.ipynb
│   │       │   │   ├── frozen_cell.ipynb
│   │       │   │   ├── jupyter.ipynb
│   │       │   │   ├── jupyter_again.ipynb
│   │       │   │   ├── jupyter_with_raw_cell_in_body.ipynb
│   │       │   │   ├── jupyter_with_raw_cell_on_top.ipynb
│   │       │   │   ├── jupyter_with_raw_cell_with_invalid_yaml.ipynb
│   │       │   │   ├── jupyterlab-slideshow_1441.ipynb
│   │       │   │   ├── notebook_with_complex_metadata.ipynb
│   │       │   │   ├── nteract_with_parameter.ipynb
│   │       │   │   ├── plotly_graphs.ipynb
│   │       │   │   ├── raw_cell_with_complex_yaml_like_content.ipynb
│   │       │   │   ├── raw_cell_with_non_dict_yaml_content.ipynb
│   │       │   │   ├── sample_rise_notebook_66.ipynb
│   │       │   │   └── text_outputs_and_images.ipynb
│   │       │   ├── ipynb_q/
│   │       │   │   └── kalman_filter_and_visualization.ipynb
│   │       │   ├── ipynb_robot/
│   │       │   │   └── simple_robot_notebook.ipynb
│   │       │   ├── ipynb_rust/
│   │       │   │   └── evcxr_jupyter_tour.ipynb
│   │       │   ├── ipynb_sage/
│   │       │   │   └── sage_print_hello.ipynb
│   │       │   ├── ipynb_sas/
│   │       │   │   └── sas.ipynb
│   │       │   ├── ipynb_scala/
│   │       │   │   └── simple_scala_notebook.ipynb
│   │       │   ├── ipynb_scheme/
│   │       │   │   └── Reference Guide for Calysto Scheme.ipynb
│   │       │   ├── ipynb_sos/
│   │       │   │   └── jupytext_replication.ipynb
│   │       │   ├── ipynb_stata/
│   │       │   │   └── stata_notebook.ipynb
│   │       │   ├── ipynb_tcl/
│   │       │   │   └── tcl_test.ipynb
│   │       │   ├── ipynb_ts/
│   │       │   │   └── itypescript.ipynb
│   │       │   ├── ipynb_wolfram/
│   │       │   │   └── wolfram.ipynb
│   │       │   ├── ipynb_xonsh/
│   │       │   │   └── xonsh_example.ipynb
│   │       │   ├── julia/
│   │       │   │   └── julia_sample_script.jl
│   │       │   ├── marimo/
│   │       │   │   └── basic_marimo_example.py
│   │       │   ├── md/
│   │       │   │   ├── jupytext_markdown.md
│   │       │   │   └── plain_markdown.md
│   │       │   ├── myst/
│   │       │   │   ├── fenced_code_vs_code_cells.md
│   │       │   │   └── reference_link.md
│   │       │   ├── percent/
│   │       │   │   └── hydrogen.py
│   │       │   ├── ps1/
│   │       │   │   └── build.ps1
│   │       │   ├── python/
│   │       │   │   ├── light_sample.py
│   │       │   │   └── python_notebook_sample.py
│   │       │   └── sphinx/
│   │       │       └── plot_notebook.py
│   │       └── outputs/
│   │           ├── Rmd_to_ipynb/
│   │           │   ├── R_sample.ipynb
│   │           │   ├── chunk_options.ipynb
│   │           │   ├── ioslides.ipynb
│   │           │   ├── knitr-spin.ipynb
│   │           │   └── markdown.ipynb
│   │           ├── ipynb_to_Rmd/
│   │           │   ├── Line_breaks_in_LateX_305.Rmd
│   │           │   ├── Notebook with function and cell metadata 164.Rmd
│   │           │   ├── Notebook with html and latex cells.Rmd
│   │           │   ├── Notebook with many hash signs.Rmd
│   │           │   ├── Notebook with metadata and long cells.Rmd
│   │           │   ├── Notebook_with_R_magic.Rmd
│   │           │   ├── Notebook_with_more_R_magic_111.Rmd
│   │           │   ├── R notebook with invalid cell keys.Rmd
│   │           │   ├── Reference Guide for Calysto Scheme.Rmd
│   │           │   ├── The flavors of raw cells.Rmd
│   │           │   ├── cat_variable.Rmd
│   │           │   ├── coconut_homepage_demo.Rmd
│   │           │   ├── convert_to_py_then_test_with_update83.Rmd
│   │           │   ├── csharp.Rmd
│   │           │   ├── demo_gdl_fbp.Rmd
│   │           │   ├── evcxr_jupyter_tour.Rmd
│   │           │   ├── frozen_cell.Rmd
│   │           │   ├── fsharp.Rmd
│   │           │   ├── gnuplot_notebook.Rmd
│   │           │   ├── haskell_notebook.Rmd
│   │           │   ├── hello_world_gonb.Rmd
│   │           │   ├── html-demo.Rmd
│   │           │   ├── ijavascript.Rmd
│   │           │   ├── ir_notebook.Rmd
│   │           │   ├── itypescript.Rmd
│   │           │   ├── julia_benchmark_plotly_barchart.Rmd
│   │           │   ├── julia_functional_geometry.Rmd
│   │           │   ├── jupyter.Rmd
│   │           │   ├── jupyter_again.Rmd
│   │           │   ├── jupyter_with_raw_cell_in_body.Rmd
│   │           │   ├── jupyter_with_raw_cell_on_top.Rmd
│   │           │   ├── jupyter_with_raw_cell_with_invalid_yaml.Rmd
│   │           │   ├── jupyterlab-slideshow_1441.Rmd
│   │           │   ├── jupytext_replication.Rmd
│   │           │   ├── kalman_filter_and_visualization.Rmd
│   │           │   ├── logtalk_notebook.Rmd
│   │           │   ├── lua_example.Rmd
│   │           │   ├── maxima_example.Rmd
│   │           │   ├── notebook_with_complex_metadata.Rmd
│   │           │   ├── nteract_with_parameter.Rmd
│   │           │   ├── ocaml_notebook.Rmd
│   │           │   ├── octave_notebook.Rmd
│   │           │   ├── plotly_graphs.Rmd
│   │           │   ├── powershell.Rmd
│   │           │   ├── raw_cell_with_complex_yaml_like_content.Rmd
│   │           │   ├── raw_cell_with_non_dict_yaml_content.Rmd
│   │           │   ├── root_cpp.Rmd
│   │           │   ├── sage_print_hello.Rmd
│   │           │   ├── sample_bash_notebook.Rmd
│   │           │   ├── sample_rise_notebook_66.Rmd
│   │           │   ├── sas.Rmd
│   │           │   ├── simple-helloworld.Rmd
│   │           │   ├── simple_robot_notebook.Rmd
│   │           │   ├── simple_scala_notebook.Rmd
│   │           │   ├── stata_notebook.Rmd
│   │           │   ├── tailrecursive-factorial.Rmd
│   │           │   ├── tcl_test.Rmd
│   │           │   ├── text_outputs_and_images.Rmd
│   │           │   ├── wolfram.Rmd
│   │           │   ├── xcpp_by_quantstack.Rmd
│   │           │   └── xonsh_example.Rmd
│   │           ├── ipynb_to_hydrogen/
│   │           │   ├── Line_breaks_in_LateX_305.py
│   │           │   ├── Notebook with function and cell metadata 164.py
│   │           │   ├── Notebook with html and latex cells.py
│   │           │   ├── Notebook with many hash signs.py
│   │           │   ├── Notebook with metadata and long cells.py
│   │           │   ├── Notebook_with_R_magic.py
│   │           │   ├── Notebook_with_more_R_magic_111.py
│   │           │   ├── R notebook with invalid cell keys.R
│   │           │   ├── Reference Guide for Calysto Scheme.ss
│   │           │   ├── The flavors of raw cells.py
│   │           │   ├── cat_variable.py
│   │           │   ├── coconut_homepage_demo.coco
│   │           │   ├── convert_to_py_then_test_with_update83.py
│   │           │   ├── csharp.cs
│   │           │   ├── demo_gdl_fbp.pro
│   │           │   ├── evcxr_jupyter_tour.rs
│   │           │   ├── frozen_cell.py
│   │           │   ├── fsharp.fsx
│   │           │   ├── gnuplot_notebook.gp
│   │           │   ├── haskell_notebook.hs
│   │           │   ├── hello_world_gonb.go
│   │           │   ├── html-demo.clj
│   │           │   ├── ijavascript.js
│   │           │   ├── ir_notebook.R
│   │           │   ├── itypescript.ts
│   │           │   ├── julia_benchmark_plotly_barchart.jl
│   │           │   ├── julia_functional_geometry.jl
│   │           │   ├── jupyter.py
│   │           │   ├── jupyter_again.py
│   │           │   ├── jupyter_with_raw_cell_in_body.py
│   │           │   ├── jupyter_with_raw_cell_on_top.py
│   │           │   ├── jupyter_with_raw_cell_with_invalid_yaml.py
│   │           │   ├── jupyterlab-slideshow_1441.py
│   │           │   ├── jupytext_replication.sos
│   │           │   ├── kalman_filter_and_visualization.q
│   │           │   ├── logtalk_notebook.lgt
│   │           │   ├── lua_example.lua
│   │           │   ├── maxima_example.mac
│   │           │   ├── notebook_with_complex_metadata.py
│   │           │   ├── nteract_with_parameter.py
│   │           │   ├── ocaml_notebook.ml
│   │           │   ├── octave_notebook.m
│   │           │   ├── plotly_graphs.py
│   │           │   ├── powershell.ps1
│   │           │   ├── raw_cell_with_complex_yaml_like_content.py
│   │           │   ├── raw_cell_with_non_dict_yaml_content.py
│   │           │   ├── root_cpp.cpp
│   │           │   ├── sage_print_hello.sage
│   │           │   ├── sample_bash_notebook.sh
│   │           │   ├── sample_rise_notebook_66.py
│   │           │   ├── sas.sas
│   │           │   ├── simple-helloworld.java
│   │           │   ├── simple_robot_notebook.robot
│   │           │   ├── simple_scala_notebook.scala
│   │           │   ├── stata_notebook.do
│   │           │   ├── tailrecursive-factorial.groovy
│   │           │   ├── tcl_test.tcl
│   │           │   ├── text_outputs_and_images.py
│   │           │   ├── wolfram.wolfram
│   │           │   ├── xcpp_by_quantstack.cpp
│   │           │   └── xonsh_example.xsh
│   │           ├── ipynb_to_marimo/
│   │           │   ├── Line_breaks_in_LateX_305.py
│   │           │   ├── Notebook with function and cell metadata 164.py
│   │           │   ├── Notebook with many hash signs.py
│   │           │   ├── cat_variable.py
│   │           │   ├── frozen_cell.py
│   │           │   ├── jupyter.py
│   │           │   ├── notebook_with_complex_metadata.py
│   │           │   ├── plotly_graphs.py
│   │           │   ├── sample_rise_notebook_66.py
│   │           │   └── text_outputs_and_images.py
│   │           ├── ipynb_to_md/
│   │           │   ├── Line_breaks_in_LateX_305.md
│   │           │   ├── Notebook with function and cell metadata 164.md
│   │           │   ├── Notebook with html and latex cells.md
│   │           │   ├── Notebook with many hash signs.md
│   │           │   ├── Notebook with metadata and long cells.md
│   │           │   ├── Notebook_with_R_magic.md
│   │           │   ├── Notebook_with_more_R_magic_111.md
│   │           │   ├── R notebook with invalid cell keys.md
│   │           │   ├── Reference Guide for Calysto Scheme.md
│   │           │   ├── The flavors of raw cells.md
│   │           │   ├── cat_variable.md
│   │           │   ├── coconut_homepage_demo.md
│   │           │   ├── convert_to_py_then_test_with_update83.md
│   │           │   ├── csharp.md
│   │           │   ├── demo_gdl_fbp.md
│   │           │   ├── evcxr_jupyter_tour.md
│   │           │   ├── frozen_cell.md
│   │           │   ├── fsharp.md
│   │           │   ├── gnuplot_notebook.md
│   │           │   ├── haskell_notebook.md
│   │           │   ├── hello_world_gonb.md
│   │           │   ├── html-demo.md
│   │           │   ├── ijavascript.md
│   │           │   ├── ir_notebook.md
│   │           │   ├── itypescript.md
│   │           │   ├── julia_benchmark_plotly_barchart.md
│   │           │   ├── julia_functional_geometry.md
│   │           │   ├── jupyter.md
│   │           │   ├── jupyter_again.md
│   │           │   ├── jupyter_with_raw_cell_in_body.md
│   │           │   ├── jupyter_with_raw_cell_on_top.md
│   │           │   ├── jupyter_with_raw_cell_with_invalid_yaml.md
│   │           │   ├── jupyterlab-slideshow_1441.md
│   │           │   ├── jupytext_replication.md
│   │           │   ├── kalman_filter_and_visualization.md
│   │           │   ├── logtalk_notebook.md
│   │           │   ├── lua_example.md
│   │           │   ├── maxima_example.md
│   │           │   ├── notebook_with_complex_metadata.md
│   │           │   ├── nteract_with_parameter.md
│   │           │   ├── ocaml_notebook.md
│   │           │   ├── octave_notebook.md
│   │           │   ├── plotly_graphs.md
│   │           │   ├── powershell.md
│   │           │   ├── raw_cell_with_complex_yaml_like_content.md
│   │           │   ├── raw_cell_with_non_dict_yaml_content.md
│   │           │   ├── root_cpp.md
│   │           │   ├── sage_print_hello.md
│   │           │   ├── sample_bash_notebook.md
│   │           │   ├── sample_rise_notebook_66.md
│   │           │   ├── sas.md
│   │           │   ├── simple-helloworld.md
│   │           │   ├── simple_robot_notebook.md
│   │           │   ├── simple_scala_notebook.md
│   │           │   ├── stata_notebook.md
│   │           │   ├── tailrecursive-factorial.md
│   │           │   ├── tcl_test.md
│   │           │   ├── text_outputs_and_images.md
│   │           │   ├── wolfram.md
│   │           │   ├── xcpp_by_quantstack.md
│   │           │   └── xonsh_example.md
│   │           ├── ipynb_to_myst/
│   │           │   ├── Line_breaks_in_LateX_305.md
│   │           │   ├── Notebook with function and cell metadata 164.md
│   │           │   ├── Notebook with html and latex cells.md
│   │           │   ├── Notebook with many hash signs.md
│   │           │   ├── Notebook with metadata and long cells.md
│   │           │   ├── Notebook_with_R_magic.md
│   │           │   ├── Notebook_with_more_R_magic_111.md
│   │           │   ├── R notebook with invalid cell keys.md
│   │           │   ├── Reference Guide for Calysto Scheme.md
│   │           │   ├── The flavors of raw cells.md
│   │           │   ├── cat_variable.md
│   │           │   ├── coconut_homepage_demo.md
│   │           │   ├── convert_to_py_then_test_with_update83.md
│   │           │   ├── csharp.md
│   │           │   ├── demo_gdl_fbp.md
│   │           │   ├── evcxr_jupyter_tour.md
│   │           │   ├── frozen_cell.md
│   │           │   ├── fsharp.md
│   │           │   ├── gnuplot_notebook.md
│   │           │   ├── haskell_notebook.md
│   │           │   ├── hello_world_gonb.md
│   │           │   ├── ijavascript.md
│   │           │   ├── ir_notebook.md
│   │           │   ├── itypescript.md
│   │           │   ├── julia_benchmark_plotly_barchart.md
│   │           │   ├── jupyter.md
│   │           │   ├── jupyter_again.md
│   │           │   ├── jupyter_with_raw_cell_in_body.md
│   │           │   ├── jupyter_with_raw_cell_on_top.md
│   │           │   ├── jupyter_with_raw_cell_with_invalid_yaml.md
│   │           │   ├── jupyterlab-slideshow_1441.md
│   │           │   ├── jupytext_replication.md
│   │           │   ├── kalman_filter_and_visualization.md
│   │           │   ├── logtalk_notebook.md
│   │           │   ├── lua_example.md
│   │           │   ├── maxima_example.md
│   │           │   ├── notebook_with_complex_metadata.md
│   │           │   ├── nteract_with_parameter.md
│   │           │   ├── ocaml_notebook.md
│   │           │   ├── octave_notebook.md
│   │           │   ├── plotly_graphs.md
│   │           │   ├── powershell.md
│   │           │   ├── raw_cell_with_complex_yaml_like_content.md
│   │           │   ├── raw_cell_with_non_dict_yaml_content.md
│   │           │   ├── root_cpp.md
│   │           │   ├── sage_print_hello.md
│   │           │   ├── sample_bash_notebook.md
│   │           │   ├── sample_rise_notebook_66.md
│   │           │   ├── sas.md
│   │           │   ├── simple-helloworld.md
│   │           │   ├── simple_robot_notebook.md
│   │           │   ├── simple_scala_notebook.md
│   │           │   ├── stata_notebook.md
│   │           │   ├── tailrecursive-factorial.md
│   │           │   ├── tcl_test.md
│   │           │   ├── text_outputs_and_images.md
│   │           │   ├── wolfram.md
│   │           │   └── xonsh_example.md
│   │           ├── ipynb_to_pandoc/
│   │           │   ├── Notebook_with_R_magic.md
│   │           │   ├── Notebook_with_more_R_magic_111.md
│   │           │   ├── cat_variable.md
│   │           │   ├── convert_to_py_then_test_with_update83.md
│   │           │   ├── frozen_cell.md
│   │           │   ├── ir_notebook.md
│   │           │   ├── julia_benchmark_plotly_barchart.md
│   │           │   ├── jupyter.md
│   │           │   ├── jupyter_again.md
│   │           │   ├── jupyter_with_raw_cell_in_body.md
│   │           │   ├── jupyter_with_raw_cell_on_top.md
│   │           │   ├── notebook_with_complex_metadata.md
│   │           │   ├── nteract_with_parameter.md
│   │           │   ├── plotly_graphs.md
│   │           │   ├── raw_cell_with_complex_yaml_like_content.md
│   │           │   ├── raw_cell_with_non_dict_yaml_content.md
│   │           │   ├── sample_rise_notebook_66.md
│   │           │   └── text_outputs_and_images.md
│   │           ├── ipynb_to_percent/
│   │           │   ├── Line_breaks_in_LateX_305.py
│   │           │   ├── Notebook with function and cell metadata 164.py
│   │           │   ├── Notebook with html and latex cells.py
│   │           │   ├── Notebook with many hash signs.py
│   │           │   ├── Notebook with metadata and long cells.py
│   │           │   ├── Notebook_with_R_magic.py
│   │           │   ├── Notebook_with_more_R_magic_111.py
│   │           │   ├── R notebook with invalid cell keys.R
│   │           │   ├── R notebook with invalid cell keys.low.r
│   │           │   ├── Reference Guide for Calysto Scheme.scm
│   │           │   ├── Reference Guide for Calysto Scheme.ss
│   │           │   ├── The flavors of raw cells.py
│   │           │   ├── cat_variable.py
│   │           │   ├── coconut_homepage_demo.coco
│   │           │   ├── convert_to_py_then_test_with_update83.py
│   │           │   ├── csharp.cs
│   │           │   ├── demo_gdl_fbp.pro
│   │           │   ├── evcxr_jupyter_tour.rs
│   │           │   ├── frozen_cell.py
│   │           │   ├── fsharp.fsx
│   │           │   ├── gnuplot_notebook.gp
│   │           │   ├── haskell_notebook.hs
│   │           │   ├── hello_world_gonb.go
│   │           │   ├── html-demo.clj
│   │           │   ├── ijavascript.js
│   │           │   ├── ir_notebook.R
│   │           │   ├── ir_notebook.low.r
│   │           │   ├── itypescript.ts
│   │           │   ├── julia_benchmark_plotly_barchart.jl
│   │           │   ├── julia_functional_geometry.jl
│   │           │   ├── jupyter.py
│   │           │   ├── jupyter_again.py
│   │           │   ├── jupyter_with_raw_cell_in_body.py
│   │           │   ├── jupyter_with_raw_cell_on_top.py
│   │           │   ├── jupyter_with_raw_cell_with_invalid_yaml.py
│   │           │   ├── jupyterlab-slideshow_1441.py
│   │           │   ├── jupytext_replication.sos
│   │           │   ├── kalman_filter_and_visualization.q
│   │           │   ├── logtalk_notebook.lgt
│   │           │   ├── lua_example.lua
│   │           │   ├── maxima_example.mac
│   │           │   ├── notebook_with_complex_metadata.py
│   │           │   ├── nteract_with_parameter.py
│   │           │   ├── ocaml_notebook.ml
│   │           │   ├── octave_notebook.m
│   │           │   ├── plotly_graphs.py
│   │           │   ├── powershell.ps1
│   │           │   ├── raw_cell_with_complex_yaml_like_content.py
│   │           │   ├── raw_cell_with_non_dict_yaml_content.py
│   │           │   ├── root_cpp.cpp
│   │           │   ├── sage_print_hello.sage
│   │           │   ├── sample_bash_notebook.sh
│   │           │   ├── sample_rise_notebook_66.py
│   │           │   ├── sas.sas
│   │           │   ├── simple-helloworld.java
│   │           │   ├── simple_robot_notebook.robot
│   │           │   ├── simple_scala_notebook.scala
│   │           │   ├── stata_notebook.do
│   │           │   ├── tailrecursive-factorial.groovy
│   │           │   ├── tcl_test.tcl
│   │           │   ├── text_outputs_and_images.py
│   │           │   ├── wolfram.wolfram
│   │           │   ├── xcpp_by_quantstack.cpp
│   │           │   └── xonsh_example.xsh
│   │           ├── ipynb_to_quarto/
│   │           │   ├── Notebook_with_more_R_magic_111.qmd
│   │           │   ├── cat_variable.qmd
│   │           │   ├── frozen_cell.qmd
│   │           │   └── julia_benchmark_plotly_barchart.qmd
│   │           ├── ipynb_to_script/
│   │           │   ├── Line_breaks_in_LateX_305.py
│   │           │   ├── Notebook with function and cell metadata 164.py
│   │           │   ├── Notebook with html and latex cells.py
│   │           │   ├── Notebook with metadata and long cells.py
│   │           │   ├── Notebook_with_R_magic.py
│   │           │   ├── Notebook_with_more_R_magic_111.py
│   │           │   ├── R notebook with invalid cell keys.R
│   │           │   ├── R notebook with invalid cell keys.low.r
│   │           │   ├── Reference Guide for Calysto Scheme.scm
│   │           │   ├── Reference Guide for Calysto Scheme.ss
│   │           │   ├── The flavors of raw cells.py
│   │           │   ├── cat_variable.py
│   │           │   ├── coconut_homepage_demo.coco
│   │           │   ├── convert_to_py_then_test_with_update83.py
│   │           │   ├── csharp.cs
│   │           │   ├── demo_gdl_fbp.pro
│   │           │   ├── evcxr_jupyter_tour.rs
│   │           │   ├── frozen_cell.py
│   │           │   ├── fsharp.fsx
│   │           │   ├── gnuplot_notebook.gp
│   │           │   ├── haskell_notebook.hs
│   │           │   ├── hello_world_gonb.go
│   │           │   ├── html-demo.clj
│   │           │   ├── ijavascript.js
│   │           │   ├── ir_notebook.R
│   │           │   ├── ir_notebook.low.r
│   │           │   ├── itypescript.ts
│   │           │   ├── julia_benchmark_plotly_barchart.jl
│   │           │   ├── julia_functional_geometry.jl
│   │           │   ├── jupyter.py
│   │           │   ├── jupyter_again.py
│   │           │   ├── jupyter_with_raw_cell_in_body.py
│   │           │   ├── jupyter_with_raw_cell_on_top.py
│   │           │   ├── jupyter_with_raw_cell_with_invalid_yaml.py
│   │           │   ├── jupyterlab-slideshow_1441.py
│   │           │   ├── jupytext_replication.sos
│   │           │   ├── kalman_filter_and_visualization.q
│   │           │   ├── logtalk_notebook.lgt
│   │           │   ├── lua_example.lua
│   │           │   ├── maxima_example.mac
│   │           │   ├── notebook_with_complex_metadata.py
│   │           │   ├── nteract_with_parameter.py
│   │           │   ├── ocaml_notebook.ml
│   │           │   ├── octave_notebook.m
│   │           │   ├── plotly_graphs.py
│   │           │   ├── powershell.ps1
│   │           │   ├── raw_cell_with_complex_yaml_like_content.py
│   │           │   ├── raw_cell_with_non_dict_yaml_content.py
│   │           │   ├── root_cpp.cpp
│   │           │   ├── sage_print_hello.sage
│   │           │   ├── sample_bash_notebook.sh
│   │           │   ├── sample_rise_notebook_66.py
│   │           │   ├── sas.sas
│   │           │   ├── simple-helloworld.java
│   │           │   ├── simple_robot_notebook.robot
│   │           │   ├── simple_scala_notebook.scala
│   │           │   ├── stata_notebook.do
│   │           │   ├── tailrecursive-factorial.groovy
│   │           │   ├── tcl_test.tcl
│   │           │   ├── text_outputs_and_images.py
│   │           │   ├── wolfram.wolfram
│   │           │   ├── xcpp_by_quantstack.cpp
│   │           │   └── xonsh_example.xsh
│   │           ├── ipynb_to_script_vim_folding_markers/
│   │           │   ├── Line_breaks_in_LateX_305.py
│   │           │   ├── Notebook with function and cell metadata 164.py
│   │           │   ├── Notebook with html and latex cells.py
│   │           │   ├── Notebook with many hash signs.py
│   │           │   ├── Notebook with metadata and long cells.py
│   │           │   ├── Notebook_with_R_magic.py
│   │           │   ├── Notebook_with_more_R_magic_111.py
│   │           │   ├── The flavors of raw cells.py
│   │           │   ├── cat_variable.py
│   │           │   ├── convert_to_py_then_test_with_update83.py
│   │           │   ├── frozen_cell.py
│   │           │   ├── jupyter.py
│   │           │   ├── jupyter_again.py
│   │           │   ├── jupyter_with_raw_cell_in_body.py
│   │           │   ├── jupyter_with_raw_cell_on_top.py
│   │           │   ├── jupyter_with_raw_cell_with_invalid_yaml.py
│   │           │   ├── jupyterlab-slideshow_1441.py
│   │           │   ├── notebook_with_complex_metadata.py
│   │           │   ├── nteract_with_parameter.py
│   │           │   ├── plotly_graphs.py
│   │           │   ├── raw_cell_with_complex_yaml_like_content.py
│   │           │   ├── raw_cell_with_non_dict_yaml_content.py
│   │           │   ├── sample_rise_notebook_66.py
│   │           │   └── text_outputs_and_images.py
│   │           ├── ipynb_to_script_vscode_folding_markers/
│   │           │   ├── Line_breaks_in_LateX_305.py
│   │           │   ├── Notebook with function and cell metadata 164.py
│   │           │   ├── Notebook with html and latex cells.py
│   │           │   ├── Notebook with many hash signs.py
│   │           │   ├── Notebook with metadata and long cells.py
│   │           │   ├── Notebook_with_R_magic.py
│   │           │   ├── Notebook_with_more_R_magic_111.py
│   │           │   ├── The flavors of raw cells.py
│   │           │   ├── cat_variable.py
│   │           │   ├── convert_to_py_then_test_with_update83.py
│   │           │   ├── frozen_cell.py
│   │           │   ├── jupyter.py
│   │           │   ├── jupyter_again.py
│   │           │   ├── jupyter_with_raw_cell_in_body.py
│   │           │   ├── jupyter_with_raw_cell_on_top.py
│   │           │   ├── jupyter_with_raw_cell_with_invalid_yaml.py
│   │           │   ├── jupyterlab-slideshow_1441.py
│   │           │   ├── notebook_with_complex_metadata.py
│   │           │   ├── nteract_with_parameter.py
│   │           │   ├── plotly_graphs.py
│   │           │   ├── raw_cell_with_complex_yaml_like_content.py
│   │           │   ├── raw_cell_with_non_dict_yaml_content.py
│   │           │   ├── sample_rise_notebook_66.py
│   │           │   └── text_outputs_and_images.py
│   │           ├── ipynb_to_sphinx/
│   │           │   ├── Line_breaks_in_LateX_305.py
│   │           │   ├── cat_variable.py
│   │           │   ├── convert_to_py_then_test_with_update83.py
│   │           │   ├── jupyter.py
│   │           │   ├── jupyter_again.py
│   │           │   ├── jupyterlab-slideshow_1441.py
│   │           │   ├── notebook_with_complex_metadata.py
│   │           │   ├── nteract_with_parameter.py
│   │           │   ├── plotly_graphs.py
│   │           │   ├── sample_rise_notebook_66.py
│   │           │   └── text_outputs_and_images.py
│   │           ├── ipynb_to_spin/
│   │           │   ├── R notebook with invalid cell keys.R
│   │           │   ├── R notebook with invalid cell keys.low.r
│   │           │   ├── ir_notebook.R
│   │           │   └── ir_notebook.low.r
│   │           ├── md_to_ipynb/
│   │           │   ├── jupytext_markdown.ipynb
│   │           │   └── plain_markdown.ipynb
│   │           ├── myst_to_ipynb/
│   │           │   ├── fenced_code_vs_code_cells.ipynb
│   │           │   └── reference_link.ipynb
│   │           ├── script_to_ipynb/
│   │           │   ├── basic_marimo_example.ipynb
│   │           │   ├── build.ipynb
│   │           │   ├── hydrogen.ipynb
│   │           │   ├── hydrogen_latex_html_R_magics.ipynb
│   │           │   ├── julia_sample_script.ipynb
│   │           │   ├── knitr-spin.ipynb
│   │           │   ├── light_sample.ipynb
│   │           │   ├── python_notebook_sample.ipynb
│   │           │   └── simple_r_script.ipynb
│   │           ├── sphinx-rst2md_to_ipynb/
│   │           │   └── plot_notebook.ipynb
│   │           └── sphinx_to_ipynb/
│   │               └── plot_notebook.ipynb
│   ├── external/
│   │   ├── cli/
│   │   │   ├── test_black.py
│   │   │   ├── test_cli_check.py
│   │   │   └── test_isort.py
│   │   ├── conftest.py
│   │   ├── contents_manager/
│   │   │   └── test_contentsmanager_external.py
│   │   ├── docs/
│   │   │   └── test_using_cli.py
│   │   ├── jupyter_fs/
│   │   │   └── test_jupyter_fs.py
│   │   ├── pre_commit/
│   │   │   ├── test_pre_commit_0_ipynb_to_py.py
│   │   │   ├── test_pre_commit_1_sync.py
│   │   │   ├── test_pre_commit_1_sync_with_config.py
│   │   │   ├── test_pre_commit_1_sync_with_no_config.py
│   │   │   ├── test_pre_commit_2_sync_nbstripout.py
│   │   │   ├── test_pre_commit_3_sync_black_nbstripout.py
│   │   │   ├── test_pre_commit_4_sync_execute.py
│   │   │   ├── test_pre_commit_5_reformat_markdown.py
│   │   │   ├── test_pre_commit_mode.py
│   │   │   └── test_pre_commit_scripts.py
│   │   ├── round_trip/
│   │   │   └── test_mirror_external.py
│   │   ├── rst2md/
│   │   │   └── test_rst2md.py
│   │   ├── simple_external_notebooks/
│   │   │   ├── test_read_simple_pandoc.py
│   │   │   └── test_read_simple_quarto.py
│   │   └── test_marimo.py
│   ├── functional/
│   │   ├── cli/
│   │   │   ├── test_cli.py
│   │   │   ├── test_cli_config.py
│   │   │   ├── test_source_is_newer.py
│   │   │   └── test_synchronous_changes.py
│   │   ├── config/
│   │   │   └── test_config.py
│   │   ├── contents_manager/
│   │   │   └── test_async_and_sync_contents_manager_are_in_sync.py
│   │   ├── docs/
│   │   │   ├── test_changelog.py
│   │   │   └── test_doc_files_are_notebooks.py
│   │   ├── metadata/
│   │   │   ├── test_metadata_filter.py
│   │   │   └── test_metadata_filters_from_config.py
│   │   ├── others/
│   │   │   ├── invalid_file_896.md
│   │   │   ├── test_active_cells.py
│   │   │   ├── test_auto_ext.py
│   │   │   ├── test_cell_markers.py
│   │   │   ├── test_cell_metadata.py
│   │   │   ├── test_cell_tags_are_preserved.py
│   │   │   ├── test_cells.py
│   │   │   ├── test_combine.py
│   │   │   ├── test_custom_cell_magics.py
│   │   │   ├── test_doxygen.py
│   │   │   ├── test_hide_remove_input_outputs_rmarkdown.py
│   │   │   ├── test_invalid_file.py
│   │   │   ├── test_jupytext_errors.py
│   │   │   ├── test_jupytext_read.py
│   │   │   ├── test_nbformat_version.py
│   │   │   ├── test_preserve_empty_cells.py
│   │   │   ├── test_pytest.py
│   │   │   ├── test_raw_strings.py
│   │   │   ├── test_read_write_functions.py
│   │   │   ├── test_remove_encoding.py
│   │   │   ├── test_sample_notebooks_are_normalized.py
│   │   │   ├── test_save_multiple.py
│   │   │   ├── test_trust_notebook.py
│   │   │   ├── test_unicode.py
│   │   │   └── test_write_does_not_modify_notebook.py
│   │   ├── round_trip/
│   │   │   ├── test_jupytext_nbconvert_round_trip.py
│   │   │   ├── test_mirror.py
│   │   │   ├── test_myst_header.py
│   │   │   ├── test_read_all_py.py
│   │   │   └── test_rmd_to_ipynb.py
│   │   └── simple_notebooks/
│   │       ├── test_ipynb_to_R.py
│   │       ├── test_ipynb_to_myst.py
│   │       ├── test_ipynb_to_py.py
│   │       ├── test_ipynb_to_rmd.py
│   │       ├── test_knitr_spin.py
│   │       ├── test_read_dotnet_try_markdown.py
│   │       ├── test_read_empty_text_notebook.py
│   │       ├── test_read_folding_markers.py
│   │       ├── test_read_incomplete_rmd.py
│   │       ├── test_read_simple_R.py
│   │       ├── test_read_simple_clojure.py
│   │       ├── test_read_simple_csharp.py
│   │       ├── test_read_simple_go.py
│   │       ├── test_read_simple_groovy.py
│   │       ├── test_read_simple_hydrogen.py
│   │       ├── test_read_simple_ipynb.py
│   │       ├── test_read_simple_java.py
│   │       ├── test_read_simple_julia.py
│   │       ├── test_read_simple_markdown.py
│   │       ├── test_read_simple_matlab.py
│   │       ├── test_read_simple_nomarker.py
│   │       ├── test_read_simple_ocaml.py
│   │       ├── test_read_simple_percent.py
│   │       ├── test_read_simple_python.py
│   │       ├── test_read_simple_rmd.py
│   │       ├── test_read_simple_rust.py
│   │       ├── test_read_simple_scheme.py
│   │       └── test_read_simple_sphinx.py
│   ├── integration/
│   │   ├── cli/
│   │   │   ├── test_cli_pipe.py
│   │   │   └── test_execute.py
│   │   ├── contents_manager/
│   │   │   ├── test_cm_config.py
│   │   │   ├── test_contentsmanager.py
│   │   │   └── test_load_multiple.py
│   │   └── jupytext_config/
│   │       └── test_jupytext_config.py
│   └── unit/
│       ├── test_cell_id.py
│       ├── test_compare.py
│       ├── test_escape_magics.py
│       ├── test_formats.py
│       ├── test_header.py
│       ├── test_labconfig.py
│       ├── test_markdown_in_code_cells.py
│       ├── test_paired_paths.py
│       ├── test_pep8.py
│       └── test_stringparser.py
└── tools/
    └── absolute_links_in_readme.py

================================================
FILE CONTENTS
================================================

================================================
FILE: .git-blame-ignore-revs
================================================
# git config blame.ignoreRevsFile .git-blame-ignore-revs
961ce04d240560ea5d54b5d1ab40e6b5d76b4474


================================================
FILE: .git_archival.txt
================================================
node: $Format:%H$
node-date: $Format:%cI$
describe-name: $Format:%(describe:tags=true,match=*[0-9]*)$
ref-names: $Format:%D$


================================================
FILE: .gitattributes
================================================
World\ population.ipynb linguist-documentation
.git_archival.txt  export-subst
# SCM syntax highlighting & preventing 3-way merges
pixi.lock merge=binary linguist-language=TOML linguist-generated=true


================================================
FILE: .github/codecov.yml
================================================
codecov:
  token: 8bdc5016-2a81-4a43-bdd5-7b3b9adc37e7
  notify:
    wait_for_ci: true

coverage:
  status:
    project:
      source:
        paths:
          - "src/jupytext/"
        target: 96%
        threshold: 0.2%
      tests:
        paths:
          - "tests/"
        target: 100%
      unit-tests:
        threshold: 0.2%
        flags:
          - unit
      functional-tests:
        threshold: 0.2%
        flags:
          - functional
      integration-tests:
        threshold: 0.2%
        flags:
          - integration
      external-tests:
        threshold: 0.2%
        flags:
          - external
    patch:
      default:
        target: 80%


================================================
FILE: .github/dependabot.yml
================================================
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file

version: 2
updates:
  # Let's not bother about bumping top level dependencies as they are mostly
  # developmental packages like linters. We can bump them manually
  # when we make changes to extension packages to be consistent with JupyterLab.
  # Importantly, these packages will not and should not effect the working of the
  # extension, so lets try to keep maintenance low by ignoring this.
  # - package-ecosystem: "npm" # See documentation for possible values
  #   directory: "jupyterlab" # Location of package manifests
  #   schedule:
  #     interval: "weekly"
  #   groups:
  #     top-level-dependencies:
  #       patterns:
  #         - "*"

  - package-ecosystem: "npm" # See documentation for possible values
    directory: "jupyterlab/packages/jupyterlab-jupytext-extension" # Location of package manifests
    schedule:
      interval: "weekly"
    groups:
      jupytext-extension-dependencies:
        patterns:
          - "*"

  - package-ecosystem: "npm" # See documentation for possible values
    directory: "jupyterlab/packages/jupyterlab-jupytext-extension/ui-tests" # Location of package manifests
    schedule:
      interval: "weekly"
    groups:
      jupytext-extension-ui-tests-dependencies:
        patterns:
          - "*"


================================================
FILE: .github/workflows/ci.yml
================================================
name: CI
on:
  workflow_dispatch:
    inputs:
      upload-build-artifacts:
        type: boolean
        required: false
        default: false
        description: Upload build artifacts
  push:
    paths-ignore:
      - "CHANGELOG.md"
    branches: [ main ]
  pull_request:
    branches: [ main ]
  schedule:
    - cron: "0 11 * * 4"

permissions:
  # All nested workflows will inherit these permissions and so no need to declare
  # in each step file
  contents: read

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  pre-commit:
    uses: ./.github/workflows/step_pre-commit.yml

  static-analysis:
    needs: [ pre-commit ]
    uses: ./.github/workflows/step_static-analysis.yml
    permissions:
      contents: read
      security-events: write

  test-pip:
    needs: [ pre-commit ]
    uses: ./.github/workflows/step_tests-pip.yml
    with:
      coverage: ${{ github.event_name != 'schedule' }}

  coverage:
    needs: [ test-pip ]
    uses: ./.github/workflows/step_coverage.yml
    if: github.event_name != 'schedule'

  test-conda:
    needs: [ pre-commit ]
    uses: ./.github/workflows/step_tests-conda.yml
    with:
      coverage: ${{ github.event_name != 'schedule' }}

  test-ui:
    needs: [ test-pip ]
    uses: ./.github/workflows/step_tests-ui.yml

  build:
    needs: [ test-pip, test-conda, test-ui ]
    uses: ./.github/workflows/step_build.yml
    with:
      upload: ${{ inputs.upload-build-artifacts || false }}

  pass:
    name: Pass
    needs: [ pre-commit, static-analysis, test-pip, coverage, test-conda, test-ui, build ]
    runs-on: ubuntu-latest
    steps:
      - uses: re-actors/alls-green@release/v1
        with:
          jobs: ${{ toJSON(needs) }}
          allowed-skips: coverage
    if: always()


================================================
FILE: .github/workflows/comment-pr.yml
================================================
name: Comment PR

on:
  pull_request_target:

permissions:
  pull-requests: write

jobs:
  comment-pr:
    runs-on: ubuntu-latest
    name: Comment PR
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Comment PR
        uses: thollander/actions-comment-pull-request@v2
        with:
          message: |
            Thank you for making this pull request.

            Did you know? You can try it on Binder: [![Binder:lab](https://img.shields.io/badge/binder-jupyterlab-0172B2.svg)](https://mybinder.org/v2/gh/${{ github.event.pull_request.head.repo.full_name }}/${{ github.event.pull_request.head.ref }}?urlpath=lab/tree/demo/get_started.ipynb) or [![Binder:notebook](https://img.shields.io/badge/binder-notebook-0172B2.svg)](https://mybinder.org/v2/gh/${{ github.event.pull_request.head.repo.full_name }}/${{ github.event.pull_request.head.ref }}?filepath=demo).

            Also, the version of Jupytext developed in this PR can be installed with `pip`:
            ```
            HATCH_BUILD_HOOKS_ENABLE=true pip install git+${{ github.event.pull_request.head.repo.clone_url }}@${{ github.event.pull_request.head.ref }}
            ```
            (this requires `nodejs`, see more at [Developing Jupytext](https://jupytext.readthedocs.io/en/latest/developing.html))
          comment_tag: binder_link


================================================
FILE: .github/workflows/publish.yml
================================================
name: Publish
on:
  push:
    tags:
      - "v[0-9]+.[0-9]+.[0-9]+*"

permissions:
  contents: read

jobs:
  build:
    uses: ./.github/workflows/step_build.yml

  publish:
    needs: [ build ]
    runs-on: ubuntu-latest

    environment:
      name: pypi
      url: https://pypi.org/p/jupytext

    permissions:
      contents: read
      id-token: write

    steps:
      - name: Checkout source
        uses: actions/checkout@v3


      - name: Install pixi
        uses: prefix-dev/setup-pixi@v0.9.1
        with:
          pixi-version: v0.59.0
          cache: true

      - name: Build package
        run: |
          eval "$(pixi shell-hook)"
          HATCH_BUILD_HOOKS_ENABLE=true hatch build

      - name: Publish
        uses: pypa/gh-action-pypi-publish@release/v1


================================================
FILE: .github/workflows/step_build.yml
================================================
name: build
run-name: Build package

on:
  workflow_call:
    inputs:
      upload:
        type: boolean
        required: false
        default: false
        description: Upload build artifacts
      ref:
        type: string
        description: Tag to build

permissions:
  contents: read

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout source
        uses: actions/checkout@v4

      - name: Install pixi
        uses: prefix-dev/setup-pixi@v0.9.1
        with:
          pixi-version: v0.59.0
          cache: true

      - name: Build package
        run: |
          eval "$(pixi shell-hook)"
          HATCH_BUILD_HOOKS_ENABLE=true hatch build

      - name: Archive build artifacts
        uses: actions/upload-artifact@v4
        with:
          name: dist
          path: dist
        if: ${{ inputs.upload }}


================================================
FILE: .github/workflows/step_coverage.yml
================================================
name: coverage
run-name: Check coverage

on:
  workflow_call:

permissions:
  contents: read

jobs:
  coverage:
    name: >
      ${{ matrix.coverage }}
    runs-on: ubuntu-latest

    strategy:
      fail-fast: false
      matrix:
        coverage: [unit, functional, integration, external]

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Base Setup
        uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
        with:
          python_version: 3.x

      - name: Install from source
        run: python -m pip install -e '.[test-cov,test-${{ matrix.coverage }}]'

      - name: Install a Jupyter Kernel
        run: python -m ipykernel install --name python_kernel --user

      - name: Run the tests
        run: pytest tests/${{ matrix.coverage }} -n logical --cov --cov-report=xml

      - name: Upload the coverage
        uses: codecov/codecov-action@v5
        with:
          flags: ${{ matrix.coverage }}
          fail_ci_if_error: true
          verbose: true


================================================
FILE: .github/workflows/step_pre-commit.yml
================================================
name: pre-commit
run-name: Run pre-commit tests

on:
  workflow_call:

permissions:
  contents: read

jobs:
  pre-commit:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout source
        uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.x"

      - name: Install pixi
        uses: prefix-dev/setup-pixi@v0.9.1
        with:
          pixi-version: v0.55.0
          cache: true

      - uses: pre-commit/action@v3.0.0

  lint-extension:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout source
        uses: actions/checkout@v4

      - name: Base Setup
        uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
        with:
          python_version: "3.x"

      # Current repo organization will not permit to set up pre-commit config for
      # TS lint related packages due to absence of package.json in the top level
      # repo. So we run lint step separately here
      - name: Lint the extension
        run: |
          # Install JupyterLab in an isolated env to get jlpm
          pip install jupyterlab>=4

          # Install lint deps and lint extension
          cd jupyterlab/
          jlpm
          jlpm run lint:check


================================================
FILE: .github/workflows/step_static-analysis.yml
================================================
name: static-analysis
run-name: Run CodeQL analysis

on:
  workflow_call:

permissions:
  contents: read
  security-events: write

jobs:
  codeql:
    runs-on: ubuntu-latest
    continue-on-error: true
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Initialize CodeQL
        uses: github/codeql-action/init@v3
        with:
          languages: python, javascript

      - name: Perform CodeQL Analysis
        uses: github/codeql-action/analyze@v3


================================================
FILE: .github/workflows/step_tests-conda.yml
================================================
name: test-conda
run-name: Run Conda tests for different OS

on:
  workflow_call:
    inputs:
      coverage:
        type: boolean
        description: Upload coverage to CodeCov
        default: true

permissions:
  contents: read

jobs:
  test-conda:
    name: >
      ${{ matrix.os }} (${{ matrix.dependency-mode }} dependencies)
    strategy:
      fail-fast: false
      matrix:
        os: [ 'ubuntu-latest', 'macos-latest', 'windows-latest' ]
        dependency-mode: [ 'locked', 'latest' ]
    runs-on: ${{ matrix.os }}
    defaults:
      run:
        shell: bash -el {0}

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install pixi
        uses: prefix-dev/setup-pixi@v0.9.1
        with:
          pixi-version: v0.59.0
          cache: true

      - name: Update pixi environment
        if: matrix.dependency-mode == 'latest'
        run: |
          eval "$(pixi shell-hook)"
          pixi update

      - name: Run tests
        run: |
          eval "$(pixi shell-hook)"
          # Install from source
          HATCH_BUILD_HOOKS_ENABLE=true python -m pip install -e .

          # Install a Jupyter Kernel
          python -m ipykernel install --name jupytext-ci --user

          # Test with pytest
          pytest -n logical --cov --cov-report=xml

          # Uninstall jupyter-fs as it overrides the original browser-test.js to
          # check its own functionality (https://github.com/jpmorganchase/jupyter-fs/blob/main/jupyterfs/browser-test.js)
          # So uninstall jupyter-fs before running browser check
          pip uninstall jupyter-fs -y

          # Check extension
          jupyter labextension list
          jupyter labextension list 2>&1 | grep -ie "jupyterlab-jupytext.*OK"

          # Test lab extension
          python -m jupyterlab.browser_check

      - name: Upload coverage
        uses: codecov/codecov-action@v5
        with:
          fail_ci_if_error: true
          verbose: true
        if: inputs.coverage


================================================
FILE: .github/workflows/step_tests-pip.yml
================================================
name: test-pip
run-name: Run main tests using Pip

on:
  workflow_call:
    inputs:
      coverage:
        type: boolean
        description: Upload coverage to CodeCov
        default: true

permissions:
  contents: read

jobs:
  test-pip:
    name: >
      🐍 ${{ matrix.python-version }}
      ${{ matrix.dependency_type && format('({0})', matrix.dependency_type) }}
      ${{ matrix.quarto && '(Quarto)' }}
      ${{ matrix.no_kernel && '(No kernel)' }}
      ${{ matrix.markdown-it-py && format('(markdown-it-py {0})', matrix.markdown-it-py) }}
      ${{ matrix.no_markdown-it-py && '(No markdown-it-py)'}}
      ${{ matrix.jupyter_server && format('(Jupyter-server {0})', matrix.jupyter_server) }}
    runs-on: ubuntu-latest

    strategy:
      fail-fast: false
      matrix:
        python-version: [ "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"]
        experimental: [false]
        include:
          # Test with jupyter-server=2.10 that does not have the 'require_hash' argument
          - python-version: "3.x"
            jupyter_server: "2.10.0"
          # Test minimum markdown-it-py supported (otherwise the most recent version is used)
          - python-version: "3.x"
            markdown-it-py: "~=2.0"
          - python-version: "3.x"
            no_markdown-it-py: true
          - python-version: "3.x"
            no_kernel: true
          - python-version: "3.x"
            quarto: true

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Base Setup
        uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
        with:
          python_version: ${{ matrix.python-version }}
          dependency_type: ${{ matrix.dependency_type }}

      - name: Install from source
        run: >
          HATCH_BUILD_HOOKS_ENABLE=true python -m pip install
          -e '.[test-cov,test-external]'
          jupyterlab
          ${{ format('markdown-it-py{0}', matrix.markdown-it-py) }}

      - name: Install Jupyter Server
        if: ${{ matrix.jupyter_server }}
        run: python -m pip install 'jupyter_server~=${{ matrix.jupyter_server }}'

      - name: List the versions of the Jupyter components
        run: jupyter --version

      - name: Install a Jupyter Kernel
        if: ${{ !matrix.no_kernel }}
        run: python -m ipykernel install --name python_kernel --user

      - name: Uninstall markdown-it-py
        # Markdown-it-py is a dependency of Jupytext,
        # but Jupytext should still work if it is not installed
        if: ${{ matrix.no_markdown-it-py }}
        run: python -m pip uninstall markdown-it-py --yes

      - name: Install Quarto
        if: ${{ matrix.quarto }}
        env:
          GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
        run: |
          # download the latest release
          gh release download --repo quarto-dev/quarto-cli --pattern 'quarto-*-linux-amd64.deb'
          # install it
          sudo apt install ./*.deb

      - name: Test with pytest
        continue-on-error: ${{ matrix.experimental }}
        run: pytest -n logical --cov --cov-report=xml

      - name: Test lab extension
        run: |
          # Uninstall jupyter-fs as it overrides the original browser-test.js to
          # check its own functionality (https://github.com/jpmorganchase/jupyter-fs/blob/main/jupyterfs/browser-test.js)
          # So uninstall jupyter-fs before running browser check
          #
          pip uninstall jupyter-fs -y

          # Check extension
          jupyter labextension list
          jupyter labextension list 2>&1 | grep -ie "jupyterlab-jupytext.*OK"

          python -m jupyterlab.browser_check

      - name: Upload coverage
        uses: codecov/codecov-action@v5
        with:
          fail_ci_if_error: true
          verbose: true
        if: inputs.coverage


================================================
FILE: .github/workflows/step_tests-ui.yml
================================================
name: test-ui
run-name: Run UI tests with Galata

on:
  workflow_call:

permissions:
  contents: read

jobs:
  test-ui:
    continue-on-error: false
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install pixi
        uses: prefix-dev/setup-pixi@v0.9.1
        with:
          pixi-version: v0.59.0
          cache: true

      - name: Install from source
        run: |
          eval "$(pixi shell-hook)"
          HATCH_BUILD_HOOKS_ENABLE=true python -m pip install -e '.[test-ui]'

      - name: Uninstall jupyter-fs
        run: |
          eval "$(pixi shell-hook)"
          # Uninstall jupyter-fs as it overrides the original browser-test.js to
          # check its own functionality (https://github.com/jpmorganchase/jupyter-fs/blob/main/jupyterfs/browser-test.js)
          pip uninstall jupyter-fs -y

      - name: Install galata
        working-directory: jupyterlab/packages/jupyterlab-jupytext-extension/ui-tests
        env:
          PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
        run: |
          eval "$(pixi shell-hook)"
          jlpm install

      - name: Install browser
        working-directory: jupyterlab/packages/jupyterlab-jupytext-extension/ui-tests
        run: |
          eval "$(pixi shell-hook)"
          jlpm playwright install chromium

      - name: Integration tests
        working-directory: jupyterlab/packages/jupyterlab-jupytext-extension/ui-tests
        run: |
          eval "$(pixi shell-hook)"
          jlpm playwright test

      - name: Upload UI Test artifacts
        if: failure()
        uses: actions/upload-artifact@v4
        with:
          name: ui-test-output
          path: |
            jupyterlab/packages/jupyterlab-jupytext-extension/ui-tests/test-results


================================================
FILE: .github/workflows/update-playwright-snapshots.yml
================================================
name: Update Playwright Snapshots

on:
  issue_comment:
    types: [created, edited]

permissions:
  contents: write
  pull-requests: write

jobs:
  update-snapshots:
    if: ${{ github.event.issue.pull_request && contains(github.event.comment.body, 'update playwright snapshots') }}
    runs-on: ubuntu-latest

    steps:
      - name: React to the triggering comment
        run: |
          gh api repos/${{ github.repository }}/issues/comments/${{ github.event.comment.id }}/reactions --raw-field 'content=+1'
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Checkout
        uses: actions/checkout@v4

      - name: Checkout the branch from the PR that triggered the job
        run: |
          gh pr checkout ${{ github.event.issue.number }}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Install jupytext
        run: |
          HATCH_BUILD_HOOKS_ENABLE=true python -m pip install -e '.[test-ui]' jupyterlab

          # Uninstall jupyter-fs as it overrides the original browser-test.js to
          # check its own functionality (https://github.com/jpmorganchase/jupyter-fs/blob/main/jupyterfs/browser-test.js)
          pip uninstall jupyter-fs -y

      - name: Update snapshots
        uses: jupyterlab/maintainer-tools/.github/actions/update-snapshots@v1
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          # Test folder within your repository
          test_folder: jupyterlab/packages/jupyterlab-jupytext-extension/ui-tests/tests

          # Playwright knows how to start JupyterLab server
          start_server_script: 'null'
          npm_client: jlpm


================================================
FILE: .gitignore
================================================
.build
.cache
.eggs
.tox

build
/dist
docs/_build

# Will be created by postBuild
demo/get_started.ipynb

# jetbrains ide stuff
*.iml
.idea/

# vscode ide stuff
*.code-workspace
.history
.vscode/*
!.vscode/*.template

# Notebooks
*.pyc
.ipynb_checkpoints
.jupyter_ystore.db*

# Test related files
.coverage
.pytest_cache
*.coverage*
*.xml
.ruff_cache

# Ignore node_modules and yarn cache
node_modules
.yarn

# Ignore jupyter-releaser related stuff
.jupyter_releaser_checkout

# pixi environments
.pixi
*.egg-info


================================================
FILE: .pre-commit-config.yaml
================================================
# Install the pre-commit hooks below with
# 'pre-commit install'

# Auto-update the version of the hooks with
# 'pre-commit autoupdate'

# Run the hooks on all files with
# 'pre-commit run --all'

# NB: In this config we exclude the example and tests notebooks
# from the code hooks (black, flake8, etc) as we want to keep
# the text representation of the test notebooks unchanged, plus
# the (sync) contentsmanager.py which is generated from the async one.
exclude: >
    (?x)^(
      demo/.*|
      tests/data/notebooks/.*|
      src/jupytext/sync_pairs.py|
      src/jupytext/sync_contentsmanager.py|
    )$
repos:

  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v6.0.0
    hooks:
    - id: check-json
    - id: check-yaml
    - id: end-of-file-fixer
    - id: trailing-whitespace

  - repo: https://github.com/astral-sh/ruff-pre-commit
    rev: v0.14.13
    hooks:
      - id: ruff-check
        args: ["--fix", "--show-fixes"]
      - id: ruff-format

  - repo: https://github.com/asottile/pyupgrade
    rev: v3.21.2
    hooks:
      - id: pyupgrade
        args: [--py39-plus]

  - repo: local
    hooks:
      - id: pixi-lock
        name: Update pixi.lock file
        entry: pixi install
        language: system
        pass_filenames: false
        files: ^(pyproject\.toml|pixi\.toml|pixi\.lock|src/jupytext/version\.py)$


================================================
FILE: .pre-commit-hooks.yaml
================================================
- id: jupytext
  name: jupytext
  description: Runs jupytext on all notebooks and paired files.
  language: python
  entry: jupytext --pre-commit-mode
  require_serial: true
  # We have only added the most frequent text notebook types, but
  # many more types are actually supported (r, matlab, js, bash, powershell, robot, ...)
  # If you need support for one of these other extensions, please override this default value
  types_or: [jupyter, markdown, python]


================================================
FILE: .readthedocs.yml
================================================
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details

# Required
version: 2

# Build the documentation using Pixi
build:
  os: "ubuntu-24.04"
  tools:
    python: "3.12"
  commands:
    - asdf plugin add pixi
    - asdf install pixi latest
    - asdf global pixi latest
    - pixi run -e docs sphinx-build -b html docs ${READTHEDOCS_OUTPUT:-docs/_build}/html


================================================
FILE: CHANGELOG.md
================================================
Jupytext ChangeLog
==================

1.19.1 (2026-01-25)
-------------------

**Changed**
- Jupytext does not change the file icons anymore! Thanks to [Michał Krassowski](https://github.com/krassowski) for finally solving this long standing issue! ([#398](https://github.com/mwouts/jupytext/issues/398))
- We have bumped lodash from 4.17.21 to 4.17.23 in JupyterLab extension ([#1483](https://github.com/mwouts/jupytext/pull/1483))
- We require `marimo<=0.19.4` in tests following a change in the location of the `marimo` import ([#1485](https://github.com/mwouts/jupytext/issues/1485))


1.19.0 (2026-01-18)
-------------------

**Changed**
- The environment used to develop Jupytext is now maintained using Pixi ([#1459](https://github.com/mwouts/jupytext/pull/1459))

**Fixed**
- We have restored the support for `.qmd` documents in Jupyter ([#1435](https://github.com/mwouts/jupytext/issues/1435))
- We have fixed warnings about the cell ids like either `Cell is missing an id field` or `Additional properties are not allowed ('id' was unexpected)` when converting to some formats, including Pandoc ([#1464](https://github.com/mwouts/jupytext/pull/1464))
- We have updated the dependencies of the Jupytext extension for JupyterLab. Many thanks to [Mahendra Paipuri](https://github.com/mahendrapaipuri) for his PR ([#1477](https://github.com/mwouts/jupytext/pull/1477))!

**Added**
- We have added a new `py:marimo` format, which uses the `marimo` command line interface to convert notebooks to and from the Marimo format ([#1431](https://github.com/mwouts/jupytext/pull/1431))


1.18.1 (2025-10-19)
-------------------

**Fixed**
- Fixed test `test_check_source_is_newer_when_using_jupytext_sync` to work reliably on systems with low filesystem timestamp resolution ([#1460](https://github.com/mwouts/jupytext/issues/1460))

**Changed**
- We now use `pixi` to maintain the local Python environments used for developing and testing Jupytext.


1.18.0 (2025-10-18)
-------------------

**Added**
- The documentation has a chapter on the [Jupytext Sync](https://jupytext.readthedocs.io/en/latest/vs-code.html) extension for VS Code ([#1395](https://github.com/mwouts/jupytext/issues/1395))
- We have added a new option `--check-source-is-newer` to the Jupytext CLI. Use this option if you want to make sure that the file passed as argument to Jupytext is the newest of all paired files, and/or newer than the destination file.
- We have added a section on [Jupyter Collaboration](https://jupytext.readthedocs.io/en/latest/jupyter-collaboration.html) which also provides a very useful autoreload functionality ([#406](https://github.com/mwouts/jupytext/issues/406), [#1401](https://github.com/mwouts/jupytext/issues/1401))
- Pairing groups allow you to define different pairing configurations for specific subsets of notebooks. The `formats` configuration option now supports a list of format dictionaries for first-match pairing. Use `[[formats]]` sections in your TOML configuration to define multiple format specifications, where the first matching format is used. This allows applying different pairing rules to notebooks in different locations, such as generating documentation markdown files only for tutorial notebooks ([#1383](https://github.com/mwouts/jupytext/issues/1383))
- We have added more tests to document the complex pairing formats, which also work on Windows ([#1028](https://github.com/mwouts/jupytext/issues/1028))
- Pairing into nested folders was fixed on Windows ([#1028](https://github.com/mwouts/jupytext/issues/1028))
- Jupytext is now tested with Python 3.14 ([#1456](https://github.com/mwouts/jupytext/issues/1456))

**Fixed**
- The Jupytext CLI now detects if a file it has read or consulted has been modified while it was processing it. That can happen in the context of the [Jupytext Sync](https://marketplace.visualstudio.com/items?itemName=caenrigen.jupytext-sync) extension for VS Code ([#1411](https://github.com/mwouts/jupytext/issues/1411), [vscode-jupytext-sync-#12](https://github.com/caenrigen/vscode-jupytext-sync/issues/12)). When such a synchronous modification is detected, Jupytext now raises an error. Many thanks to [Anne Archibald](https://github.com/aarchiba) for reporting the issue and preparing an inspiring PR ([#1417](https://github.com/mwouts/jupytext/pull/1417)).
- We don't import `notebook` when `jupyter_server` is available ([#1436](https://github.com/mwouts/jupytext/issues/1436))
- Jupytext now supports more characters in the cell metadata keys, to improve compatibility with `jupyterlab-slideshow` ([#1441](https://github.com/mwouts/jupytext/issues/1441)). Thanks to [Nicolas Thierry](https://github.com/nthiery) for this fix.
- The function `find_jupytext_configuration_file` now works with relative directories ([#1440](https://github.com/mwouts/jupytext/issues/1440)). This fix was contributed by [Thierry Parmentelat](https://github.com/parmentelat).
- We have fixed a parsing error for R Markdown files ([#1429](https://github.com/mwouts/jupytext/issues/1429))
- We have fixed a parsing error when the first cell of the notebook contains a YAML header that is not a dict ([#1444](https://github.com/mwouts/jupytext/issues/1444))

**Changed**
- We have updated the pre-commit hooks. The code is now formatted using `ruff format`, and updated for Python 3.9+ using https://github.com/asottile/pyupgrade ([#1423](https://github.com/mwouts/jupytext/issues/1423))


1.17.3 (2025-08-28)
-------------------

**Added**
- All the extensions supported by Jupytext now appear in the `--to` paragraph
of `jupytext --help` ([#433](https://github.com/mwouts/jupytext/issues/433))
- We have added a new function `get_formats_from_notebook_path` that returns the list of paired
formats for a given notebook ([#1419](https://github.com/mwouts/jupytext/issues/1419))

**Fixed**
- We have fixed `jupytext --sync`, and the contents manager, to make sure that a simple `.py` file (not in the percent format) will not be treated as a paired file when the Jupytext configuration file has `formats="ipynb,py:percent"` ([#1418](https://github.com/mwouts/jupytext/issues/1418))
- A notebook can be moved in Jupyter even if that makes it unpaired ([#1414](https://github.com/mwouts/jupytext/issues/1414))
- The test against `jupyter-fs` now installs its `fs` extra dependency ([#1398](https://github.com/mwouts/jupytext/issues/1398))
- The `jupytext --sync` command now works correctly with symbolic links. Thanks to [mccullerlp](https://github.com/mccullerlp) for reporting ([#1407](https://github.com/mwouts/jupytext/issues/1407)) and addressing ([#1408](https://github.com/mwouts/jupytext/pull/1408)) the problem!
- Jupytext will look for `quarto.cmd` on Windows. Thanks to [mccullerlp](https://github.com/mccullerlp) for documenting the issue ([#1406](https://github.com/mwouts/jupytext/issues/1406), [#1409](https://github.com/mwouts/jupytext/pull/1409)).
- We have corrected the `jupytext --paired-paths` command: it will now take the Jupytext configuration file, if any, into account ([#1419](https://github.com/mwouts/jupytext/issues/1419))


1.17.2 (2025-06-01)
-------------------

**Fixed**
- The `--set-formats` argument takes precedence over pre-existing pairing information in the notebook ([#1386](https://github.com/mwouts/jupytext/issues/1386))

**Changed**
- We have removed Python 3.8 from the list of supported Python version, and from the CI, as it has reached its EOL

**Added**
- ROOT-flavored C++ notebooks can be paired to `.cpp` files - thanks to [Steven Gardiner](https://github.com/sjgardiner) for this contribution ([#1384](https://github.com/mwouts/jupytext/pull/1384))


1.17.1 (2025-04-26)
-------------------

**Fixed**
- Renaming files other than notebooks will not load their content ([#1376](https://github.com/mwouts/jupytext/issues/1376))


1.17.0 (2025-04-05)
-------------------

**Added**
- The MyST frontmatter found in MyST Markdown notebooks can be mapped to a YAML header at the top of the Jupyter notebook. This way MyST notebooks in either the `md:myst` or `ipynb` format can be used with MyST. Thanks to [Ian Carroll](https://github.com/itcarroll) for proposing and implementing this change ([#1314](https://github.com/mwouts/jupytext/issues/1314))
- The context menu has a "New Text Notebook" entry. Thanks to [Mahendra Paipuri](https://github.com/mahendrapaipuri) for this PR ([#1365](https://github.com/mwouts/jupytext/pull/1365))!


**Changed**
- Jupytext's default contents manager is now derived from the asynchronous AsyncLargeFileManager. Thanks to [Darshan Poudel](https://github.com/Darshan808) for making this finally happen ([#1328](https://github.com/mwouts/jupytext/pull/1328))!
- The [percent format](https://jupytext.readthedocs.io/en/latest/formats-scripts.html#the-percent-format) is now the default format for scripts. If you run `jupytext --to py notebook.ipynb` you now get a `py:percent` script (use `--to py:light` for the light format) [#1201](https://github.com/mwouts/jupytext/pull/1201)
- The `rst2md` conversion now works with `sphinx-gallery>=0.8`. Thanks to [Thomas J. Fan](https://github.com/thomasjpfan) for fixing this! ([#1334](https://github.com/mwouts/jupytext/pull/1334))
- We have updated the JupyterLab extension dependencies ([#1300](https://github.com/mwouts/jupytext/pull/1300), [#1355](https://github.com/mwouts/jupytext/pull/1355), [#1360](https://github.com/mwouts/jupytext/pull/1360)). Thanks to [Mahendra Paipuri](https://github.com/mahendrapaipuri) for these PRs!

**Fixed**
- We have added and fixed round trip tests on MyST Markdown notebooks ([#759](https://github.com/mwouts/jupytext/issues/759), [#789](https://github.com/mwouts/jupytext/issues/789), [#1267](https://github.com/mwouts/jupytext/issues/1267), [#1317](https://github.com/mwouts/jupytext/issues/1317))
- The `--quiet` option now works with the `--pipe` mode of Jupytext CLI ([#1305](https://github.com/mwouts/jupytext/issues/1305))
- Jupytext is now compatible with the cell toolbar extension - thanks to [Nicolas Brichet](https://github.com/brichet) for the fix! ([#1358](https://github.com/mwouts/jupytext/pull/1358))
- The project description on PyPI now uses absolute links ([#1287](https://github.com/mwouts/jupytext/issues/1287))


1.16.7 (2025-02-09)
-------------------

**Added**
- Logtalk notebooks are now supported ([#1308](https://github.com/mwouts/jupytext/pull/1308)) - thanks to [Paulo Moura](https://github.com/pmoura) for this contribution

**Fixed**
We have updated the dependencies of the JupyterLab extension to address [security issues](https://github.com/mwouts/jupytext/security/dependabot).


1.16.6 (2024-12-16)
-------------------

**Fixed**
- We fixed a "File Changed" warning when saving notebooks ([#1301](https://github.com/mwouts/jupytext/issues/1301))

**Changed**
- The original file name is easier to infer from the tmp file name in pre-commit hooks ([#1289](https://github.com/mwouts/jupytext/issues/1289)) - thanks to [Lunin Leonid](https://github.com/lrlunin) for making this change.


1.16.5 (2024-12-15)
-------------------

**Fixed**
- We have fixed a notebook corruption issue when using Jupytext with Jupyter-Collaboration ([#1124](https://github.com/mwouts/jupytext/issues/1124), [jupyter-collaboration 214](https://github.com/jupyterlab/jupyter-collaboration/issues/214)).
- We have added the `require_hash` argument on the Jupytext contents manager. The hash of a paired file is the concatenation of the hash of the text file and the hash for the `.ipynb` file ([#1165](https://github.com/mwouts/jupytext/issues/1165))
- The `rst2md` tests have been fixed by requiring `sphinx<8` ([#1266](https://github.com/mwouts/jupytext/issues/1266))
- Some dependencies of the JupyterLab extensions were updated ([#1272](https://github.com/mwouts/jupytext/issues/1272), [#1273](https://github.com/mwouts/jupytext/issues/1273), [#1280](https://github.com/mwouts/jupytext/issues/1280), [#1285](https://github.com/mwouts/jupytext/issues/1285), [#1290](https://github.com/mwouts/jupytext/issues/1290))
- The pre-commit hook is now compatible with log.showsignature=True ([#1281](https://github.com/mwouts/jupytext/issues/1281)). Thanks to [Justin Lecher](https://github.com/jlec) for this fix.

**Added**
- Jupytext is now tested with Python 3.13 ([#1242](https://github.com/mwouts/jupytext/issues/1242)). Thanks to [Jerry James](https://github.com/jamesjer) for the suggested fixes!
- The extension of a notebook piped into stdin will be taken in the notebook metadata ([#1282](https://github.com/mwouts/jupytext/issues/1282))


1.16.4 (2024-07-12)
-------------------

**Fixed**
- We use `asyncio.iscoroutinefunction` to determine whether the current contents manager is sync or async ([#1260](https://github.com/mwouts/jupytext/issues/1260))


1.16.3 (2024-07-09)
-------------------

**Fixed**
- We use `inspect` to determine whether the current contents manager derives from `AsyncContentsManager` (which is not
supported by Jupytext at the moment). This fixes a compatibility issue with `jupyter-fs==1.0.0` ([#1239](https://github.com/mwouts/jupytext/issues/1239)). Thanks to [Mahendra Paipuri](https://github.com/mahendrapaipuri) for this PR!
- We have fixed a typo when `build_jupytext_contents_manager_class` can't be imported ([#1162](https://github.com/mwouts/jupytext/issues/1162))
- A Python 3.13 deprecation warning was fixed [#1241](https://github.com/mwouts/jupytext/pull/1241) - thanks to [Jerry James](https://github.com/jamesjer)
- We have fixed a typo when `build_jupytext_contents_manager_class` can't be imported ([#1162](https://github.com/mwouts/jupytext/issues/1162))
- Some dependencies of the JupyterLab extensions were updated ([#1243](https://github.com/mwouts/jupytext/issues/1243), [#1245](https://github.com/mwouts/jupytext/issues/1245))

**Added**
- Lua notebooks are now supported ([#1252](https://github.com/mwouts/jupytext/pull/1252)) - thanks to [erentar](https://github.com/erentar) for this contribution
- Go notebooks are supported too ([#1244](https://github.com/mwouts/jupytext/issues/1244))! Many thanks to [Jan Pfeifer](https://github.com/janpfeifer), author of [GoNB](https://github.com/janpfeifer/gonb), and to [HaveF](https://github.com/HaveF) for their help on this topic.
- Empty prefixes are now allowed in Jupytext format when specified as a dictionary ([#1144](https://github.com/mwouts/jupytext/issues/1144))

**Changed**
- We've had to deactivate the tests on the Quarto format in the CI as the Quarto round trip
might now add a Markdown cell to the notebook ([#1255](https://github.com/mwouts/jupytext/issues/1255))


1.16.2 (2024-05-05)
-------------------

**Added**
- Added support for Xonsh notebooks ([#1213](https://github.com/mwouts/jupytext/pull/1213)) - thanks to [Jeffrey Odongo](https://github.com/jsquaredosquared) for this contribution

**Changed**
- By default, the JupyterLab extension for Jupytext is not included in the build (set `HATCH_BUILD_HOOKS_ENABLE=true` to include it). This simplifies the installation of Jupytext in pre-commit hooks ([#1210](https://github.com/mwouts/jupytext/issues/1210))
- Temporary text notebooks for the `--pipe` or `--check` commands are now created in the notebook directory ([#1206](https://github.com/mwouts/jupytext/issues/1206))
- Jupytext uses the standard library `tomllib` in Python 3.11, or `tomli` in Python 3.10 or older, to match JupyterLab's dependencies ([#1195](https://github.com/mwouts/jupytext/issues/1195))
- The dependencies of the JupyterLab extension were updated ([#1216](https://github.com/mwouts/jupytext/issues/1216), [#1218](https://github.com/mwouts/jupytext/issues/1218), [#1231](https://github.com/mwouts/jupytext/issues/1231))
- `jupytext --sync` will not update the timestamp of text notebooks if their content is unchanged ([#1215](https://github.com/mwouts/jupytext/issues/1215))


**Fixed**
- Jupytext is now tested with `pandoc>=3.0`. Please note that switching to `pandoc>=3.0` will add cell ids to your `pandoc:md` notebooks ([#1006](https://github.com/mwouts/jupytext/issues/1006))


1.16.1 (2024-01-13)
-------------------

**Changed**
- The CI has been updated. Thanks to [Christian Le](https://github.com/LecrisUT) for taking care of this! ([#1190](https://github.com/mwouts/jupytext/issues/1190), [#1204](https://github.com/mwouts/jupytext/issues/1204))

**Fixed**
- Fixed an issue about unpairing notebooks from the Jupytext Menu ([#1197](https://github.com/mwouts/jupytext/issues/1197))
- JupyterLab's dependency `follow-redirects` was updated from 1.15.3 to 1.15.4 ([#1203](https://github.com/mwouts/jupytext/issues/1203))


1.16.0 (2023-12-03)
-------------------

**Added**
- The Jupytext Menu is back! And text notebooks can be created directly from the launcher. This is an outstanding contribution by [Mahendra Paipuri](https://github.com/mahendrapaipuri) ([#1154](https://github.com/mwouts/jupytext/issues/1154), [#1163](https://github.com/mwouts/jupytext/issues/1163)). This requires JupyterLab 4.x or Jupyter Notebook 7.x.

**Changed**
- Jupytext is now configured with `pyproject.toml` and built with `hatch`. The layout has been reorganised to follow `src-layout` ([#1140](https://github.com/mwouts/jupytext/issues/1140)). This is another outstanding contribution by [Mahendra Paipuri](https://github.com/mahendrapaipuri).
- The tests are now part of the `sdist`. They have been reorganized into unit/functional/integration/external ([#1167](https://github.com/mwouts/jupytext/issues/1167), [#1173](https://github.com/mwouts/jupytext/issues/1173)).
- The legacy extension for Jupyter Notebook <=6 (the Jupytext Menu) has been removed.

**Fixed**
- The bibliography section in Rmd files does not become a code cell anymore ([#1161](https://github.com/mwouts/jupytext/issues/1161))
- Commented code in `active-py` cells is not uncommented anymore ([#1131](https://github.com/mwouts/jupytext/issues/1131))
- The test coverage has been restored ([#1167](https://github.com/mwouts/jupytext/issues/1167), [#1173](https://github.com/mwouts/jupytext/issues/1173))
- We test Jupytext against the pre-release version of JupyterLab, and other dependencies ([#1168](https://github.com/mwouts/jupytext/issues/1168))


1.15.2 (2023-09-16)
-------------------

**Added**
- The JupyterLab extension is now compatible with the [JupyterLab RISE](https://github.com/jupyterlab-contrib/rise) extension. Many thanks to [Frédéric Collonval](https://github.com/fcollonval) for his PR ([#1126](https://github.com/mwouts/jupytext/pull/1126))!


1.15.1 (2023-08-26)
-------------------

**Added**
- We have added a new command line interface `jupytext-config` that you can use to set Jupytext as the default viewer for text notebooks in JupyterLab and Jupyter Notebook 7. Thanks to [Thierry Parmentelat](https://github.com/parmentelat) for this contribution! ([#1094](https://github.com/mwouts/jupytext/pull/1094))


1.15.0 (2023-07-30)
-------------------

**Changed**
- This version comes with a version of the JupyterLab extension that is compatible with JupyterLab 4.x. Many thanks to [Thierry Parmentelat](https://github.com/parmentelat) for his PRs! ([#1092](https://github.com/mwouts/jupytext/pull/1092), [#1109](https://github.com/mwouts/jupytext/pull/1109))
- Pandoc 3.0 is now supported, thanks to [Raniere Silva](https://github.com/rgaiacs) for his PR ([#1099](https://github.com/mwouts/jupytext/pull/1099))
- We have reorganized the documentation and the README.md ([#1031](https://github.com/mwouts/jupytext/issues/1031), [#1073](https://github.com/mwouts/jupytext/issues/1073))
- Invalid `pyproject.toml` files will be ignored by Jupytext in Jupyter ([#1103](https://github.com/mwouts/jupytext/issues/1103))
- We have updated the pre-commit tools


1.14.7 (2023-06-29)
-------------------

**Changed**
- We have updated the GitHub workflows - thanks to Matthew Feickert and to Cristian Le for their help on this subject ([#1037](https://github.com/mwouts/jupytext/issues/1037))
- We have removed the upper bound on `markdown-it-py<3`. Now we test Jupytext with `markdown-it-py` in versions `2.x` and `3.x` on the CI ([#1075](https://github.com/mwouts/jupytext/issues/1075))

**Fixed**
- Notebooks with an empty YAML header work ([#1070](https://github.com/mwouts/jupytext/issues/1070))
- Double quote strings in R Markdown options can contain single quotes ([#1079](https://github.com/mwouts/jupytext/issues/1079))
- The necessary directories are created when paired notebooks are moved to a sub-folder ([#1059](https://github.com/mwouts/jupytext/issues/1059))
- Commented quotes are recognized as such ([#1060](https://github.com/mwouts/jupytext/issues/1060))
- Jupytext can use either `pkg_resources` or `packaging` to parse version numbers ([#1085](https://github.com/mwouts/jupytext/issues/1085))


1.14.6 (2023-06-04)
-------------------

**Changed**
- This version comes with a build requirement `jupyterlab>=3,<4`, as the Jupyterlab
extension for Jupytext is not compatible with JupyterLab 4 yet ([#1054](https://github.com/mwouts/jupytext/issues/1054))
- The JupyterLab extension was released to `npm` in version 1.3.9.


1.14.5 (2023-02-25)
-------------------

**Added**
- Added Stata as a supported language ([#1027](https://github.com/mwouts/jupytext/pull/1027)) - thanks to [Raffaele Mancuso](https://github.com/raffaem) for this contribution
- Added SAS as a supported language ([#1047](https://github.com/mwouts/jupytext/pull/1047)) - thanks to [lawrencet149](https://github.com/lawrencet149) for this contribution
- We have added a series of test to make sure that the main formats support cell tags ([#1024](https://github.com/mwouts/jupytext/issues/1024))

**Fixed**
- When a metadata key is not a valid identifier, a warning is emitted and the metadata is not saved to the text representation ([#1042](https://github.com/mwouts/jupytext/issues/1042))
- The CI was fixed by [Matthew Feickert](https://github.com/matthewfeickert) ([#1035](https://github.com/mwouts/jupytext/pull/1035))
- We now use `concurrency` to cancel previous runs on the same branch/PR ([#1037](https://github.com/mwouts/jupytext/issues/1037))
- We use both `codecov.notify.after_n_builds` and `comment.after_n_builds` to get only the final codecov comment

**Changed**
- Empty tags are not exported to the text notebook anymore ([#960](https://github.com/mwouts/jupytext/issues/960))
- We updated the `yarn.lock` file for the jupyter lab extension to address security vulnerabilities ([#1030](https://github.com/mwouts/jupytext/issues/1030), [#1036](https://github.com/mwouts/jupytext/issues/1036))
- In the pre-commit tests we now use `main` for the main branch


1.14.4 (2022-12-11)
-------------------

**Added**
- Added Wolfram Language as a supported language ([#1014](https://github.com/mwouts/jupytext/issues/1014)) - thanks to [Etienne Dechamps](https://github.com/dechamps) for this contribution


1.14.3 (2022-12-11)
-------------------

**Fixed**
- When the default contents manager is _async_ (i.e. `jupyter_server>=2.0.0`), the Jupyter server extension for Jupytext derives a contents manager from `LargeFileManager` instead, as async contents managers are not supported by Jupytext at the moment ([#1020](https://github.com/mwouts/jupytext/issues/1020))
- We have made adjustments on the CI as flake8 was moved to GitHub, and Python 3.6 is not available anymore on `ubuntu-latest`


1.14.2 (2022-11-12)
-------------------

**Fixed**
- The sample notebooks have been normalized with `nbformat.validator.normalize` ([#1002](https://github.com/mwouts/jupytext/issues/1002)).
- The warnings in the test suite that we cannot fix are filtered using a new `pytest.ini` file
- We updated the `yarn.lock` file for the jupyter lab extension to address security vulnerabilities ([#984](https://github.com/mwouts/jupytext/issues/984), [#1005](https://github.com/mwouts/jupytext/issues/1005), [#1011](https://github.com/mwouts/jupytext/issues/1011))

**Changed**
- The CI uses Python 3.9 rather than 3.7 when testing conda environments

**Added**
- Gnuplot is now supported ([#998](https://github.com/mwouts/jupytext/issues/998)) - thanks to [razimantv](https://github.com/razimantv) for this contribution
- We now test Jupytext against Python 3.6 to 3.11 on the CI
- We have added a test to document how to use the folder and prefix matching when pairing notebooks ([#974](https://github.com/mwouts/jupytext/issues/974))


1.14.1 (2022-07-29)
-------------------

**Fixed**
- The timestamp of a paired notebook is the timestamp of the most recent paired file. This fixes the warning "File Changed"
after reloading the notebook in Jupyter ([#978](https://github.com/mwouts/jupytext/issues/978)).


1.14.0 (2022-07-03)
-------------------

**Changed**
- The Jupytext configuration file has a new option `cm_config_log_level` that defaults to `info_if_changed`.
With that value, the contents manager will log a line regarding the configuration file used only when the
config file is not the same as the one previously used ([#959](https://github.com/mwouts/jupytext/issues/959)) -
many thanks to R.C. Thomas for suggesting this and thoughtfully testing the patch.
- Hidden configuration files like `.jupytext.toml` or `.jupytext.py` are now ignored by Jupytext's contents manager
when `allow_hidden=False` (that option was introduced in `jupyter_server==2.0.0a1`) ([#964](https://github.com/mwouts/jupytext/issues/964)).
- We have changed `jupytext --set-formats` to make it more similar to `jupytext --sync`. Now `--set-formats` will not
override existing paired files anymore ([#969](https://github.com/mwouts/jupytext/issues/969)).

**Added**
- We have added a test `test_pre_commit_hook_sync_with_no_config` that documents how to use the pre-commit hook without
a configuration file ([#967](https://github.com/mwouts/jupytext/issues/967))

1.13.8 (2022-04-04)
-------------------

**Fixed**
- Text-only notebooks are always trusted (as they don't include any output cells) ([#941](https://github.com/mwouts/jupytext/issues/941))
- We made sure that our tests also work in absence of a Python kernel ([#906](https://github.com/mwouts/jupytext/issues/906))
- The coverage of the `tests` folder has been restored at 100%
- Bash commands like `!{cmd}` are now correctly escaped in the `py:percent` format ([#938](https://github.com/mwouts/jupytext/issues/938))

**Added**
- Added Tcl as a supported language ([#930](https://github.com/mwouts/jupytext/issues/930)) - thanks to [shishitao](https://github.com/shishitao) for this contribution
- Added Maxima as a supported language ([#927](https://github.com/mwouts/jupytext/issues/927)) - thanks to [Alberto Lusiani](https://github.com/alusiani) for contributing a sample Maxima notebook.

**Changed**
- The Jupytext contents manager is derived from the `LargeFileManager` imported from `jupyter_server` rather than `notebook` ([#933](https://github.com/mwouts/jupytext/issues/933))
- Allow for markdown-it-py v2 ([#924](https://github.com/mwouts/jupytext/issues/924))
- We have updated the hooks used in the test pre-commits, to fix an issue on the CI ([#940](https://github.com/mwouts/jupytext/issues/940), [#942](https://github.com/mwouts/jupytext/issues/942))
- We updated the `yarn.lock` file for the jupyter lab extension to address security vulnerabilities ([#904](https://github.com/mwouts/jupytext/issues/904), [#925](https://github.com/mwouts/jupytext/issues/925), [#935](https://github.com/mwouts/jupytext/issues/935), [#939](https://github.com/mwouts/jupytext/issues/939))


1.13.7 (2022-02-09)
-------------------

**Fixed**
- The Jupytext CLI only suggest `--update` when the target is an .ipynb file ([#905](https://github.com/mwouts/jupytext/issues/905)) - thanks to [st--](https://github.com/st--) for this contribution
- We made sure that commands like `cat notebook.md | jupytext --execute` work ([#908](https://github.com/mwouts/jupytext/issues/908))

**Added**
- Added Haskell as supported language ([#909](https://github.com/mwouts/jupytext/issues/909)) - thanks to [codeweber](https://github.com/codeweber) for this contribution

**Changed**
- We have updated the pre-commit hooks and in particular we switched to the first stable version of `black==22.1.0`.
- We require `pandoc==2.16.2` for testing. The representation for code cells changed from ` ``` {.python}` to ` ``` python` in that version of Pandoc ([#906](https://github.com/mwouts/jupytext/issues/906)). We don't use `pandoc>=2.17` in tests at the moment because of the introduction of cell ids that cannot be filtered.
- Jupytext will not add anymore a UTF-8 encoding on Python scripts when the notebook contains non-ascii characters ([#907](https://github.com/mwouts/jupytext/issues/907))
- We have added `pyupgrade` to the pre-commit hooks used for developing Jupytext ([#907](https://github.com/mwouts/jupytext/issues/907))


1.13.6 (2022-01-11)
-------------------

**Fixed**
- The `text_representation` metadata of text notebooks is filtered from `.ipynb` files both in `jupytext.write` and in the contents manager for Jupyter ([#900](https://github.com/mwouts/jupytext/issues/900))

**Changed**
- Jupytext will not issue a warning when a format suffix starting with '.', '-' or '_' is passed to the `--to` option ([#901](https://github.com/mwouts/jupytext/issues/901))


1.13.5 (2021-12-27)
-------------------

**Fixed**
- Jupytext will not open a text notebook that is not UTF-8 ([#896](https://github.com/mwouts/jupytext/issues/896))


1.13.4 (2021-12-12)
-------------------

**Changed**
- The test suite filters the warnings that don't belong to Jupytext ([#823](https://github.com/mwouts/jupytext/issues/823))

**Fixed**
- The parsing of notebooks that don't have a YAML header (like `docs/formats.md`) was improved.
- The test suite works with `pytest-randomly` ([#838](https://github.com/mwouts/jupytext/issues/838))


1.13.3 (2021-12-04)
-------------------

**Changed**
- The "Jupytext Notebook" factory that lets the user configure the Notebook viewer as the default for text notebooks accepts more filetypes: "myst", "r-markdown" and "quarto" ([#803](https://github.com/mwouts/jupytext/issues/803))
- Empty MyST Markdown files are valid notebooks ([#883](https://github.com/mwouts/jupytext/issues/883))
- Jupytext also works with `markdown-it-py` v2.0 ([#885](https://github.com/mwouts/jupytext/issues/885))


1.13.2 (2021-11-30)
-------------------

**Changed**
- The extension for JupyterLab benefited from a series of improvements contributed by [Frédéric Collonval](https://github.com/fcollonval):
  - A new "Jupytext Notebook" factory offers the option to open text notebooks directly with the notebook view ([#803](https://github.com/mwouts/jupytext/issues/803)). To use it, follow the instructions in the [documentation](https://github.com/mwouts/jupytext/blob/main/docs/index.md#Install).
  - The ICommandPalette is optional, for compatibility with RISE within JupyterLab [RISE[#605](https://github.com/mwouts/jupytext/issues/605)](https://github.com/damianavila/RISE/pull/605)
  - Added support for translation
- Branch `master` was renamed to `main` (links in the documentation were updated)


1.13.1 (2021-10-07)
-------------------

**Fixed**
- The magic commands in `py:percent` scripts with no explicit format information remain commented over a round trip ([#848](https://github.com/mwouts/jupytext/issues/848))


1.13.0 (2021-09-25)
-------------------

**Added**
- The Jupytext CLI has a new `--diff` command to show the differences between two notebooks (and if you want to see the changes in a file being updated by Jupytext, use `--show-changes`) ([#799](https://github.com/mwouts/jupytext/issues/799))
- Jupyter will show the diff between text and `ipynb` paired notebooks when it cannot open a paired notebook because the `ipynb` version is more recent. Also, if the inputs in the two files are identical then the notebook will open with no error ([#799](https://github.com/mwouts/jupytext/issues/799))
- The `py:percent` format will use raw strings when encoding Markdown cells as string, if they contain backslash characters ([#836](https://github.com/mwouts/jupytext/issues/836))

**Fixed**
- We have upgraded the jupyterlab extension dependencies and especially `ansi-regex` to fix a security vulnerability ([#857](https://github.com/mwouts/jupytext/issues/857))

**Changed**
- The Jupytext configuration file is reloaded only when a notebook is opened, saved, or when a different folder is explored ([#797](https://github.com/mwouts/jupytext/issues/797))


1.12.0 (2021-09-09)
-------------------

**Added**
- Jupytext supports Quarto notebooks (with `.qmd` extension) ([#837](https://github.com/mwouts/jupytext/issues/837))
- Jupytext can be configured through the `pyproject.toml` file. Thanks to Robin Brown for this contribution! ([#828](https://github.com/mwouts/jupytext/issues/828))
- Jupytext now supports OCaml files with `.ml` extension. Thanks to Quentin Fortier for getting this started ([#832](https://github.com/mwouts/jupytext/issues/832))

**Fixed**
- Added more test to make sure that notebooks can be trusted. In practice, notebooks could not be trusted in JupyterLab<3.0.13 because of the absence of cell ids ([#826](https://github.com/mwouts/jupytext/issues/826))


1.11.5 (2021-08-31)
-------------------

**Fixed**
- Fixed typos revealed by `codespell` - thanks to @hectormz for this contribution ([#829](https://github.com/mwouts/jupytext/issues/829))
- We updated the dependencies of the `jupyterlab-jupytext` extension to address several security issues ([#842](https://github.com/mwouts/jupytext/issues/842)) ([#843](https://github.com/mwouts/jupytext/issues/843))
- The Jupytext dev environment (`requirements-dev.txt`) now uses `jupyterlab==3.0.17` rather than `3.0.0` because of another security issue ([#839](https://github.com/mwouts/jupytext/issues/839))


1.11.4 (2021-07-14)
-------------------

**Changed**
- The documentation illustrates how the `cell_markers` option (and the other ones) can be set directly in the `jupytext.toml` config file ([#809](https://github.com/mwouts/jupytext/issues/809)).
- The dependency on `mdit-py-plugins` through `markdown-it-py[plugins]` was made explicit ([#814](https://github.com/mwouts/jupytext/issues/814))

**Fixed**
- System assigns of the form `var = !cmd` are commented out ([#816](https://github.com/mwouts/jupytext/issues/816))
- Fixed an `InconsistentPath` issue with notebooks paired with scripts in a folder. The prefix in the Jupytext formats always use /, while paths might use either / or \ ([#806](https://github.com/mwouts/jupytext/issues/806))
- Tests that cannot succeed are skipped when either the Jupytext folder is not a git repository, when `sphinx-gallery` is too recent, or when `pandoc` is not up-to-date ([#814](https://github.com/mwouts/jupytext/issues/814))
- Removed the mention of '--update' in 'jupytext --pipe' since outputs are preserved already


1.11.3 (2021-06-10)
-------------------

**Changed**
- Jupytext CLI has a new option `--use-source-timestamp` that sets the last modification time of the output file equal to that of the source file (this avoids having to change the timestamp of the source file) ([#784](https://github.com/mwouts/jupytext/issues/784))
- In the pre-commit mode, Jupytext now uses the commit timestamp to determine which file in the pair is the most recent ([#780](https://github.com/mwouts/jupytext/issues/780))


**Fixed**
- Dependencies of the JupyterLab extension have been upgraded to fix a security vulnerability ([#798](https://github.com/mwouts/jupytext/pull/798))
- The `--warn-only` option also applies to pipes. Use this if the pipe may fail, e.g. if you apply `black` on a possibly invalid script ([#781](https://github.com/mwouts/jupytext/issues/781))
- Variables assigned from a magic command are commented out in `py` scripts ([#781](https://github.com/mwouts/jupytext/issues/781))
- Fixed a round-trip issue on notebooks that have None/null in their metadata ([#792](https://github.com/mwouts/jupytext/issues/792))


1.11.2 (2021-05-02)
-------------------

**Changed**
- Jupytext's dependency markdown-it-py is now in v1 ([#769](https://github.com/mwouts/jupytext/issues/769))
- The optional argument `fmt` in `jupytext.reads` now has the default value `None` - thanks to Yuvi Panda ([#763](https://github.com/mwouts/jupytext/issues/763))

**Fixed**
- All text files are opened with an explicit `utf-8` encoding ([#770](https://github.com/mwouts/jupytext/issues/770))
- Previously `--pipe black` was not always putting two blank lines between functions. To fix that we load the internal Jupytext
  cell metadata like `lines_to_next_cell` from the text file rather than ipynb ([#761](https://github.com/mwouts/jupytext/issues/761))
- The timestamp of the source file is not updated any more when the destination file is not in the pair ([#765](https://github.com/mwouts/jupytext/issues/765), [#767](https://github.com/mwouts/jupytext/issues/767))

**Added**
- A new test documents when the `ipython3` pygment lexer appears in MyST Markdown files ([#759](https://github.com/mwouts/jupytext/issues/759))


1.11.1 (2021-03-26)
-------------------

**Fixed**
- Format options stored in the notebook itself are now taken into account (Fixes [#757](https://github.com/mwouts/jupytext/issues/757))


1.11.0 (2021-03-18)
-------------------

**Fixed**
- The `jupytext.toml` config file can now be used together with the `jupytext` pre-commit hook ([#752](https://github.com/mwouts/jupytext/issues/752))
- The `notebook_extensions` option of the `jupytext.toml` file now works ([#746](https://github.com/mwouts/jupytext/issues/746))

**Changed**
- The options in `jupytext.toml` where renamed to match the `jupytext` metadata in the text notebooks. One should now use `formats` rather than `default_jupytext_formats` and `notebook_metadata_filter` rather than `default_notebook_metadata_filter` ([#753](https://github.com/mwouts/jupytext/issues/753))


1.10.3 (2021-03-07)
-------------------

**Fixed**
- We have updated `marked`, an indirect dependency of the `jupyterlab-jupytext` extension, to fix a moderate vulnerability ([#750](https://github.com/mwouts/jupytext/issues/750)).
- We use non-random cell ids in the tests to avoid test failures due to duplicate cell ids ([#747](https://github.com/mwouts/jupytext/issues/747))


1.10.2 (2021-02-17)
-------------------

**Fixed**
- We have adjusted the `MANIFEST.in` file to exclude the `node_modules` but still include the JupyterLab extension that was missing in the `.tar.gz` (and conda) package in v1.10.1. Many thanks to Martin Renou for providing the fix at ([#741](https://github.com/mwouts/jupytext/issues/741))


1.10.1 (2021-02-11)
-------------------

**Added**
- The recursive glob pattern `**/*.ipynb` is now supported by Jupytext - Thanks to Banst for this contribution ([#731](https://github.com/mwouts/jupytext/issues/731))
- Sage notebooks are supported. They can be converted to `.sage` and `.md` files and back. Thanks to Lars Franke for suggesting this! ([#727](https://github.com/mwouts/jupytext/issues/727))
- Jupytext is also accessible with `python -m jupytext`. Thanks to Matthew Brett for his PR! ([#739](https://github.com/mwouts/jupytext/issues/739))

**Changed**
- We have tested Jupytext with the new cell ids introduced in `nbformat>=5.1.0`. Cell ids are preserved by the `--sync` and `--update` command. So we removed the constraint on the version of `nbformat` ([#735](https://github.com/mwouts/jupytext/issues/735)).

**Fixed**
- We filtered out the `node_modules` folder from the `.tar.gz` package for Jupytext ([#730](https://github.com/mwouts/jupytext/issues/730))


1.10.0 (2021-02-04)
-------------------

**Added**
- Jupytext has a pre-commit hook! Many thanks to John Paton and Aaron Gokaslan for making this happen ([#698](https://github.com/mwouts/jupytext/issues/698))
- Jupytext CLI will not rewrite files that don't change ([#698](https://github.com/mwouts/jupytext/issues/698)).
- If you want to see the diff for changed files, use the new `--diff` option ([#722](https://github.com/mwouts/jupytext/issues/722))
- We have added `isort` and `autoflake8` to the `pre-commit` configuration file used for developing the Jupytext project ([#709](https://github.com/mwouts/jupytext/issues/709))
- We made sure that `py:percent` scripts end with exactly one blank line ([#682](https://github.com/mwouts/jupytext/issues/682))
- We checked that Jupytext works well with symbolic links to folders (not files!) ([#696](https://github.com/mwouts/jupytext/issues/696))

**Changed**
- Jupytext does not work properly with the new cell ids of the version 4.5 of `nbformat>=5.1.0` yet, so we added the requirement `nbformat<=5.0.8` ([#715](https://github.com/mwouts/jupytext/issues/715))
- Jupytext will issue an informative error or warning on notebooks in a version of nbformat that is not known to be supported ([#681](https://github.com/mwouts/jupytext/issues/681), [#715](https://github.com/mwouts/jupytext/issues/715))

**Fixed**
- Code cells that contain triple backticks (or more) are now encapsulated with four backticks (or more) in the Markdown and MyST Markdown formats. The version number for the Markdown format was increased to 1.3, and the version number for the MyST Markdown format was increased to 0.13 ([#712](https://github.com/mwouts/jupytext/issues/712))
- Indented magic commands are supported ([#694](https://github.com/mwouts/jupytext/issues/694))


1.9.1 (2021-01-06)
------------------

**Fixed**
- Include the lab extension that was missing in the conda package ([#703](https://github.com/mwouts/jupytext/pull/703)).


1.9.0 (2021-01-05)
------------------

**Changed**
- The Jupytext extension for JupyterLab is compatible with JupyterLab 3.0, thanks to Martin Renou's awesome contribution ([#683](https://github.com/mwouts/jupytext/pull/683)).


1.8.2 (2021-01-04)
------------------

**Changed**
- Jupytext 1.8.2 depends on `python>=3.6`. The last version of Jupytext explicitly tested with Python 2.7 and 3.5 was Jupytext 1.7.1 ([#697](https://github.com/mwouts/jupytext/issues/697)).


1.8.1 (2021-01-03)
------------------

**Changed**
- The dependency on `markdown-it-py` is conditional on `python>=3.6` ([#697](https://github.com/mwouts/jupytext/issues/697))


1.8.0 (2020-12-22)
------------------

**Changed**
- Removed support for Python 2.7 and 3.5, a preliminary step towards a JupyterLab 3.0-compatible extension ([#683](https://github.com/mwouts/jupytext/issues/683))
- The MyST Markdown format uses `markdown-it-py~=0.6.0` ([#692](https://github.com/mwouts/jupytext/issues/692))


1.7.1 (2020-11-16)
------------------

**Fixed**
- Text notebooks have the same format and mimetype as ipynb notebooks. This fixes the _File Load Error - content.indexOf is not a function_ error on text notebooks ([#659](https://github.com/mwouts/jupytext/issues/659))


1.7.0 (2020-11-14)
------------------

**Changed**
- Jupytext's contents manager uses the parent CM's `get` and `save` methods to read and save text files, and explicitly calls `jupytext.reads` and `jupytext.writes` to do the conversion. We don't use `mock` nor internal parent methods any more. Thanks to Max Klein for helping making this work! ([#634](https://github.com/mwouts/jupytext/issues/634), [#635](https://github.com/mwouts/jupytext/issues/635))
- Thanks to the above, Jupytext can work on top of contents manager that don't derive from `FileContentsManager`, and in particular it works with `jupyterfs` ([#618](https://github.com/mwouts/jupytext/issues/618))
- The documentation was reorganized. `README.md` was simplified and now includes many links to the documentation.
- The documentation now uses `myst_parser` rather than `recommonmark`. And we use `conda` on RTD ([#650](https://github.com/mwouts/jupytext/issues/650), [#652](https://github.com/mwouts/jupytext/issues/652))
- The `readf` and `writef` functions were dropped (they had been deprecated in favor of `read` and `write` in June 2019, v1.2.0)
- The description & dependencies of the JupyterLab extension were updated ([#654](https://github.com/mwouts/jupytext/issues/654))
- The `--set-kernel -` command, on a Python notebook, gives an explicit error when no kernel is not found that matches the current Python executable.
- All the GitHub workflow files were concatenated into a unique file, and we have added an `pypi-publish` step to automatically publish the package on PyPi when new releases are created.
- The `CHANGELOG.md` file was moved under `docs` to better expose the history of changes.

**Added**
- Configuration errors are reported in the console and/or in Jupyter ([#613](https://github.com/mwouts/jupytext/issues/613))
- Jupytext's Contents Manager internal errors are logged on the console, and trigger an HTTP Error 500 ([#638](https://github.com/mwouts/jupytext/issues/638))
- The GitHub actions run on both push events and pull requests, and duplicate jobs are skipped ([#605](https://github.com/mwouts/jupytext/issues/605))
- Jupytext has a `tox.ini` file, thanks to Chris Sewell ([#605](https://github.com/mwouts/jupytext/issues/605))
- Jupytext is tested against Python 3.9
- The `execution` cell metadata is now filtered by default ([#656](https://github.com/mwouts/jupytext/issues/656))

**Fixed**
- Optional dependency on `sphinx-gallery` frozen to version `~=0.7.0` ([#614](https://github.com/mwouts/jupytext/issues/614))
- Codecov/patch reports should be OK now ([#639](https://github.com/mwouts/jupytext/issues/639))
- Jupytext tests work on non-English locales ([#636](https://github.com/mwouts/jupytext/issues/636))
- Cell metadata that are already present in text notebook can be filtered out using a config file ([#656](https://github.com/mwouts/jupytext/issues/656))
- Optional cell attributes like attachments are preserved ([#671](https://github.com/mwouts/jupytext/issues/671))


1.6.0 (2020-09-01)
------------------

**Added**
- New option `hide_notebook_metadata` to encapsulate the notebook metadata in an HTML comment ([#527](https://github.com/mwouts/jupytext/issues/527))
- New option `root_level_metadata_as_raw_cell`. Set it to `False` if you don't want to see root level metadata
of R Markdown notebooks as a raw cell in Jupyter ([#415](https://github.com/mwouts/jupytext/issues/415))
- New option `doxygen_equation_markers` to translate Markdown equations into Doxygen equations ([#517](https://github.com/mwouts/jupytext/issues/517))
- New option `custom_cell_magics` to comment out cells starting with user-specific cell magics ([#513](https://github.com/mwouts/jupytext/issues/513))
- Documented how to use `isort` on notebooks ([#553](https://github.com/mwouts/jupytext/issues/553))
- `jupytext notebook.ipynb --to filename.py` will warn that `--to` is used in place of `--output`.
- `jupytext --set-formats filename.py` will suggest to use `--sync` instead of `--set-formats` ([#544](https://github.com/mwouts/jupytext/issues/544))
- Warn if 'Include Metadata' is off when saving text files in Jupyter ([#561](https://github.com/mwouts/jupytext/issues/561))
- Test that notebooks paired through a configuration file are left unmodified ([#598](https://github.com/mwouts/jupytext/issues/598))
- Test that metadata filters in the configuration files are taken into account when using `jupytext --to` ([#543](https://github.com/mwouts/jupytext/issues/543))
- New argument `--run-path` to execute the notebooks at the desired location ([#595](https://github.com/mwouts/jupytext/issues/595))
- Activated GitHub code scanning alerts

**Changed**
- Jupytext now depends on `markdown-it-py` (Python 3.6 and above) and always features the MyST-Markdown format,
thanks to Chris Sewell ([#591](https://github.com/mwouts/jupytext/issues/591))
- The `md:myst` and `md:pandoc` are always included in the Jupytext formats, and an informative runtime
error will occur if the required dependencies, resp. `markdown-it-py` and `pandoc`, are not installed. ([#556](https://github.com/mwouts/jupytext/issues/556))
- The `# %%` cell marker has the same indentation as the first line in the cell ([#562](https://github.com/mwouts/jupytext/issues/562))
- Jupytext is now installed from source on MyBinder to avoid cache issues ([#567](https://github.com/mwouts/jupytext/issues/567))
- The tests that execute a notebook are now skipped on Windows to avoid timeout issues ([#489](https://github.com/mwouts/jupytext/issues/489))

**Fixed**
- Only scripts can have an encoding comment, not Markdown or R Markdown files ([#576](https://github.com/mwouts/jupytext/issues/576))
- Spaces in `--pipe` commands are supported ([#562](https://github.com/mwouts/jupytext/issues/562))
- Bash commands starting with special characters are now correctly detected, thanks to Aaron Gokaslan ([#587](https://github.com/mwouts/jupytext/issues/587))
- MyST Markdown files are recognized as such even if MyST-Markdown is not available ([#556](https://github.com/mwouts/jupytext/issues/556))
- Build JupyterLab with `dev-build=False` and `minimize=False` on mybinder to avoid build errors
- Configured coverage targets in `codecov.yml`


1.5.2 (2020-07-21)
------------------

**Changed**
- The documentation uses the Alabaster theme

**Fixed**
- Preserve indentation when commenting out magic commands ([#437](https://github.com/mwouts/jupytext/issues/437))
- Fixed MyBinder - `jupytext.py` is not a configuration file ([#559](https://github.com/mwouts/jupytext/issues/559), [#567](https://github.com/mwouts/jupytext/issues/567))


1.5.1 (2020-07-05)
------------------

**Fixed**
- Added `toml` as a dependency ([#552](https://github.com/mwouts/jupytext/issues/552)).
- Filtered out `__pycache__` and `.pyc` files from the pip package.
- Fixed coverage upload by adding `coverage` as a dependency to the conda CI workflow.
- Fixed the conda CI / Python 2.7 job by explicitly installing `backports.functools_lru_cache` ([#554](https://github.com/mwouts/jupytext/issues/554)).


1.5.0 (2020-06-07)
------------------

**Added**
- Jupytext can use a local or global [configuration file](https://github.com/mwouts/jupytext/blob/main/docs/config.md) ([#508](https://github.com/mwouts/jupytext/issues/508))
- Jupytext can pair notebooks in trees. Use e.g. `notebooks///ipynb,scripts///py:percent` if you want to replicate the tree of notebooks under `notebooks` in a folder named `scripts` ([#424](https://github.com/mwouts/jupytext/issues/424))
- The extension for Jupyter Notebook has a _New Text Notebook_ menu that creates text-only notebooks ([#443](https://github.com/mwouts/jupytext/issues/443))
- Groovy and Java are now supported, thanks to Przemek Wesołek ([#500](https://github.com/mwouts/jupytext/issues/500))
- The Coconut language is also supported, thanks to Thurston Sexton ([#532](https://github.com/mwouts/jupytext/issues/532))
- Resource files with `.resource` extension from the Robot Framework are supported, thanks to Hiski Valli ([#535](https://github.com/mwouts/jupytext/issues/535))
- Jupytext is tested in `pip` and `conda` environments, on Linux, Mac OS and Windows, using Github actions ([#487](https://github.com/mwouts/jupytext/issues/487))
- Jupytext uses pre-commit checks and automatic reformatting with `pre-commit`, `black` and `flake8` ([#483](https://github.com/mwouts/jupytext/issues/483))
- Documentation improvements:
  - Mention that the YAML header can be created with either `--set-kernel`, `--set-formats`, or both ([#485](https://github.com/mwouts/jupytext/issues/485))
  - Mention that one should use double quotes, not single quotes, around `jupytext --check` commands like `"pytest {}"` on Windows ([#475](https://github.com/mwouts/jupytext/issues/475))
  - Improved error message when a file is in a version that can't be read by Jupytext ([#531](https://github.com/mwouts/jupytext/issues/531))

**Fixed**
- Skip the `jupytext --execute` tests when the warning _Timeout waiting for IOPub output_ occurs, which is the case intermittently on Windows ([#489](https://github.com/mwouts/jupytext/issues/489))
- Fixed wrong paired paths when syncing with the --pre-commit flag ([#506](https://github.com/mwouts/jupytext/issues/506))


1.4.2 (2020-04-05)
------------------

**Added**
- Added an example with custom notebook metadata ([#469](https://github.com/mwouts/jupytext/issues/469))
- Added an example with custom cell tags ([#478](https://github.com/mwouts/jupytext/issues/478))

**Changed**
- The outputs from the `.ipynb` file are matched with the input cells from the text file with less strict rules. In this version, a search and replace on the text file will not remove the outputs any more ([#464](https://github.com/mwouts/jupytext/issues/464)).
- Update parsing of myst notebooks to new (markdown-it based) parser (please upgrade to `myst-parser` to version `~0.8`) ([#473](https://github.com/mwouts/jupytext/issues/473))
- Use `os.path.samefile` when searching for the kernel that corresponds to the current environment (`--set-kernel -`)

**Fixed**
- Fixed the CLI example for not commenting out magic commands: `--opt comment_magics=false`. In addition, most of the `jupytext` commands in `using-cli.md` are now tested! ([#465](https://github.com/mwouts/jupytext/issues/465))
- `jupytext.read` and `jupytext.write` now give more meaningful errors when the format information is incorrect ([#462](https://github.com/mwouts/jupytext/issues/462))
- Multiline comments starting or ending with quadruple quotes should not cause issues anymore ([#460](https://github.com/mwouts/jupytext/issues/460))
- Fixed active cells in the py:percent format ([#477](https://github.com/mwouts/jupytext/issues/477))

1.4.1 (2020-03-19)
------------------

**Added**
- Script of script (SoS) notebooks are now supported. Thanks to Thomas Pernet-coudrier for contributing the sample notebook ([#453](https://github.com/mwouts/jupytext/issues/453)).
- New MyST Markdown format (`md:myst`), developed by the [ExecutableBookProject](https://github.com/ExecutableBookProject) team. Read more about the MyST Markdown format in the [documentation](https://jupytext.readthedocs.io/en/latest/formats.html#myst-markdown). And many thanks to Chris Sewell for contributing the actual implementation! ([#447](https://github.com/mwouts/jupytext/issues/447) [#456](https://github.com/mwouts/jupytext/issues/456) [#458](https://github.com/mwouts/jupytext/issues/458))

**Fixed**
- When using `jupytext --pipe cmd`, the output of `cmd` should not appear in the terminal ([#432](https://github.com/mwouts/jupytext/issues/432))


1.4.0 (2020-03-09)
------------------

**Changed**
- The new jupyterlab extension (in version 1.2.0) is compatible with JupyterLab 2.0. Many thanks to Jean Helie! ([#449](https://github.com/mwouts/jupytext/issues/449))
- It is not compatible with JupyterLab 1.x anymore. If you wish, you can install manually the previous version of the extension with `jupyter labextension install jupyterlab-jupytext@1.1.1`.

**Fixed**
- Display the output/errors of command executed with `jupytext --pipe` or `jupytext --check` ([#432](https://github.com/mwouts/jupytext/issues/432))

1.3.5 (2020-03-08)
------------------

**Fixed**
- Removed leading slash in notebook paths ([#444](https://github.com/mwouts/jupytext/issues/444))
- Fixed `jupytext --set-formats` when using formats with prefix and/or suffix ([#450](https://github.com/mwouts/jupytext/issues/450))


1.3.4 (2020-02-18)
------------------

**Added**
- C# and F# Jupyter notebooks are now supported ([#427](https://github.com/mwouts/jupytext/issues/427), [#429](https://github.com/mwouts/jupytext/issues/429))

**Fixed**
- `jupytext --to script *.ipynb` now computes the script extension for each notebook ([#428](https://github.com/mwouts/jupytext/issues/428))
- Fix shebang handling for languages with non-# comments, by Jonas Bushart ([#434](https://github.com/mwouts/jupytext/issues/434))
- Indented bash commands are now commented out ([#437](https://github.com/mwouts/jupytext/issues/437))
- The main formats are documented in `jupytext --help` ([#426](https://github.com/mwouts/jupytext/issues/426), [#433](https://github.com/mwouts/jupytext/issues/433))


1.3.3 (2020-01-27)
------------------

**Added**
- Jupytext has a logo! Many thanks to Kyle Kelley for contributing the actual logo ([#423](https://github.com/mwouts/jupytext/issues/423)), and to Chris Holdgraf for suggesting this ([#260](https://github.com/mwouts/jupytext/issues/260)).
- Nested metadata filtering is now supported! You can use this to rid of `jupytext_version` if you wish ([#416](https://github.com/mwouts/jupytext/issues/416)).

**Fixed**
- Code cells in the Markdown format can contain triple backticks inside multiline strings ([#419](https://github.com/mwouts/jupytext/issues/419)).
- Changes in the YAML header when running `jupytext --test` on text files are ignored ([#414](https://github.com/mwouts/jupytext/issues/414)).

1.3.2 (2020-01-08)
------------------

**Fixed**
- The `--pre-commit` mode now ignores non-notebook files in the index ([#338](https://github.com/mwouts/jupytext/issues/338)).
- `nbformat_minor` is taken from the notebook with outputs When inputs and outputs are merged.

1.3.1 (2019-12-26)
------------------

**Added**
- New `nomarker` format in the Jupyter Notebook and JupyterLab extensions ([#397](https://github.com/mwouts/jupytext/issues/397))

**Changed**
- The `normarker` format replaces the one previously named `bare`.

**Fixed**
- Multiline strings are now accepted in the YAML header ([#404](https://github.com/mwouts/jupytext/issues/404)). Fix contributed by ZHUO Qiang ([#405](https://github.com/mwouts/jupytext/issues/405)).
- Fixed the instructions on how to use multiline comments for all Markdown cells in the py:percent format, by ZHUO Qiang  ([#403](https://github.com/mwouts/jupytext/issues/403)).
- Added `cd` to the list of magic commands.
- Do not read paired files when `--set-formats` is being used (fixes [#399](https://github.com/mwouts/jupytext/issues/399)).

1.3.0 (2019-11-23)
------------------

See also [What's new in Jupytext 1.3?](https://gist.github.com/mwouts/724efe5e00654fc2145a4c916796e071)

**Added**

- Pairing a notebook to both `.md` and `.py` is now supported. Input cells are loaded from the most recent text representation ([#290](https://github.com/mwouts/jupytext/issues/290))
- Both the Jupyter Notebook and the JupyterLab extension for Jupytext were updated ([#290](https://github.com/mwouts/jupytext/issues/290))
- Raw cells are now encoded using HTML comments (`<!-- #raw -->` and `<!-- #endraw -->`) in Markdown files ([#321](https://github.com/mwouts/jupytext/issues/321))
- Markdown cells can be delimited with any of `<!-- #region -->`,  `<!-- #markdown -->` or `<!-- #md -->` ([#344](https://github.com/mwouts/jupytext/issues/344))
- Code blocks from Markdown files, when they don't have an explicit language, appear in Markdown cells in Jupyter ([#321](https://github.com/mwouts/jupytext/issues/321))
- Code blocks with an explicit language and a `.noeval` attribute are inactive in Jupyter ([#347](https://github.com/mwouts/jupytext/issues/347))
- Markdown and raw cells can be quoted with triple quotes in the `py:percent` format. And Markdown cells can start with just `# %% [md]` ([#305](https://github.com/mwouts/jupytext/issues/305))
- The light format uses `# + [markdown]` rather than the previous `cell_type` metadata to identify markdown cells with metadata ([#356](https://github.com/mwouts/jupytext/issues/356))
- Explicit Markdown cells in the light format `# + [markdown]` can use triple quotes ([#356](https://github.com/mwouts/jupytext/issues/356))
- IPython magic help commands like `float?` are classified as magics, and thus commented in Python scripts ([#297](https://github.com/mwouts/jupytext/issues/297))
- Cell metadata can be encoded as either `key=value` (the new default) or in JSON. An automatic option `cell_metadata_json` should help minimize the impact on existing files ([#344](https://github.com/mwouts/jupytext/issues/344))
- R Markdown hidden inputs, outputs, or cells are now mapped to the corresponding Jupyter Book tags by default ([#337](https://github.com/mwouts/jupytext/issues/337))
- The notebook metadata filter is automatically updated when extra keys are added to the YAML header ([#376](https://github.com/mwouts/jupytext/issues/376))
- The Jupyter Notebook extension for Jupytext is compatible with Jupyter Notebook 6.0 ([#346](https://github.com/mwouts/jupytext/issues/346))
- `jupytext notebook.py --to ipynb` updates the timestamp of `notebook.py` so that the paired notebook still works in Jupyter ([#335](https://github.com/mwouts/jupytext/issues/335), [#254](https://github.com/mwouts/jupytext/issues/254))
- `jupytext --check pytest notebook.ipynb` can be used to run test functions in a notebook ([#286](https://github.com/mwouts/jupytext/issues/286))
- `jupytext --check` and `jupytext --pipe` can run commands that only operate on files: when `{}` is found in the text of the command, `jupytext` saves the text representation of the notebook in a temp file, and replaces `{}` with the name of that file before executing the command. ([#286](https://github.com/mwouts/jupytext/issues/286))
- Documented how to sync notebooks in a pre-commit hook ([#338](https://github.com/mwouts/jupytext/issues/338))
- Added support for Rust/Evxcr, by Jonas Bushart ([#351](https://github.com/mwouts/jupytext/issues/351))
- Added support for [Robot Framework](https://robots-from-jupyter.github.io/), by Asko Soukka ([#378](https://github.com/mwouts/jupytext/issues/378))
- Added support for PowerShell ([#349](https://github.com/mwouts/jupytext/issues/349))

**Changed**

- Use `CHANGELOG.md` rather than `HISTORY.rst`

**Fixed**

- Commands like `cat = x` are not magic commands, so they are not commented any more ([#339](https://github.com/mwouts/jupytext/issues/339))
- Fixed an inconsistent round trip (code cell with `"cat"` being converted to a markdown cell) in the `py:light` format ([#339](https://github.com/mwouts/jupytext/issues/339))
- `jupytext --test textfile.ext` now really compares the text file to its round trip (rather than the corresponding notebook) ([#339](https://github.com/mwouts/jupytext/issues/339))
- Markdown cells that contain code are now preserved in a round trip through the Markdown and R Markdown formats ([#361](https://github.com/mwouts/jupytext/issues/361))
- Code cells with a `%%python3` cell magic are now preserved in a round trip through the Markdown format ([#365](https://github.com/mwouts/jupytext/issues/365))
- `jupytext --execute` runs the notebook in its folder ([#382](https://github.com/mwouts/jupytext/issues/382))
- Strings in the metadata of code cells are quoted in the Rmd representation. And we escape R code in chunk options with `#R_CODE#` ([#383](https://github.com/mwouts/jupytext/issues/383))

1.2.4 (2019-09-19)
------------------

**Added**

- The documentation includes a mention on how to set metadata filters at the command line ([#330](https://github.com/mwouts/jupytext/issues/330))
- Jupytext will not catch any error when the flag `--warn-only` is not set ([#327](https://github.com/mwouts/jupytext/issues/327))

**Fixed**

- Now the flag `--warn-only` catches every possible error ([#263](https://github.com/mwouts/jupytext/issues/263))
- `.md` and `.markdown` files are treated identically ([#325](https://github.com/mwouts/jupytext/issues/325))
- Fixed `--set-kernel` when using pipes ([#326](https://github.com/mwouts/jupytext/issues/326))
- Fixed utf-8 encoding on stdout on Python 2 ([#331](https://github.com/mwouts/jupytext/issues/331))


1.2.3 (2019-09-02)
------------------

**Fixed**

- Dependency on `setuptools` in `pandoc.py` made optional to fix the build of the conda package ([#310](https://github.com/mwouts/jupytext/issues/310), [#323](https://github.com/mwouts/jupytext/issues/323))


1.2.2 (2019-09-01)
------------------

**Added**

- Documentation includes a section on how to use Jupytext as a Python library ([#317](https://github.com/mwouts/jupytext/issues/317))
- Mention of the server extension in the documentation ([#304](https://github.com/mwouts/jupytext/issues/304))
- Text notebooks can be tested with `jupytext --execute notebook.md` ([#303](https://github.com/mwouts/jupytext/issues/303))
- The default value of `as_version` in `jupytext.read` is `nbformat.NO_CONVERT`, as for `nbformat.read`
- Jupytext tests are now included in sdist ([#310](https://github.com/mwouts/jupytext/issues/310))

**Fixed**

- Fixed the usability of the `fmt` argument in `jupytext.read` ([#312](https://github.com/mwouts/jupytext/issues/312))
- Fixed the download notebook error when `c.notebook_extensions` has a custom value ([#318](https://github.com/mwouts/jupytext/issues/318))
- String delimiters in commented text are now ignored ([#307](https://github.com/mwouts/jupytext/issues/307))


1.2.1 (2019-07-20)
------------------

**Added**

- Added documentation on how to use Jupytext with JupyterLab 0.35 ([#299](https://github.com/mwouts/jupytext/issues/299))
- and on using Jupytext with the pre-commit package manager ([#292](https://github.com/mwouts/jupytext/issues/292))
- The `read` and `write` functions are easier to use ([#292](https://github.com/mwouts/jupytext/issues/292))

**Fixed**

- Jupytext now ships the `jupyterlab-jupytext` extension in version 1.0.2. The version 1.0.1 erroneously introduces a `target_formats` metadata in the jupytext section, instead of `formats`, and works only after two clicks.


1.2.0 (2019-07-18)
------------------

**Added**

- New `--execute` option in Jupytext CLI ([#231](https://github.com/mwouts/jupytext/issues/231))
- The `--set-formats` option in Jupytext CLI also triggers `--sync`, allowing shorter commands.
- `jupytext`'s `read` and `write` functions can be used as drop-in replacements for `nbformat`'s ones ([#262](https://github.com/mwouts/jupytext/issues/262)).
- `jupytext --sync` will now skip unpaired notebooks ([#281](https://github.com/mwouts/jupytext/issues/281)).
- The JupyterLab extension was updated. It now works on text files ([#213](https://github.com/mwouts/jupytext/issues/213)) and has a new option to include
(or not) the metadata in the text representation of the notebook.
- Jupytext's contents manager class is derived dynamically from the default CM class for compatibility with
`jupyter_server` ([#270](https://github.com/mwouts/jupytext/issues/270))
- Removed dependency on `mock` and `testfixtures`, thanks to Jean-Sebastien Dieu ([#279](https://github.com/mwouts/jupytext/issues/279))
- Added support for `.markdown` extension ([#288](https://github.com/mwouts/jupytext/issues/288))

**Fixed**

- The `jupyterlab-jupytext` extension shipped with the python package is in version 1.0.1, and is compatible only
with JupyterLab >= 1.0. If you use an earlier version of JupyterLab, please install the version 0.19 of the extension
with `jupyter labextension install jupyterlab-jupytext@0.19` ([#276](https://github.com/mwouts/jupytext/issues/276), [#278](https://github.com/mwouts/jupytext/issues/278))
- Text files can be unpaired ([#289](https://github.com/mwouts/jupytext/issues/289))


1.1.7 (2019-06-23)
------------------

**Added**

- Added support for Scala notebook, by Tobias Frischholz ([#253](https://github.com/mwouts/jupytext/issues/253))
- Added a getting started notebook for jupytext (and Binder), by Chris Holdgraf ([#257](https://github.com/mwouts/jupytext/issues/257))
- The Markdown and R Markdown representations are now tested for all the languages
- The Jupytext notebook extension also works when the notebook is a text file ([#213](https://github.com/mwouts/jupytext/issues/213))


**Fixed**

- The Jupytext Menu in Jupyter Notebook is now compatible with `jupyter_nbextensions_configurator` ([#178](https://github.com/mwouts/jupytext/issues/178))
- Entries in the Jupytext menu are updated when the menu is hovered on ([#248](https://github.com/mwouts/jupytext/issues/248))
- Fixed link to `.md` files in the documentation ([#255](https://github.com/mwouts/jupytext/issues/255))


1.1.6 (2019-06-11)
------------------

**Added**

- Jupytext now supports Javascript and Typescript, thanks to Hatem Hosny ([#250](https://github.com/mwouts/jupytext/issues/250))
- Jupytext works with Python 3.8 as well

**Fixed**

- Fix global `auto` pairing ([#249](https://github.com/mwouts/jupytext/issues/249))


1.1.5 (2019-06-06)
------------------

**Fixed**

- Fixed implicit dependency on `jupyter_client` ([#245](https://github.com/mwouts/jupytext/issues/245))


1.1.4 (2019-06-05)
------------------

**Added**

- New argument `--set-kernel` in Jupytext command line ([#230](https://github.com/mwouts/jupytext/issues/230))
- Jupytext now accepts `--to script` or `--to auto` ([#240](https://github.com/mwouts/jupytext/issues/240))
- Jupytext now has a real Sphinx documentation on [readthedocs](https://jupytext.readthedocs.io/en/latest), thanks to Chris Holdgraf ([#237](https://github.com/mwouts/jupytext/issues/237))

**Fixed**

- Invalid notebooks may cause a warning, but not a fatal error ([#234](https://github.com/mwouts/jupytext/issues/234))
- Jupyter server extension leaves the contents manager unchanged if it is a sub-class of Jupytext's CM ([#236](https://github.com/mwouts/jupytext/issues/236))
- Fixed format inference when metadata is present but not format information ([#239](https://github.com/mwouts/jupytext/issues/239))
- Preserve executable and encoding information in scripts with metadata ([#241](https://github.com/mwouts/jupytext/issues/241))

1.1.3 (2019-05-22)
------------------

**Added**

- Support for IDL notebooks and .pro scripts ([#232](https://github.com/mwouts/jupytext/issues/232))


1.1.2 (2019-05-16)
------------------

**Added**

- Jupytext's content manager has a new `notebook_extensions` option ([#224](https://github.com/mwouts/jupytext/issues/224), [#183](https://github.com/mwouts/jupytext/issues/183))
- Cells can be made inactive in scripts with the `active-ipynb` cell tag ([#226](https://github.com/mwouts/jupytext/issues/226))

**Fixed**

- Directories ending in .jl (or .ipynb) are not notebooks ([#228](https://github.com/mwouts/jupytext/issues/228))
- Empty notebooks have no language ([#227](https://github.com/mwouts/jupytext/issues/227))


1.1.1 (2019-04-16)
------------------

**Added**

- Jupytext server extension leaves the contents manager unchanged when it is already a subclass of TextFileContentsManager ([#218](https://github.com/mwouts/jupytext/issues/218))
- The base class for TextFileContentsManager defaults to FileContentsManager when LargeFileManager is not available ([#217](https://github.com/mwouts/jupytext/issues/217))


1.1.0 (2019-04-14)
------------------

**Added**

- Markdown and R Markdown formats now support metadata ([#66](https://github.com/mwouts/jupytext/issues/66), [#111](https://github.com/mwouts/jupytext/issues/111), [#188](https://github.com/mwouts/jupytext/issues/188))
- The `light` format for Scripts can use custom cell markers, e.g. Vim or VScode/PyCharm folding markers ([#199](https://github.com/mwouts/jupytext/issues/199))
- Pandoc's Markdown format for Jupyter notebooks is available in Jupytext as `md:pandoc` ([#208](https://github.com/mwouts/jupytext/issues/208))

**Fixed**

- Jupytext's contents manager is now based on `LargeFileManager` to allow large file uploads ([#210](https://github.com/mwouts/jupytext/issues/210))
- YAML header parsed with yaml.safe_load rather than yaml.load ([#215](https://github.com/mwouts/jupytext/issues/215))
- IPython line magic can be split across lines ([#209](https://github.com/mwouts/jupytext/issues/209))
- `jupytext --to py` rather than `--to python` in the README ([#216](https://github.com/mwouts/jupytext/issues/216))


1.0.5 (2019-03-26)
------------------

**Fixed**

- Fix the error 'notebook file has changed on disk' when saving large notebooks ([#207](https://github.com/mwouts/jupytext/issues/207))


1.0.4 (2019-03-20)
------------------

**Added**

- Wildcard are now supported on Windows ([#202](https://github.com/mwouts/jupytext/issues/202))
- Trusted notebooks remain trusted when inputs cells are modified ([#203](https://github.com/mwouts/jupytext/issues/203))

**Fixed**

- Pre-commit mode adds the result of conversion to the commit ([#200](https://github.com/mwouts/jupytext/issues/200))


1.0.3 (2019-03-13)
------------------

**Added**

- Matlab and Octave notebooks and scripts are now supported ([#197](https://github.com/mwouts/jupytext/issues/197))

**Fixed**

- `notebook_metadata_filter = "all"` now works ([#196](https://github.com/mwouts/jupytext/issues/196))
- Default pairing in subfolders fixed in JupyterLab ([#180](https://github.com/mwouts/jupytext/issues/180))


1.0.2 (2019-02-27)
------------------

**Added**

- Rename notebooks in pairs in the tree view ([#190](https://github.com/mwouts/jupytext/issues/190))
- Associate `.scm` file extension with Scheme scripts ([#192](https://github.com/mwouts/jupytext/issues/192))
- Added support for Clojure, by bzinberg ([#193](https://github.com/mwouts/jupytext/issues/193))

**Fixed**

- Allow spaces between `?` or `!` and python or bash command ([#189](https://github.com/mwouts/jupytext/issues/189))


1.0.1 (2019-02-23)
------------------

**Fixed**

- Exclude tests in package deployment ([#184](https://github.com/mwouts/jupytext/issues/184))
- Jupytext's serverextension only runs selected init steps ([#185](https://github.com/mwouts/jupytext/issues/185))
- Added an additional test for magic arguments ([#111](https://github.com/mwouts/jupytext/issues/111))

1.0.0 (2019-02-19)
------------------

**Added**

- Jupytext now includes a Jupyter Notebook extension and a JupyterLab extension ([#86](https://github.com/mwouts/jupytext/issues/86)).
- Jupytext command line has more arguments: `--paired-paths` to list the paths for the paired representations of the notebook, and `--sync` to synchronise the content of all paired paths based on the most recent file ([#146](https://github.com/mwouts/jupytext/issues/146)). In addition, the `--from` argument is optional even when the notebook is read from stdin ([#148](https://github.com/mwouts/jupytext/issues/148)).
- The pairing information, and more generally the notebook metadata can be edited with the CLL, see the `--set-formats` and the `--update-metadata` arguments ([#141](https://github.com/mwouts/jupytext/issues/141)).
- Jupytext can `--pipe` the text representation of a notebook to external programs like `black` or `flake8` ([#154](https://github.com/mwouts/jupytext/issues/154), [#142](https://github.com/mwouts/jupytext/issues/142))
- The Python representation of notebooks containing PEP8 cells is now expected to be PEP8 compliant ([#154](https://github.com/mwouts/jupytext/issues/154)).
- Format specification allow prefix and suffix for path and file name ([#138](https://github.com/mwouts/jupytext/issues/138), [#142](https://github.com/mwouts/jupytext/issues/142)). Use `ipynb,prefix/suffix.py:percent` to pair the current notebook named `notebook.ipynb` to a script named `prefixnotebooksuffix.py`. Suffix and prefix can also be configured on the `ipynb` file, with the same syntax.
- Introducing a new `hydrogen` format for scripts, which derives from `percent`. In that format Jupyter magic commands are not commented ([#59](https://github.com/mwouts/jupytext/issues/59), [#126](https://github.com/mwouts/jupytext/issues/126), [#132](https://github.com/mwouts/jupytext/issues/132)).
- Introducing a new `bare` format for scripts, which derives from `light`. That format has no cell marker. Use a notebook metadata filter `{"jupytext": {"notebook_metadata_filter":"-all"}}` if you want no YAML header ([#152](https://github.com/mwouts/jupytext/issues/152)).
- The default format for R script is now `light`, as for the other languages.
- Added support for q/kdb+ notebooks ([#161](https://github.com/mwouts/jupytext/issues/161)).
- Python scripts or Markdown documents that have no Jupyter metadata receive a metadata filter that ensures that metadata is not exported back to the text representation ([#124](https://github.com/mwouts/jupytext/issues/124)).
- Metadata filters are represented as strings rather than dictionaries to make YAML headers shorter. Previous syntax from [#105](https://github.com/mwouts/jupytext/issues/105) is still supported. They were also renamed to `notebook_metadata_filter` and `cell_metadata_filter`.
- Markdown and RMarkdown formats have a new option `split_at_heading` to split Markdown cells at heading ([#130](https://github.com/mwouts/jupytext/issues/130))

**Fixed**

- Main language of scripts is inferred from script extension. Fixes a round trip conversion issue for Python notebooks with a Javascript cell.
- Non-Python scripts opened as notebooks in Jupyter are now correctly saved even when no matching kernel is found.
- Jupyter magic commands like `ls` are commented in the light and R markdown format ([#149](https://github.com/mwouts/jupytext/issues/149)).
- Cell starting with `%%html`, `%%latex` are now commented out in the `light`, `percent` and `Rmd` formats ([#179](https://github.com/mwouts/jupytext/issues/179)).

0.8.6 (2018-11-29)
------------------

**Added**

- The `language_info` section is not part of the default header any more. Language information is now taken from metadata `kernelspec.language`. ([#105](https://github.com/mwouts/jupytext/issues/105)).
- When opening a paired notebook, the active file is now the file that was originally opened ([#118](https://github.com/mwouts/jupytext/issues/118)). When saving a notebook, timestamps of all the alternative representations are tested to ensure that Jupyter's autosave does not override manual modifications.
- Jupyter magic commands are now commented per default in the `percent` format ([#126](https://github.com/mwouts/jupytext/issues/126), [#132](https://github.com/mwouts/jupytext/issues/132)). Version for the `percent` format increases from '1.1' to '1.2'. Set an option `comment_magics` to `false` either per notebook, or globally on Jupytext's contents manager, or on `jupytext`'s command line, if you prefer not to comment Jupyter magics.
- Jupytext command line has a pre-commit mode ([#121](https://github.com/mwouts/jupytext/issues/121)).


0.8.5 (2018-11-13)
------------------

**Added**

- `bash` scripts as notebooks ([#127](https://github.com/mwouts/jupytext/issues/127))
- R scripts with `.r` extension are supported ([#122](https://github.com/mwouts/jupytext/issues/122))
- Jupytext selects the first kernel that matches the language ([#120](https://github.com/mwouts/jupytext/issues/120))

0.8.4 (2018-10-29)
------------------

**Added**

- Notebook metadata is filtered - only the most common metadata are stored in the text representation ([#105](https://github.com/mwouts/jupytext/issues/105))
- New config option `freeze_metadata` on the content manager and on the command line interface (defaults to `False`). Use this option to avoid creating a YAML header or cell metadata if there was none initially. ([#110](https://github.com/mwouts/jupytext/issues/110))
- Language magic arguments are preserved in R Markdown, and also supported in `light` and `percent` scripts ([#111](https://github.com/mwouts/jupytext/issues/111), [#114](https://github.com/mwouts/jupytext/issues/114), [#115](https://github.com/mwouts/jupytext/issues/115))
- First markdown cell exported as a docstring when using the Sphinx format ([#107](https://github.com/mwouts/jupytext/issues/107))

0.8.3 (2018-10-19)
------------------

**Added**

- Frozen cells are supported in R Markdown, light and percent scripts ([#101](https://github.com/mwouts/jupytext/issues/101))
- Inactive cells extended to percent scripts ([#108](https://github.com/mwouts/jupytext/issues/108))
- `jupytext` gains a `--version` argument ([#103](https://github.com/mwouts/jupytext/issues/103))
- "ExecuteTime" cell metadata is not included in the text representation anymore ([#106](https://github.com/mwouts/jupytext/issues/106))


0.8.2 (2018-10-15)
------------------

**Added**

- Round trip conversion testing with `jupytext --test` was improved ([#99](https://github.com/mwouts/jupytext/issues/99))
- Round trip conversion tested on Jake Vanderplas' Python for Data Science Handbook.

**Fixed**

- Nested lists and dictionaries are now supported in notebook metadata
- Final empty code cell supported in Sphinx representation

0.8.1 (2018-10-11)
------------------

**Fixed**

- Sphinx format tested on `World population` notebook ([#97](https://github.com/mwouts/jupytext/issues/97))
- Mirror test made stronger on this occasion!
- Markdown representation recognize Julia, Scheme and C++ code cells as such
- Light representation of Scheme and C++ notebooks fixed ([#61](https://github.com/mwouts/jupytext/issues/61))

0.8.0 (2018-10-10)
------------------

**Added**

- All `jupytext` related metadata goes to a `jupytext` section ([#91](https://github.com/mwouts/jupytext/issues/91)). Please make sure your collaborators use the same version of Jupytext, as the new version can read previous metadata, but not the opposite.
- Notebooks extensions can be prefixed with any prefix of at most three chars ([#87](https://github.com/mwouts/jupytext/issues/87)).
- Export of the same notebook to multiple formats is now supported. To export to all python formats, plus `.ipynb` and `.md`, use `"jupytext": {"formats": "ipynb,pct.py:percent,lgt.py:light,spx.py:sphinx,md"},`.
- README includes a short section on how to extend `light` and `percent` formats to more languages ([#61](https://github.com/mwouts/jupytext/issues/61)).
- Jupytext's contents manager accepts the `auto` extension in `default_jupytext_formats` ([#93](https://github.com/mwouts/jupytext/issues/93)).
- All Jupyter magics are escaped in `light` scripts and R markdown documents. Escape magics in other formats with a `comment_magics` metadata (true or false), or with the contents manager `comment_magics` global flag ([#94](https://github.com/mwouts/jupytext/issues/94)).

**Fixed**

- Trusting notebooks made functional again.
- Command line `jupytext` returns a meaningful error when no argument is given.
- Fixed global pairing configuration ([#95](https://github.com/mwouts/jupytext/issues/95)).

0.7.2 (2018-10-01)
------------------

**Added**

- `light` and `percent` formats made available for scheme and cpp notebooks. Adding more formats is straightforward - just add a new entry to _SCRIPT_EXTENSIONS in languages.py, a sample notebook and a mirror test ([#61](https://github.com/mwouts/jupytext/issues/61))
- Format name is automatically appended to extension in `jupytext_formats` when notebook is loaded/saved.

**Fixed**

- Notebooks extensions can only be prefixed with `.nb` ([#87](https://github.com/mwouts/jupytext/issues/87))


0.7.1 (2018-09-24)
------------------

**Fixed**

- Markdown cells header in sphinx gallery format may have a space between first # and following.

0.7.0 (2018-09-23)
------------------

**Added**

- Header for cells in `percent` format is more robust: use `[markdown]` and `[raw]` to identify cell types. Cell type comes after the cell title. ([#59](https://github.com/mwouts/jupytext/issues/59))
- Jupytext can read and write notebooks as Hydrogen/VScode/Spyder/PyCharm compatible scripts (cells starting with `# %%`) ([#59](https://github.com/mwouts/jupytext/issues/59))
- Jupytext can read and write notebooks as Sphinx-gallery compatible scripts ([#80](https://github.com/mwouts/jupytext/issues/80))
- Metadata are supported for all cell types in light python and percent formats ([#66](https://github.com/mwouts/jupytext/issues/66)). Due to this, light python format version is now 1.3. Light python notebooks in versions 1.1 and 1.2 are still readable.
- Command line `jupytext` has a `from` argument, and now accepts notebook from the standard input.

**Fixed**

- Fix merging of input and output notebooks ([#83](https://github.com/mwouts/jupytext/issues/83))
- Removed extra new line on stdout in command line `jupytext` ([#84](https://github.com/mwouts/jupytext/issues/84))

0.6.5 (2018-09-13)
------------------

**Added**

- Code lines that start with a quotation mark in Jupyter are commented in the corresponding Python and Julia scripts ([#73](https://github.com/mwouts/jupytext/issues/73))
- Update pypy, add flake8 tests on Travis CI ([#74](https://github.com/mwouts/jupytext/issues/74))

**Fixed**

- Import notebook.transutils before notebook.services.contents.filemanager ([#75](https://github.com/mwouts/jupytext/issues/75))

0.6.4 (2018-09-12)
------------------

**Added**

- Jupytext will not load paired notebook when text representation is out of date ([#63](https://github.com/mwouts/jupytext/issues/63))
- Package tested against Python 3.7 ([#68](https://github.com/mwouts/jupytext/issues/68))

**Fixed**

- Allow unicode characters in notebook path ([#70](https://github.com/mwouts/jupytext/issues/70))
- Read README.md as unicode in `setup.py` ([#71](https://github.com/mwouts/jupytext/issues/71))

0.6.3 (2018-09-07)
------------------

**Added**

- Lighter cell markers for Python and Julia scripts ([#57](https://github.com/mwouts/jupytext/issues/57)). Corresponding file format version at 1.2. Scripts in previous version 1.1 can still be opened.
- New screenshots for the README.

**Fixed**

- Command line conversion tool `jupytext` fixed on Python 2.7 ([#46](https://github.com/mwouts/jupytext/issues/46))

0.6.2 (2018-09-05)
------------------

**Added**

- Initial support for Jupyter notebooks as Julia scripts ([#56](https://github.com/mwouts/jupytext/issues/56))
- Command line conversion tool `jupytext` has explicit `to` and `output` options ([#46](https://github.com/mwouts/jupytext/issues/46))
- Round trip test with `jupytext --test` improved ([#54](https://github.com/mwouts/jupytext/issues/54))
- Improved README ([#51](https://github.com/mwouts/jupytext/issues/51))


**Fixed**

- testfixtures now in requirements ([#55](https://github.com/mwouts/jupytext/issues/55))
- Empty code cells are now preserved ([#53](https://github.com/mwouts/jupytext/issues/53))

0.6.1 (2018-08-31)
------------------

**Added**

- Package and conversion script renamed from `nbrmd` to `jupytext`.

0.6.0 (2018-08-31)
------------------

**Added**

- Cell parsing and exporting done in two specialized classes. This is way easier to read. Pylint score at 9.9 !
- Python file format updated to 1.1: default end of cell for python scripts is one blank space. Two blank spaces are allowed as well. Now you can reformat code in Python IDE without breaking notebook cells ([#38](https://github.com/mwouts/jupytext/issues/38)).
- Added support for plain markdown files ([#40](https://github.com/mwouts/jupytext/issues/40), [#44](https://github.com/mwouts/jupytext/issues/44)).
- Demonstration notebooks more user friendly ([#45](https://github.com/mwouts/jupytext/issues/45)).
- Command line tool simpler to use ([#46](https://github.com/mwouts/jupytext/issues/46)).
- Start code patterns present in Jupyter cells are escaped.
- Default `nbrmd_format` is empty (mwouts/nbsrc/[#5](https://github.com/mwouts/jupytext/issues/5)): no Jupyter notebook is created on disk when the user opens a Python or R file and saves it from Jupyter, unless the users asks for it by setting `nbrmd_format`.

**Fixed**

- Fixed message in the `nbsrc` script ([#43](https://github.com/mwouts/jupytext/issues/43))
- Technical metadata don't appear any more in scripts unless required ([#42](https://github.com/mwouts/jupytext/issues/42))
- Code cells that are fully commented remain code cells after round trip ([#41](https://github.com/mwouts/jupytext/issues/41))

0.5.4 (2018-08-24)
------------------

**Added**

- R to Rmd conversion compares well to knitr::spin ([#26](https://github.com/mwouts/jupytext/issues/26))
- Increased coverage to 98%


0.5.3 (2018-08-22)
------------------

**Fixed**

- Read and write version to the same metadata ([#36](https://github.com/mwouts/jupytext/issues/36))


0.5.2 (2018-08-22)
------------------

**Added**

- Classical jupyter extensions (autoreload, rmagics) are also escaped ([#35](https://github.com/mwouts/jupytext/issues/35))
- Explicit file format version, set at 1.0, to avoid overriding ipynb files by accident ([#36](https://github.com/mwouts/jupytext/issues/36))


0.5.1 (2018-08-21)
------------------

**Fixed**

- Source only notebooks can be trusted.

0.5.0 (2018-08-21)
------------------

**Added**

- Jupyter magic commands escaped when exported ([#29](https://github.com/mwouts/jupytext/issues/29))
- 'endofcell' option for explicit (optional) end-of-cell marker ([#31](https://github.com/mwouts/jupytext/issues/31))
- 'active' cell option now supported for .py and .R export ([#30](https://github.com/mwouts/jupytext/issues/30))
- Raw cells now preserved when exported to .py or .R ([#32](https://github.com/mwouts/jupytext/issues/32))
- Extensions can be prefixed, like `.nb.py`, (mwouts/nbsrc[#5](https://github.com/mwouts/jupytext/issues/5))
- When a file with an extension not associated to 'ipynb' is opened and saved, no 'ipynb' file is created (mwouts/nbsrc[#5](https://github.com/mwouts/jupytext/issues/5))
- Extensions can now be a sequence of groups. For instance, `nbrmd_formats="ipynb,nb.py;script.ipynb,py"` will create an `ipynb` file when a `nb.py` is opened (and conversely), and a `script.ipynb` file when a `py` file is opened (mwouts/nbsrc[#5](https://github.com/mwouts/jupytext/issues/5))
- `nbsrc` script was moved to the `nbrmd` package. The `nbsrc` package now only contains the documentation (mwouts/nbsrc[#3](https://github.com/mwouts/jupytext/issues/3))


0.4.6 (2018-07-26)
------------------

- Ping pypi - previous version still not available


0.4.5 (2018-07-26)
------------------

**Fixed**

- Removed dependency of `setup.py` on `yaml`

0.4.4 (2018-07-26)
-------------------

**Fixed**

- Package republished with `python setup.py sdist bdist_wheel` to fix missing dependencies

0.4.3 (2018-07-26)
------------------

**Added**

- Multiline comments now supported [#25](https://github.com/mwouts/jupytext/issues/25)
- Readme refactored, notebook demos available on binder [#23](https://github.com/mwouts/jupytext/issues/23)

**Fixed**

- ContentsManager can be imported even if `notebook.transutils` is not available, for compatibility with older python distributions.
- Fixed missing cell metadata [#27](https://github.com/mwouts/jupytext/issues/27)
- Documentation tells how to avoid creating `.ipynb` files [#16](https://github.com/mwouts/jupytext/issues/16)

0.4.2 (2018-07-23)
------------------

**Added**

- Added test for R notebooks
- Added pylint badge, imports now in correct order
- New `active` cell metadata that allows cell activation only for desired extensions (currently available for Rmd and ipynb extensions only)

0.4.1 (2018-07-20)
------------------

**Fixed**

- Indented python code will not start a new cell [#20](https://github.com/mwouts/jupytext/issues/20)
- Fixed parsing of Rmd cell metadata [#21](https://github.com/mwouts/jupytext/issues/21)

0.4.0 (2018-07-18)
------------------

**Added**

- `.py` format for notebooks is lighter and pep8 compliant

**Fixed**

- Default nbrmd config not added to notebooks ([#17](https://github.com/mwouts/jupytext/issues/17))
- `nbrmd_formats` becomes a configurable traits ([#16](https://github.com/mwouts/jupytext/issues/16))
- Removed `nbrmd_sourceonly_format` metadata. Source notebook is current notebook when not `.ipynb`, otherwise the first notebook format in `nbrmd_formats` (not `.ipynb`) that is found on disk

0.3.0 (2018-07-17)
------------------

**Added**

- Introducing support for notebooks as python `.py` or R scripts `.R`

0.2.6 (2018-07-13)
------------------

**Added**

- Introduced `nbrmd_sourceonly_format` metadata
- Inputs are loaded from `.Rmd` file when a matching `.ipynb` file is opened.

**Fixed**

- Trusted notebooks remain trusted ([#12](https://github.com/mwouts/jupytext/issues/12))

0.2.5 (2018-07-11)
------------------

**Added**

- Outputs of existing `.ipynb` versions are combined with matching inputs of R markdown version, as suggested by @grst ([#12](https://github.com/mwouts/jupytext/issues/12))

**Fixed**

- Support for unicode text in python 2.7 ([#11](https://github.com/mwouts/jupytext/issues/11))


0.2.4 (2018-07-05)
------------------

**Added**

- nbrmd will always open notebooks, even if header of code cells are not terminated. Merge conflicts can thus be solved in Jupyter directly.
- New metadata 'main language' that preserves the notebook language.

**Fixed**

- dependencies included in `setup.py`
- pre_save_hook work with non-empty `notebook_dir` ([#9](https://github.com/mwouts/jupytext/issues/9))

0.2.3 (2018-06-28)
------------------

**Added**

- Screenshots in README

**Fixed**

- RMarkdown exporter for nbconvert fixed on non-recent python
- Tests compatible with other revisions of nbformat >= 4.0
- Tests compatible with older pytest versions


0.2.2 (2018-06-28)
-------------------

**Added**

- RMarkdown exporter for nbconvert
- Parsing of R options robust to parenthesis
- Jupyter cell tags are preserved

**Fixed**

- requirements.txt now included in pypi packages

0.2.1 (2018-06-24)
------------------

**Added**

- Support for editing markdown files in Jupyter
- New pre-save hook `update_selected_formats` that saves to formats in metadata 'nbrmd_formats'
- Rmd cell options directly mapped to cell metadata

**Fixed**

- ContentManager compatible with Python 2.7

0.2.0 (2018-06-21)
------------------

**Added**

- The package provides a `RmdFileContentsManager` for direct edit of R markdown files in Jupyter
- Notebook metadata and cell options are preserved


0.1.1 (2018-06-19)
------------------

**Added**

- `nbrmd` prints the result of conversion to stdout, unless flag `-i` is provided
- Notebooks with R code chunks are supported

0.1 (2018-06-18)
----------------

- Initial version with the `nbrmd` converter and Jupyter `pre_save_hook`


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2018-2026 Marc Wouts

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
![](https://github.com/mwouts/jupytext/blob/17aea37c612f33a4e27eeee4b81966f1506920fd/docs/images/logo_large.png?raw=true)

<!-- INDEX-START -->

[![CI](https://github.com/mwouts/jupytext/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/mwouts/jupytext/actions)
[![Documentation Status](https://readthedocs.org/projects/jupytext/badge/?version=latest)](https://jupytext.readthedocs.io/en/latest/?badge=latest)
[![codecov.io](https://codecov.io/github/mwouts/jupytext/coverage.svg?branch=main)](https://codecov.io/gh/mwouts/jupytext/branch/main)
[![MIT License](https://img.shields.io/github/license/mwouts/jupytext)](https://github.com/mwouts/jupytext/blob/main/LICENSE)
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
[![GitHub language count](https://img.shields.io/github/languages/count/mwouts/jupytext)](docs/languages.md)
[![Conda Version](https://anaconda.org/conda-forge/jupytext/badges/version.svg)](https://anaconda.org/conda-forge/jupytext/)
[![Pypi](https://img.shields.io/pypi/v/jupytext.svg)](https://pypi.python.org/pypi/jupytext)
[![pyversions](https://img.shields.io/pypi/pyversions/jupytext.svg)](https://pypi.python.org/pypi/jupytext)
[![Binder:lab](https://img.shields.io/badge/binder-jupyterlab-0172B2.svg)](https://mybinder.org/v2/gh/mwouts/jupytext/main?urlpath=lab/tree/demo/get_started.ipynb)
[![Binder:notebook](https://img.shields.io/badge/binder-notebook-0172B2.svg)](https://mybinder.org/v2/gh/mwouts/jupytext/main?filepath=demo)
[![launch - renku](https://renkulab.io/renku-badge.svg)](https://renkulab.io/projects/best-practices/jupytext/sessions/new?autostart=1)
[![Jupyter Con 2020](https://img.shields.io/badge/YouTube-JupyterCon%202020-red.svg)](https://www.youtube.com/watch?v=SDYdeVfMh48)

# Jupytext

Have you always wished Jupyter notebooks were plain text documents? Wished you could edit them in your favorite IDE? And get clear and meaningful diffs when doing version control? Then, Jupytext may well be the tool you're looking for!

## Text Notebooks

A Python notebook encoded in the `py:percent` [format](docs/formats-scripts.md#the-percent-format) has a `.py` extension and looks like this:

```
# %% [markdown]
# This is a markdown cell

# %%
def f(x):
  return 3*x+1
```

Only the notebook inputs (and optionally, the metadata) are included. Text notebooks are well suited for version control. You can also edit or refactor them in an IDE - the `.py` notebook above is a regular Python file.

We recommend the `percent` format for notebooks that mostly contain code. The `percent` format is available for Julia, Python, R and many other [languages](docs/languages.md).

If your notebook is documentation-oriented, a [Markdown-based format](docs/formats-markdown.md) (text notebooks with a `.md` extension) might be more appropriate. Depending on what you plan to do with your notebook, you might prefer the Myst Markdown format, which interoperates very well with Jupyter Book, or Quarto Markdown, or even Pandoc Markdown.

## Installation

Install Jupytext in the Python environment that you use for Jupyter. Use either

    pip install jupytext

or

    conda install jupytext -c conda-forge

Then, restart your JupyterLab server, and make sure Jupytext is activated in Jupyter:  `.py` and `.md` files have a Notebook icon, and you can open them as Notebooks with a right click in JupyterLab.

![Notebook icon on text notebooks](https://github.com/mwouts/jupytext/blob/64b4be818508760116f91bf156342cb4cf724d93/docs/images/jupyterlab_right_click.png?raw=true)

## Paired Notebooks

Text notebooks with a `.py` or `.md` extension are well suited for version control. They can be edited or authored conveniently in an IDE. You can open and run them as notebooks in JupyterLab with a right click. However, the notebook outputs are lost when the notebook is closed, as only the notebook inputs are saved in text notebooks.

A convenient alternative to text notebooks are [paired notebooks](docs/paired-notebooks.md). These are a set of two files, say `.ipynb` and `.py`, that contain the same notebook, but in different formats.

You can edit the `.py` version of the paired notebook, and get the edits back in Jupyter by selecting _reload notebook from disk_. The outputs will be reloaded from the `.ipynb` file, if it exists. The `.ipynb` version will be updated or recreated the next time you save the notebook in Jupyter.

💡 **Tip:** You can automate the notebook reloading by installing the [Jupyter Collaboration](docs/jupyter-collaboration.md) extension.

To pair a notebook in JupyterLab, use the command `Pair Notebook with percent Script` from the Command Palette:

![](https://github.com/mwouts/jupytext/blob/64b4be818508760116f91bf156342cb4cf724d93/docs/images/pair_commands.png?raw=true)

To pair all the notebooks in a certain directory, create a [configuration file](docs/config.md) with this content:

```
# jupytext.toml at the root of your notebook directory
formats = "ipynb,py:percent"
```

## Command line

Jupytext is also available at the [command line](docs/using-cli.md). You can

- pair a notebook with `jupytext --set-formats ipynb,py:percent notebook.ipynb`
- synchronize the paired files with `jupytext --sync notebook.py` (the inputs are loaded from the most recent paired file)
- convert a notebook in one format to another with `jupytext --to ipynb notebook.py` (use `-o` if you want a specific output file)
- pipe a notebook to a linter with e.g. `jupytext --pipe black notebook.ipynb`

## Sample use cases

### Notebooks under version control

This is a quick how-to:
- Open your `.ipynb` notebook in Jupyter and [pair](docs/paired-notebooks.md) it to a `.py` notebook, using either the _pair_ command in JupyterLab, or a global [configuration file](docs/config.md)
- Save the notebook - this creates a `.py` notebook
- Add this `.py` notebook to version control

You might exclude `.ipynb` files from version control (unless you want to see the outputs versioned!). Jupytext will recreate the `.ipynb` files locally when the users open and save the `.py` notebooks.

### Collaborating on notebooks with Git

Collaborating on Jupyter notebooks through Git becomes as easy as collaborating on text files.

Assume that you have your `.py` notebooks under version control (see above). Then,
- Your collaborator pulls the `.py` notebook
- They open it _as a notebook_ in Jupyter (right-click in JupyterLab)
- At that stage the notebook has no outputs. They run the notebook and save it. Outputs are regenerated, and a local `.ipynb` file is created
- They edit the notebook, and push the updated `notebook.py` file. The diff is nothing else than a standard diff on a Python script.
- You pull the updated `notebook.py` script, and refresh your browser. The input cells are updated based on the new content of `notebook.py`. The outputs are reloaded from your local `.ipynb` file. Finally, the kernel variables are untouched, so you have the option to run only the modified cells to get the new outputs.

### Editing or refactoring a notebook in an IDE

Once your notebook is [paired](docs/paired-notebooks.md) with a `.py` file, you can easily edit or refactor the `.py` representation of the notebook in an IDE.

Once you are done editing the `.py` notebook, you will just have to _reload_ the notebook in Jupyter to get the latest edits there.

Note: It is simpler to close the `.ipynb` notebook in Jupyter when you edit the paired `.py` file. There is no obligation to do so; however, if you don't, you should be prepared to read carefully the pop-up messages. If Jupyter tries to save the notebook while the paired `.py` file has also been edited on disk since the last reload, a conflict will be detected and you will be asked to decide which version of the notebook (in memory or on disk) is the appropriate one. Alternatively, the [Jupyter Collaboration](docs/jupyter-collaboration.md) extension provides an autoreload feature which simplifies this.

## More resources

Read more about Jupytext in the [documentation](https://jupytext.readthedocs.io).

If you're new to Jupytext, you may want to start with the [FAQ](docs/faq.md) or with the [Tutorials](docs/tutorials.md).

There is also this short introduction to Jupytext: [![](https://img.shields.io/badge/YouTube-JupyterCon%202020-red.svg)](https://www.youtube.com/watch?v=SDYdeVfMh48).


================================================
FILE: binder/labconfig/default_setting_overrides.json
================================================
{
  "@jupyterlab/docmanager-extension:plugin": {
    "defaultViewers": {
      "markdown": "Jupytext Notebook",
      "myst": "Jupytext Notebook",
      "r-markdown": "Jupytext Notebook",
      "quarto": "Jupytext Notebook",
      "julia": "Jupytext Notebook",
      "python": "Jupytext Notebook",
      "r": "Jupytext Notebook"
    }
  }
}


================================================
FILE: binder/postBuild
================================================
# Stop everything if one command fails
set -e

# Install from sources
# NB: If you want to use Jupytext on your binder, don't install it from source,
# just add "jupytext" to your "binder/requirements.txt" instead.
HATCH_BUILD_HOOKS_ENABLE=true pip install .

mkdir -p ${HOME}/.jupyter/labconfig
cp binder/labconfig/* ${HOME}/.jupyter/labconfig

# Create the notebook for our jupytext demo
jupytext demo/get_started.md --to ipynb --update-metadata '{"jupytext":null}'

# Remove the markdown representation
# (the demo starts with just the ipynb file)
rm demo/get_started.md

# Trust our World Population notebook
jupyter trust demo/World\ population.ipynb

# Install the bash kernel
python -m bash_kernel.install


================================================
FILE: binder/requirements.txt
================================================
jupyterlab>=4
notebook>=7
plotly
matplotlib
wordcloud
pandas
wbdata
bash_kernel


================================================
FILE: demo/Benchmarking Jupytext.py
================================================
# In this notebook, we benchmark the Jupytext formats for Jupyter notebooks against the base format
# Open this script as a notebook in Jupyter to run it and see the plots

import time
import copy
import pandas as pd
import plotly.graph_objects as go
from plotly.colors import DEFAULT_PLOTLY_COLORS

import nbformat
import jupytext

# The notebook to be tested
notebook = jupytext.read('World population.ipynb')

# Same notebook, with no outputs, for a fair comparison
notebook_no_outputs = copy.deepcopy(notebook)
for cell in notebook_no_outputs.cells:
    cell.outputs = []
    cell.execution_count = None

# +
JUPYTEXT_FORMATS = ['ipynb', 'md', 'py:light', 'py:percent', 'py:sphinx']

# Let's see if we have pandoc here
try:
    jupytext.writes(notebook, fmt='md:pandoc')
    JUPYTEXT_FORMATS.append('md:pandoc')
except jupytext.formats.JupytextFormatError as err:
    print(str(err))


# Let's see if we have myst-parser installed here
try:
    jupytext.writes(notebook, fmt='myst')
    JUPYTEXT_FORMATS.append('myst')
except jupytext.formats.JupytextFormatError as err:
    print(str(err))

# -


def sample_perf(nb, n=30):
    samples = pd.DataFrame(
        pd.np.NaN,
        index=pd.MultiIndex.from_product(
            (range(n), ['nbformat'] + JUPYTEXT_FORMATS), names=['sample', 'implementation']),
        columns=pd.Index(['size', 'read', 'write'], name='measure'))

    for i, fmt in samples.index:
        t0 = time.time()
        if fmt == 'nbformat':
            text = nbformat.writes(nb)
        else:
            text = jupytext.writes(nb, fmt)
        t1 = time.time()
        samples.loc[(i, fmt), 'write'] = t1 - t0
        samples.loc[(i, fmt), 'size'] = len(text)
        t0 = time.time()
        if fmt == 'nbformat':
            nbformat.reads(text, as_version=4)
        else:
            jupytext.reads(text, fmt)
        t1 = time.time()
        samples.loc[(i, fmt), 'read'] = t1 - t0
    return samples


def performance_plot(perf, title):
    formats = ['nbformat'] + JUPYTEXT_FORMATS
    mean = perf.groupby('implementation').mean().loc[formats]
    std = perf.groupby('implementation').std().loc[formats]
    data = [go.Bar(x=mean.index,
                   y=mean[col],
                   error_y=dict(
                       type='data',
                       array=std[col],
                       color=color,
                       thickness=0.5
                   ) if col != 'size' else dict(),
                   name=col,
                   yaxis={'read': 'y1', 'write': 'y2', 'size': 'y3'}[col])
            for col, color in zip(mean.columns, DEFAULT_PLOTLY_COLORS)]
    layout = go.Layout(title=title,
                       xaxis=dict(title='Implementation', anchor='y3'),
                       yaxis=dict(domain=[0.7, 1], title='Read (secs)'),
                       yaxis2=dict(domain=[0.35, .65], title='Write (secs)'),
                       yaxis3=dict(domain=[0, .3], title='Size')
                       )
    return go.Figure(data=data, layout=layout)


perf_no_outputs = sample_perf(notebook_no_outputs, 30)

performance_plot(perf_no_outputs, 'Benchmarking Jupytext on the World Population notebook<br>(Outputs filtered)')

perf = sample_perf(notebook, 30)

performance_plot(perf, 'Benchmarking Jupytext on the World Population notebook<br>(With outputs)')


================================================
FILE: demo/Jupytext's word cloud.py
================================================
# This is a notebook that I used to generate Jupytext's word cloud.
# To open this script as a notebook in JupyterLab, right-click on this file, and select _Open with/Notebook_.

from wordcloud import WordCloud

text = """
Jupytext
Notebook
JupyterLab
Git
GitHub
Version control
Markdown
R Markdown
Text
Scripts
Code
Notebook Template
Binder
Visual Studio Code
PyCharm
Atom
Spyder
Hydrogen
RStudio
Sphinx-Gallery
Documentation
black
pytest
autopep8
Metadata
Reproducible research
R
Julia
Python
Bash
Powershell
Scala
Scheme
Clojure
Matlab
Octave
C++
q/kdb+
IDL
TypeScript
Javascript
Scala
Rust
Robot Framework
"""

wordcloud = WordCloud(
    random_state=1,
    background_color='white',
    width=1200, height=500
).generate_from_frequencies({word: 1 for word in text.splitlines()})

wordcloud.to_image()

wordcloud.to_file('../docs/jupytext_word_cloud.png')


================================================
FILE: demo/Tests in a notebook.md
================================================
# Testing a Jupyter notebook with pytest

In this notebook we describe how to test a notebook with `jupytext`.

## Writing assertions and tests in a notebook

Our notebook defines a function that we wish to test. Our function is simply

```python
def f(x, n=5):
    return [x + i for i in range(n)] 
```

We can test the assertion in Jupyter with simply

```python
assert f(5) == [5,6,7,8,9]
```

Since the assertion above works, we don't get any message. It's more interesting to see what happens when an assertion fails. Remove one element of the list above and change the assertion to, say, 

    assert f(5) == [5,6,8,9]

When we run the above in Jupyter, we get

```stderr
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-3-1383ac5d204f> in <module>
----> 1 assert f(5) == [5,6,8,9]

AssertionError: 
```

Now if we run the notebook with `jupytext --check pytest 'Tests in a notebook.md'`, we get a more detailed description of the issue, thanks to `pytest`'s rewriting of assertions: 
```output
[jupytext] Reading Tests in a notebook.md
=========================== test session starts ===========================
platform win32 -- Python 3.7.5, pytest-5.2.2, py-1.8.0, pluggy-0.13.0
rootdir: C:\Users\Marco
collected 0 items / 1 errors

================================ ERRORS ===================================
_________ ERROR collecting Tests in a notebook vhs_lscr.py ________________
Tests in a notebook vhs_lscr.py:19: in <module>
    assert f(5) == [5,6,8,9]
E   assert [5, 6, 7, 8, 9] == [5, 6, 8, 9]
E    +  where [5, 6, 7, 8, 9] = <function f at 0x000002440A0D1798>(5)
!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!
=========================== 1 error in 0.09s ==============================
```

Once all of our assertions pass, we can move them to a test function. In Jupyter the function is not evaluated - only when we run `jupytext --check pytest` on the notebook, the function is actually executed.

```python
def test_f():
    assert f(5) == [5,6,7,8,9]
```

## Going further

- [nbval](https://github.com/computationalmodelling/nbval) is a plugin for `pytest` that allows you to make sure that Jupyter notebooks run properly, and that their new outputs match the current ones. Use it as `pytest --nbval notebook.ipynb`.
- [ipytest](https://github.com/chmp/ipytest) defines a `%%run_pytest` cell magic that allows you to execute the tests in a cell directly in Jupyter.


================================================
FILE: demo/World population.Rmd
================================================
---
jupyter:
  jupytext:
    cell_markers: region,endregion
    formats: ipynb,.pct.py:percent,.lgt.py:light,.spx.py:sphinx,md,Rmd,.pandoc.md:pandoc
    text_representation:
      extension: .Rmd
      format_name: rmarkdown
      format_version: '1.1'
      jupytext_version: 1.1.0
  kernelspec:
    display_name: Python 3
    language: python
    name: python3
---

# A quick insight at world population

## Collecting population data

In the below we retrieve population data from the
[World Bank](http://www.worldbank.org/)
using the [wbdata](https://github.com/OliverSherouse/wbdata) python package

```{python}
import pandas as pd
import wbdata as wb

pd.options.display.max_rows = 6
pd.options.display.max_columns = 20
```

Corresponding indicator is found using search method - or, directly,
the World Bank site.

```{python}
wb.search_indicators('Population, total')  # SP.POP.TOTL
# wb.search_indicators('area')
# => https://data.worldbank.org/indicator is easier to use
```

Now we download the population data

```{python}
indicators = {'SP.POP.TOTL': 'Population, total',
              'AG.SRF.TOTL.K2': 'Surface area (sq. km)',
              'AG.LND.TOTL.K2': 'Land area (sq. km)',
              'AG.LND.ARBL.ZS': 'Arable land (% of land area)'}
data = wb.get_dataframe(indicators, convert_date=True).sort_index()
data
```

World is one of the countries

```{python}
data.loc['World']
```

Can we classify over continents?

```{python}
data.loc[(slice(None), '2017-01-01'), :]['Population, total'].dropna(
).sort_values().tail(60).index.get_level_values('country')
```

Extract zones manually (in order of increasing population)

```{python}
zones = ['North America', 'Middle East & North Africa',
         'Latin America & Caribbean', 'Europe & Central Asia',
         'Sub-Saharan Africa', 'South Asia',
         'East Asia & Pacific'][::-1]
```

And extract population information (and check total is right)

```{python}
population = data.loc[zones]['Population, total'].swaplevel().unstack()
population = population[zones]
assert all(data.loc['World']['Population, total'] == population.sum(axis=1))
```

## Stacked area plot with matplotlib

```{python}
import matplotlib.pyplot as plt
```

```{python}
plt.clf()
plt.figure(figsize=(10, 5), dpi=100)
plt.stackplot(population.index, population.values.T / 1e9)
plt.legend(population.columns, loc='upper left')
plt.ylabel('Population count (B)')
plt.show()
```

## Stacked bar plot with plotly

```{python}
import plotly.offline as offline
import plotly.graph_objs as go

offline.init_notebook_mode()
```

```{python}
data = [go.Scatter(x=population.index, y=population[zone], name=zone, stackgroup='World')
        for zone in zones]
fig = go.Figure(data=data,
                layout=go.Layout(title='World population'))
offline.iplot(fig)
```


================================================
FILE: demo/World population.ipynb
================================================
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# A quick insight at world population\n",
    "\n",
    "## Collecting population data\n",
    "\n",
    "In the below we retrieve population data from the\n",
    "[World Bank](http://www.worldbank.org/)\n",
    "using the [wbdata](https://github.com/OliverSherouse/wbdata) python package"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import wbdata as wb\n",
    "\n",
    "pd.options.display.max_rows = 6\n",
    "pd.options.display.max_columns = 20"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Corresponding indicator is found using search method - or, directly,\n",
    "the World Bank site."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "SP.POP.TOTL\tPopulation, total\n"
     ]
    }
   ],
   "source": [
    "wb.search_indicators('Population, total')  # SP.POP.TOTL\n",
    "# wb.search_indicators('area')\n",
    "# => https://data.worldbank.org/indicator is easier to use"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we download the population data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th>Population, total</th>\n",
       "      <th>Surface area (sq. km)</th>\n",
       "      <th>Land area (sq. km)</th>\n",
       "      <th>Arable land (% of land area)</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>country</th>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">Afghanistan</th>\n",
       "      <th>1960-01-01</th>\n",
       "      <td>8996351.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1961-01-01</th>\n",
       "      <td>9166764.0</td>\n",
       "      <td>652860.0</td>\n",
       "      <td>652860.0</td>\n",
       "      <td>11.717673</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1962-01-01</th>\n",
       "      <td>9345868.0</td>\n",
       "      <td>652860.0</td>\n",
       "      <td>652860.0</td>\n",
       "      <td>11.794259</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">Zimbabwe</th>\n",
       "      <th>2015-01-01</th>\n",
       "      <td>15777451.0</td>\n",
       "      <td>390760.0</td>\n",
       "      <td>386850.0</td>\n",
       "      <td>10.339925</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2016-01-01</th>\n",
       "      <td>16150362.0</td>\n",
       "      <td>390760.0</td>\n",
       "      <td>386850.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01</th>\n",
       "      <td>16529904.0</td>\n",
       "      <td>390760.0</td>\n",
       "      <td>386850.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>15312 rows × 4 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                        Population, total  Surface area (sq. km)  \\\n",
       "country     date                                                   \n",
       "Afghanistan 1960-01-01          8996351.0                    NaN   \n",
       "            1961-01-01          9166764.0               652860.0   \n",
       "            1962-01-01          9345868.0               652860.0   \n",
       "...                                   ...                    ...   \n",
       "Zimbabwe    2015-01-01         15777451.0               390760.0   \n",
       "            2016-01-01         16150362.0               390760.0   \n",
       "            2017-01-01         16529904.0               390760.0   \n",
       "\n",
       "                        Land area (sq. km)  Arable land (% of land area)  \n",
       "country     date                                                          \n",
       "Afghanistan 1960-01-01                 NaN                           NaN  \n",
       "            1961-01-01            652860.0                     11.717673  \n",
       "            1962-01-01            652860.0                     11.794259  \n",
       "...                                    ...                           ...  \n",
       "Zimbabwe    2015-01-01            386850.0                     10.339925  \n",
       "            2016-01-01            386850.0                           NaN  \n",
       "            2017-01-01            386850.0                           NaN  \n",
       "\n",
       "[15312 rows x 4 columns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "indicators = {'SP.POP.TOTL': 'Population, total',\n",
    "              'AG.SRF.TOTL.K2': 'Surface area (sq. km)',\n",
    "              'AG.LND.TOTL.K2': 'Land area (sq. km)',\n",
    "              'AG.LND.ARBL.ZS': 'Arable land (% of land area)'}\n",
    "data = wb.get_dataframe(indicators, convert_date=True).sort_index()\n",
    "data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "World is one of the countries"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Population, total</th>\n",
       "      <th>Surface area (sq. km)</th>\n",
       "      <th>Land area (sq. km)</th>\n",
       "      <th>Arable land (% of land area)</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1960-01-01</th>\n",
       "      <td>3.032160e+09</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1961-01-01</th>\n",
       "      <td>3.073369e+09</td>\n",
       "      <td>134043190.4</td>\n",
       "      <td>129721455.4</td>\n",
       "      <td>9.693086</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1962-01-01</th>\n",
       "      <td>3.126510e+09</td>\n",
       "      <td>134043190.4</td>\n",
       "      <td>129721435.4</td>\n",
       "      <td>9.726105</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2015-01-01</th>\n",
       "      <td>7.357559e+09</td>\n",
       "      <td>134325130.2</td>\n",
       "      <td>129732901.8</td>\n",
       "      <td>10.991288</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2016-01-01</th>\n",
       "      <td>7.444157e+09</td>\n",
       "      <td>134325130.2</td>\n",
       "      <td>129733172.7</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01</th>\n",
       "      <td>7.530360e+09</td>\n",
       "      <td>134325130.2</td>\n",
       "      <td>129733172.7</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>58 rows × 4 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "            Population, total  Surface area (sq. km)  Land area (sq. km)  \\\n",
       "date                                                                       \n",
       "1960-01-01       3.032160e+09                    NaN                 NaN   \n",
       "1961-01-01       3.073369e+09            134043190.4         129721455.4   \n",
       "1962-01-01       3.126510e+09            134043190.4         129721435.4   \n",
       "...                       ...                    ...                 ...   \n",
       "2015-01-01       7.357559e+09            134325130.2         129732901.8   \n",
       "2016-01-01       7.444157e+09            134325130.2         129733172.7   \n",
       "2017-01-01       7.530360e+09            134325130.2         129733172.7   \n",
       "\n",
       "            Arable land (% of land area)  \n",
       "date                                      \n",
       "1960-01-01                           NaN  \n",
       "1961-01-01                      9.693086  \n",
       "1962-01-01                      9.726105  \n",
       "...                                  ...  \n",
       "2015-01-01                     10.991288  \n",
       "2016-01-01                           NaN  \n",
       "2017-01-01                           NaN  \n",
       "\n",
       "[58 rows x 4 columns]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.loc['World']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Can we classify over continents?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['Iran, Islamic Rep.', 'Congo, Dem. Rep.', 'Germany', 'Vietnam',\n",
       "       'Egypt, Arab Rep.', 'Central Europe and the Baltics', 'Philippines',\n",
       "       'Ethiopia', 'Japan', 'Mexico', 'Russian Federation', 'Bangladesh',\n",
       "       'Nigeria', 'Pakistan', 'Brazil', 'Indonesia', 'United States',\n",
       "       'Euro area', 'North America',\n",
       "       'Middle East & North Africa (IDA & IBRD countries)',\n",
       "       'Middle East & North Africa (excluding high income)', 'Arab World',\n",
       "       'Europe & Central Asia (excluding high income)',\n",
       "       'Middle East & North Africa',\n",
       "       'Europe & Central Asia (IDA & IBRD countries)',\n",
       "       'Fragile and conflict affected situations', 'European Union',\n",
       "       'IDA blend', 'Latin America & Caribbean (excluding high income)',\n",
       "       'Latin America & the Caribbean (IDA & IBRD countries)',\n",
       "       'Latin America & Caribbean', 'Low income',\n",
       "       'Heavily indebted poor countries (HIPC)', 'Pre-demographic dividend',\n",
       "       'Europe & Central Asia', 'Least developed countries: UN classification',\n",
       "       'Sub-Saharan Africa (excluding high income)',\n",
       "       'Sub-Saharan Africa (IDA & IBRD countries)', 'Sub-Saharan Africa',\n",
       "       'IDA only', 'Post-demographic dividend', 'High income', 'OECD members',\n",
       "       'India', 'China', 'IDA total', 'South Asia (IDA & IBRD)', 'South Asia',\n",
       "       'East Asia & Pacific (IDA & IBRD countries)',\n",
       "       'East Asia & Pacific (excluding high income)',\n",
       "       'Late-demographic dividend', 'East Asia & Pacific',\n",
       "       'Upper middle income', 'Lower middle income',\n",
       "       'Early-demographic dividend', 'IBRD only', 'Middle income',\n",
       "       'Low & middle income', 'IDA & IBRD total', 'World'],\n",
       "      dtype='object', name='country')"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.loc[(slice(None), '2017-01-01'), :]['Population, total'].dropna(\n",
    ").sort_values().tail(60).index.get_level_values('country')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Extract zones manually (in order of increasing population)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "zones = ['North America', 'Middle East & North Africa',\n",
    "         'Latin America & Caribbean', 'Europe & Central Asia',\n",
    "         'Sub-Saharan Africa', 'South Asia',\n",
    "         'East Asia & Pacific'][::-1]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And extract population information (and check total is right)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "population = data.loc[zones]['Population, total'].swaplevel().unstack()\n",
    "population = population[zones]\n",
    "assert all(data.loc['World']['Population, total'] == population.sum(axis=1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Stacked area plot with matplotlib"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 432x288 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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
Download .txt
gitextract_26hsbj6f/

├── .git-blame-ignore-revs
├── .git_archival.txt
├── .gitattributes
├── .github/
│   ├── codecov.yml
│   ├── dependabot.yml
│   └── workflows/
│       ├── ci.yml
│       ├── comment-pr.yml
│       ├── publish.yml
│       ├── step_build.yml
│       ├── step_coverage.yml
│       ├── step_pre-commit.yml
│       ├── step_static-analysis.yml
│       ├── step_tests-conda.yml
│       ├── step_tests-pip.yml
│       ├── step_tests-ui.yml
│       └── update-playwright-snapshots.yml
├── .gitignore
├── .pre-commit-config.yaml
├── .pre-commit-hooks.yaml
├── .readthedocs.yml
├── CHANGELOG.md
├── LICENSE
├── README.md
├── binder/
│   ├── labconfig/
│   │   └── default_setting_overrides.json
│   ├── postBuild
│   └── requirements.txt
├── demo/
│   ├── Benchmarking Jupytext.py
│   ├── Jupytext's word cloud.py
│   ├── Tests in a notebook.md
│   ├── World population.Rmd
│   ├── World population.ipynb
│   ├── World population.lgt.py
│   ├── World population.md
│   ├── World population.myst.md
│   ├── World population.pandoc.md
│   ├── World population.pct.py
│   ├── World population.spx.py
│   ├── get_started.md
│   └── vscode/
│       ├── notebook.ipynb
│       └── notebook.py
├── docs/
│   ├── Makefile
│   ├── advanced-options.md
│   ├── changelog.md
│   ├── conf.py
│   ├── config.md
│   ├── contributing.md
│   ├── developing.md
│   ├── doc-requirements.txt
│   ├── faq.md
│   ├── formats-markdown.md
│   ├── formats-scripts.md
│   ├── index.md
│   ├── install.md
│   ├── jupyter-collaboration.md
│   ├── jupyterlab-extension.md
│   ├── languages.md
│   ├── make.bat
│   ├── paired-notebooks.md
│   ├── text-notebooks.md
│   ├── tutorials.md
│   ├── using-cli.md
│   ├── using-pre-commit.md
│   └── vs-code.md
├── jupyterlab/
│   ├── .gitignore
│   ├── .prettierignore
│   ├── .yarnrc.yml
│   ├── install.json
│   ├── jupyter-config/
│   │   ├── jupyter_notebook_config.d/
│   │   │   └── jupytext.json
│   │   └── jupyter_server_config.d/
│   │       └── jupytext.json
│   ├── jupyterlab_jupytext/
│   │   └── __init__.py
│   ├── lerna.json
│   ├── package.json
│   ├── packages/
│   │   └── jupyterlab-jupytext-extension/
│   │       ├── .gitignore
│   │       ├── CHANGELOG.md
│   │       ├── README.md
│   │       ├── package.json
│   │       ├── schema/
│   │       │   └── plugin.json
│   │       ├── src/
│   │       │   ├── commands.ts
│   │       │   ├── factory.ts
│   │       │   ├── index.ts
│   │       │   ├── registry.ts
│   │       │   ├── svg.d.ts
│   │       │   ├── tokens.ts
│   │       │   └── utils.ts
│   │       ├── style/
│   │       │   ├── base.css
│   │       │   ├── index.css
│   │       │   └── index.js
│   │       ├── tsconfig.json
│   │       └── ui-tests/
│   │           ├── README.md
│   │           ├── jupyter_server_test_config.py
│   │           ├── package.json
│   │           ├── playwright.config.js
│   │           └── tests/
│   │               ├── jupytext-launcher.spec.ts
│   │               ├── jupytext-menu.spec.ts
│   │               ├── jupytext-notebook.spec.ts
│   │               └── jupytext-settings.spec.ts
│   ├── scripts/
│   │   └── install_extension.py
│   └── tsconfig.eslint.json
├── pyproject.toml
├── src/
│   ├── jupytext/
│   │   ├── __init__.py
│   │   ├── __main__.py
│   │   ├── async_contentsmanager.py
│   │   ├── async_pairs.py
│   │   ├── cell_metadata.py
│   │   ├── cell_reader.py
│   │   ├── cell_to_text.py
│   │   ├── cli.py
│   │   ├── combine.py
│   │   ├── compare.py
│   │   ├── config.py
│   │   ├── doxygen.py
│   │   ├── formats.py
│   │   ├── header.py
│   │   ├── jupytext.py
│   │   ├── kernels.py
│   │   ├── languages.py
│   │   ├── magics.py
│   │   ├── marimo.py
│   │   ├── metadata_filter.py
│   │   ├── myst.py
│   │   ├── paired_paths.py
│   │   ├── pairs.py
│   │   ├── pandoc.py
│   │   ├── pep8.py
│   │   ├── quarto.py
│   │   ├── reraise.py
│   │   ├── stringparser.py
│   │   ├── sync_contentsmanager.py
│   │   ├── sync_pairs.py
│   │   └── version.py
│   └── jupytext_config/
│       ├── __init__.py
│       ├── __main__.py
│       ├── jupytext_config.py
│       └── labconfig.py
├── tests/
│   ├── conftest.py
│   ├── data/
│   │   └── notebooks/
│   │       ├── inputs/
│   │       │   ├── R/
│   │       │   │   └── simple_r_script.R
│   │       │   ├── R_spin/
│   │       │   │   └── knitr-spin.R
│   │       │   ├── Rmd/
│   │       │   │   ├── R_sample.Rmd
│   │       │   │   ├── chunk_options.Rmd
│   │       │   │   ├── ioslides.Rmd
│   │       │   │   ├── knitr-spin.Rmd
│   │       │   │   └── markdown.Rmd
│   │       │   ├── hydrogen/
│   │       │   │   └── hydrogen_latex_html_R_magics.py
│   │       │   ├── ipynb_R/
│   │       │   │   ├── R notebook with invalid cell keys.ipynb
│   │       │   │   └── ir_notebook.ipynb
│   │       │   ├── ipynb_bash/
│   │       │   │   └── sample_bash_notebook.ipynb
│   │       │   ├── ipynb_clojure/
│   │       │   │   └── html-demo.ipynb
│   │       │   ├── ipynb_coconut/
│   │       │   │   └── coconut_homepage_demo.ipynb
│   │       │   ├── ipynb_cpp/
│   │       │   │   ├── root_cpp.ipynb
│   │       │   │   └── xcpp_by_quantstack.ipynb
│   │       │   ├── ipynb_cs/
│   │       │   │   └── csharp.ipynb
│   │       │   ├── ipynb_fs/
│   │       │   │   └── fsharp.ipynb
│   │       │   ├── ipynb_gnuplot/
│   │       │   │   └── gnuplot_notebook.ipynb
│   │       │   ├── ipynb_go/
│   │       │   │   └── hello_world_gonb.ipynb
│   │       │   ├── ipynb_groovy/
│   │       │   │   └── tailrecursive-factorial.ipynb
│   │       │   ├── ipynb_haskell/
│   │       │   │   └── haskell_notebook.ipynb
│   │       │   ├── ipynb_idl/
│   │       │   │   └── demo_gdl_fbp.ipynb
│   │       │   ├── ipynb_java/
│   │       │   │   └── simple-helloworld.ipynb
│   │       │   ├── ipynb_js/
│   │       │   │   └── ijavascript.ipynb
│   │       │   ├── ipynb_julia/
│   │       │   │   ├── julia_benchmark_plotly_barchart.ipynb
│   │       │   │   └── julia_functional_geometry.ipynb
│   │       │   ├── ipynb_logtalk/
│   │       │   │   └── logtalk_notebook.ipynb
│   │       │   ├── ipynb_lua/
│   │       │   │   └── lua_example.ipynb
│   │       │   ├── ipynb_m/
│   │       │   │   └── octave_notebook.ipynb
│   │       │   ├── ipynb_maxima/
│   │       │   │   └── maxima_example.ipynb
│   │       │   ├── ipynb_ocaml/
│   │       │   │   └── ocaml_notebook.ipynb
│   │       │   ├── ipynb_ps1/
│   │       │   │   └── powershell.ipynb
│   │       │   ├── ipynb_py/
│   │       │   │   ├── Line_breaks_in_LateX_305.ipynb
│   │       │   │   ├── Notebook with function and cell metadata 164.ipynb
│   │       │   │   ├── Notebook with html and latex cells.ipynb
│   │       │   │   ├── Notebook with many hash signs.ipynb
│   │       │   │   ├── Notebook with metadata and long cells.ipynb
│   │       │   │   ├── Notebook_with_R_magic.ipynb
│   │       │   │   ├── Notebook_with_more_R_magic_111.ipynb
│   │       │   │   ├── The flavors of raw cells.ipynb
│   │       │   │   ├── cat_variable.ipynb
│   │       │   │   ├── convert_to_py_then_test_with_update83.ipynb
│   │       │   │   ├── frozen_cell.ipynb
│   │       │   │   ├── jupyter.ipynb
│   │       │   │   ├── jupyter_again.ipynb
│   │       │   │   ├── jupyter_with_raw_cell_in_body.ipynb
│   │       │   │   ├── jupyter_with_raw_cell_on_top.ipynb
│   │       │   │   ├── jupyter_with_raw_cell_with_invalid_yaml.ipynb
│   │       │   │   ├── jupyterlab-slideshow_1441.ipynb
│   │       │   │   ├── notebook_with_complex_metadata.ipynb
│   │       │   │   ├── nteract_with_parameter.ipynb
│   │       │   │   ├── plotly_graphs.ipynb
│   │       │   │   ├── raw_cell_with_complex_yaml_like_content.ipynb
│   │       │   │   ├── raw_cell_with_non_dict_yaml_content.ipynb
│   │       │   │   ├── sample_rise_notebook_66.ipynb
│   │       │   │   └── text_outputs_and_images.ipynb
│   │       │   ├── ipynb_q/
│   │       │   │   └── kalman_filter_and_visualization.ipynb
│   │       │   ├── ipynb_robot/
│   │       │   │   └── simple_robot_notebook.ipynb
│   │       │   ├── ipynb_rust/
│   │       │   │   └── evcxr_jupyter_tour.ipynb
│   │       │   ├── ipynb_sage/
│   │       │   │   └── sage_print_hello.ipynb
│   │       │   ├── ipynb_sas/
│   │       │   │   └── sas.ipynb
│   │       │   ├── ipynb_scala/
│   │       │   │   └── simple_scala_notebook.ipynb
│   │       │   ├── ipynb_scheme/
│   │       │   │   └── Reference Guide for Calysto Scheme.ipynb
│   │       │   ├── ipynb_sos/
│   │       │   │   └── jupytext_replication.ipynb
│   │       │   ├── ipynb_stata/
│   │       │   │   └── stata_notebook.ipynb
│   │       │   ├── ipynb_tcl/
│   │       │   │   └── tcl_test.ipynb
│   │       │   ├── ipynb_ts/
│   │       │   │   └── itypescript.ipynb
│   │       │   ├── ipynb_wolfram/
│   │       │   │   └── wolfram.ipynb
│   │       │   ├── ipynb_xonsh/
│   │       │   │   └── xonsh_example.ipynb
│   │       │   ├── julia/
│   │       │   │   └── julia_sample_script.jl
│   │       │   ├── marimo/
│   │       │   │   └── basic_marimo_example.py
│   │       │   ├── md/
│   │       │   │   ├── jupytext_markdown.md
│   │       │   │   └── plain_markdown.md
│   │       │   ├── myst/
│   │       │   │   ├── fenced_code_vs_code_cells.md
│   │       │   │   └── reference_link.md
│   │       │   ├── percent/
│   │       │   │   └── hydrogen.py
│   │       │   ├── ps1/
│   │       │   │   └── build.ps1
│   │       │   ├── python/
│   │       │   │   ├── light_sample.py
│   │       │   │   └── python_notebook_sample.py
│   │       │   └── sphinx/
│   │       │       └── plot_notebook.py
│   │       └── outputs/
│   │           ├── Rmd_to_ipynb/
│   │           │   ├── R_sample.ipynb
│   │           │   ├── chunk_options.ipynb
│   │           │   ├── ioslides.ipynb
│   │           │   ├── knitr-spin.ipynb
│   │           │   └── markdown.ipynb
│   │           ├── ipynb_to_Rmd/
│   │           │   ├── Line_breaks_in_LateX_305.Rmd
│   │           │   ├── Notebook with function and cell metadata 164.Rmd
│   │           │   ├── Notebook with html and latex cells.Rmd
│   │           │   ├── Notebook with many hash signs.Rmd
│   │           │   ├── Notebook with metadata and long cells.Rmd
│   │           │   ├── Notebook_with_R_magic.Rmd
│   │           │   ├── Notebook_with_more_R_magic_111.Rmd
│   │           │   ├── R notebook with invalid cell keys.Rmd
│   │           │   ├── Reference Guide for Calysto Scheme.Rmd
│   │           │   ├── The flavors of raw cells.Rmd
│   │           │   ├── cat_variable.Rmd
│   │           │   ├── coconut_homepage_demo.Rmd
│   │           │   ├── convert_to_py_then_test_with_update83.Rmd
│   │           │   ├── csharp.Rmd
│   │           │   ├── demo_gdl_fbp.Rmd
│   │           │   ├── evcxr_jupyter_tour.Rmd
│   │           │   ├── frozen_cell.Rmd
│   │           │   ├── fsharp.Rmd
│   │           │   ├── gnuplot_notebook.Rmd
│   │           │   ├── haskell_notebook.Rmd
│   │           │   ├── hello_world_gonb.Rmd
│   │           │   ├── html-demo.Rmd
│   │           │   ├── ijavascript.Rmd
│   │           │   ├── ir_notebook.Rmd
│   │           │   ├── itypescript.Rmd
│   │           │   ├── julia_benchmark_plotly_barchart.Rmd
│   │           │   ├── julia_functional_geometry.Rmd
│   │           │   ├── jupyter.Rmd
│   │           │   ├── jupyter_again.Rmd
│   │           │   ├── jupyter_with_raw_cell_in_body.Rmd
│   │           │   ├── jupyter_with_raw_cell_on_top.Rmd
│   │           │   ├── jupyter_with_raw_cell_with_invalid_yaml.Rmd
│   │           │   ├── jupyterlab-slideshow_1441.Rmd
│   │           │   ├── jupytext_replication.Rmd
│   │           │   ├── kalman_filter_and_visualization.Rmd
│   │           │   ├── logtalk_notebook.Rmd
│   │           │   ├── lua_example.Rmd
│   │           │   ├── maxima_example.Rmd
│   │           │   ├── notebook_with_complex_metadata.Rmd
│   │           │   ├── nteract_with_parameter.Rmd
│   │           │   ├── ocaml_notebook.Rmd
│   │           │   ├── octave_notebook.Rmd
│   │           │   ├── plotly_graphs.Rmd
│   │           │   ├── powershell.Rmd
│   │           │   ├── raw_cell_with_complex_yaml_like_content.Rmd
│   │           │   ├── raw_cell_with_non_dict_yaml_content.Rmd
│   │           │   ├── root_cpp.Rmd
│   │           │   ├── sage_print_hello.Rmd
│   │           │   ├── sample_bash_notebook.Rmd
│   │           │   ├── sample_rise_notebook_66.Rmd
│   │           │   ├── sas.Rmd
│   │           │   ├── simple-helloworld.Rmd
│   │           │   ├── simple_robot_notebook.Rmd
│   │           │   ├── simple_scala_notebook.Rmd
│   │           │   ├── stata_notebook.Rmd
│   │           │   ├── tailrecursive-factorial.Rmd
│   │           │   ├── tcl_test.Rmd
│   │           │   ├── text_outputs_and_images.Rmd
│   │           │   ├── wolfram.Rmd
│   │           │   ├── xcpp_by_quantstack.Rmd
│   │           │   └── xonsh_example.Rmd
│   │           ├── ipynb_to_hydrogen/
│   │           │   ├── Line_breaks_in_LateX_305.py
│   │           │   ├── Notebook with function and cell metadata 164.py
│   │           │   ├── Notebook with html and latex cells.py
│   │           │   ├── Notebook with many hash signs.py
│   │           │   ├── Notebook with metadata and long cells.py
│   │           │   ├── Notebook_with_R_magic.py
│   │           │   ├── Notebook_with_more_R_magic_111.py
│   │           │   ├── R notebook with invalid cell keys.R
│   │           │   ├── Reference Guide for Calysto Scheme.ss
│   │           │   ├── The flavors of raw cells.py
│   │           │   ├── cat_variable.py
│   │           │   ├── coconut_homepage_demo.coco
│   │           │   ├── convert_to_py_then_test_with_update83.py
│   │           │   ├── csharp.cs
│   │           │   ├── demo_gdl_fbp.pro
│   │           │   ├── evcxr_jupyter_tour.rs
│   │           │   ├── frozen_cell.py
│   │           │   ├── fsharp.fsx
│   │           │   ├── gnuplot_notebook.gp
│   │           │   ├── haskell_notebook.hs
│   │           │   ├── hello_world_gonb.go
│   │           │   ├── html-demo.clj
│   │           │   ├── ijavascript.js
│   │           │   ├── ir_notebook.R
│   │           │   ├── itypescript.ts
│   │           │   ├── julia_benchmark_plotly_barchart.jl
│   │           │   ├── julia_functional_geometry.jl
│   │           │   ├── jupyter.py
│   │           │   ├── jupyter_again.py
│   │           │   ├── jupyter_with_raw_cell_in_body.py
│   │           │   ├── jupyter_with_raw_cell_on_top.py
│   │           │   ├── jupyter_with_raw_cell_with_invalid_yaml.py
│   │           │   ├── jupyterlab-slideshow_1441.py
│   │           │   ├── jupytext_replication.sos
│   │           │   ├── kalman_filter_and_visualization.q
│   │           │   ├── logtalk_notebook.lgt
│   │           │   ├── lua_example.lua
│   │           │   ├── maxima_example.mac
│   │           │   ├── notebook_with_complex_metadata.py
│   │           │   ├── nteract_with_parameter.py
│   │           │   ├── ocaml_notebook.ml
│   │           │   ├── octave_notebook.m
│   │           │   ├── plotly_graphs.py
│   │           │   ├── powershell.ps1
│   │           │   ├── raw_cell_with_complex_yaml_like_content.py
│   │           │   ├── raw_cell_with_non_dict_yaml_content.py
│   │           │   ├── root_cpp.cpp
│   │           │   ├── sage_print_hello.sage
│   │           │   ├── sample_bash_notebook.sh
│   │           │   ├── sample_rise_notebook_66.py
│   │           │   ├── sas.sas
│   │           │   ├── simple-helloworld.java
│   │           │   ├── simple_robot_notebook.robot
│   │           │   ├── simple_scala_notebook.scala
│   │           │   ├── stata_notebook.do
│   │           │   ├── tailrecursive-factorial.groovy
│   │           │   ├── tcl_test.tcl
│   │           │   ├── text_outputs_and_images.py
│   │           │   ├── wolfram.wolfram
│   │           │   ├── xcpp_by_quantstack.cpp
│   │           │   └── xonsh_example.xsh
│   │           ├── ipynb_to_marimo/
│   │           │   ├── Line_breaks_in_LateX_305.py
│   │           │   ├── Notebook with function and cell metadata 164.py
│   │           │   ├── Notebook with many hash signs.py
│   │           │   ├── cat_variable.py
│   │           │   ├── frozen_cell.py
│   │           │   ├── jupyter.py
│   │           │   ├── notebook_with_complex_metadata.py
│   │           │   ├── plotly_graphs.py
│   │           │   ├── sample_rise_notebook_66.py
│   │           │   └── text_outputs_and_images.py
│   │           ├── ipynb_to_md/
│   │           │   ├── Line_breaks_in_LateX_305.md
│   │           │   ├── Notebook with function and cell metadata 164.md
│   │           │   ├── Notebook with html and latex cells.md
│   │           │   ├── Notebook with many hash signs.md
│   │           │   ├── Notebook with metadata and long cells.md
│   │           │   ├── Notebook_with_R_magic.md
│   │           │   ├── Notebook_with_more_R_magic_111.md
│   │           │   ├── R notebook with invalid cell keys.md
│   │           │   ├── Reference Guide for Calysto Scheme.md
│   │           │   ├── The flavors of raw cells.md
│   │           │   ├── cat_variable.md
│   │           │   ├── coconut_homepage_demo.md
│   │           │   ├── convert_to_py_then_test_with_update83.md
│   │           │   ├── csharp.md
│   │           │   ├── demo_gdl_fbp.md
│   │           │   ├── evcxr_jupyter_tour.md
│   │           │   ├── frozen_cell.md
│   │           │   ├── fsharp.md
│   │           │   ├── gnuplot_notebook.md
│   │           │   ├── haskell_notebook.md
│   │           │   ├── hello_world_gonb.md
│   │           │   ├── html-demo.md
│   │           │   ├── ijavascript.md
│   │           │   ├── ir_notebook.md
│   │           │   ├── itypescript.md
│   │           │   ├── julia_benchmark_plotly_barchart.md
│   │           │   ├── julia_functional_geometry.md
│   │           │   ├── jupyter.md
│   │           │   ├── jupyter_again.md
│   │           │   ├── jupyter_with_raw_cell_in_body.md
│   │           │   ├── jupyter_with_raw_cell_on_top.md
│   │           │   ├── jupyter_with_raw_cell_with_invalid_yaml.md
│   │           │   ├── jupyterlab-slideshow_1441.md
│   │           │   ├── jupytext_replication.md
│   │           │   ├── kalman_filter_and_visualization.md
│   │           │   ├── logtalk_notebook.md
│   │           │   ├── lua_example.md
│   │           │   ├── maxima_example.md
│   │           │   ├── notebook_with_complex_metadata.md
│   │           │   ├── nteract_with_parameter.md
│   │           │   ├── ocaml_notebook.md
│   │           │   ├── octave_notebook.md
│   │           │   ├── plotly_graphs.md
│   │           │   ├── powershell.md
│   │           │   ├── raw_cell_with_complex_yaml_like_content.md
│   │           │   ├── raw_cell_with_non_dict_yaml_content.md
│   │           │   ├── root_cpp.md
│   │           │   ├── sage_print_hello.md
│   │           │   ├── sample_bash_notebook.md
│   │           │   ├── sample_rise_notebook_66.md
│   │           │   ├── sas.md
│   │           │   ├── simple-helloworld.md
│   │           │   ├── simple_robot_notebook.md
│   │           │   ├── simple_scala_notebook.md
│   │           │   ├── stata_notebook.md
│   │           │   ├── tailrecursive-factorial.md
│   │           │   ├── tcl_test.md
│   │           │   ├── text_outputs_and_images.md
│   │           │   ├── wolfram.md
│   │           │   ├── xcpp_by_quantstack.md
│   │           │   └── xonsh_example.md
│   │           ├── ipynb_to_myst/
│   │           │   ├── Line_breaks_in_LateX_305.md
│   │           │   ├── Notebook with function and cell metadata 164.md
│   │           │   ├── Notebook with html and latex cells.md
│   │           │   ├── Notebook with many hash signs.md
│   │           │   ├── Notebook with metadata and long cells.md
│   │           │   ├── Notebook_with_R_magic.md
│   │           │   ├── Notebook_with_more_R_magic_111.md
│   │           │   ├── R notebook with invalid cell keys.md
│   │           │   ├── Reference Guide for Calysto Scheme.md
│   │           │   ├── The flavors of raw cells.md
│   │           │   ├── cat_variable.md
│   │           │   ├── coconut_homepage_demo.md
│   │           │   ├── convert_to_py_then_test_with_update83.md
│   │           │   ├── csharp.md
│   │           │   ├── demo_gdl_fbp.md
│   │           │   ├── evcxr_jupyter_tour.md
│   │           │   ├── frozen_cell.md
│   │           │   ├── fsharp.md
│   │           │   ├── gnuplot_notebook.md
│   │           │   ├── haskell_notebook.md
│   │           │   ├── hello_world_gonb.md
│   │           │   ├── ijavascript.md
│   │           │   ├── ir_notebook.md
│   │           │   ├── itypescript.md
│   │           │   ├── julia_benchmark_plotly_barchart.md
│   │           │   ├── jupyter.md
│   │           │   ├── jupyter_again.md
│   │           │   ├── jupyter_with_raw_cell_in_body.md
│   │           │   ├── jupyter_with_raw_cell_on_top.md
│   │           │   ├── jupyter_with_raw_cell_with_invalid_yaml.md
│   │           │   ├── jupyterlab-slideshow_1441.md
│   │           │   ├── jupytext_replication.md
│   │           │   ├── kalman_filter_and_visualization.md
│   │           │   ├── logtalk_notebook.md
│   │           │   ├── lua_example.md
│   │           │   ├── maxima_example.md
│   │           │   ├── notebook_with_complex_metadata.md
│   │           │   ├── nteract_with_parameter.md
│   │           │   ├── ocaml_notebook.md
│   │           │   ├── octave_notebook.md
│   │           │   ├── plotly_graphs.md
│   │           │   ├── powershell.md
│   │           │   ├── raw_cell_with_complex_yaml_like_content.md
│   │           │   ├── raw_cell_with_non_dict_yaml_content.md
│   │           │   ├── root_cpp.md
│   │           │   ├── sage_print_hello.md
│   │           │   ├── sample_bash_notebook.md
│   │           │   ├── sample_rise_notebook_66.md
│   │           │   ├── sas.md
│   │           │   ├── simple-helloworld.md
│   │           │   ├── simple_robot_notebook.md
│   │           │   ├── simple_scala_notebook.md
│   │           │   ├── stata_notebook.md
│   │           │   ├── tailrecursive-factorial.md
│   │           │   ├── tcl_test.md
│   │           │   ├── text_outputs_and_images.md
│   │           │   ├── wolfram.md
│   │           │   └── xonsh_example.md
│   │           ├── ipynb_to_pandoc/
│   │           │   ├── Notebook_with_R_magic.md
│   │           │   ├── Notebook_with_more_R_magic_111.md
│   │           │   ├── cat_variable.md
│   │           │   ├── convert_to_py_then_test_with_update83.md
│   │           │   ├── frozen_cell.md
│   │           │   ├── ir_notebook.md
│   │           │   ├── julia_benchmark_plotly_barchart.md
│   │           │   ├── jupyter.md
│   │           │   ├── jupyter_again.md
│   │           │   ├── jupyter_with_raw_cell_in_body.md
│   │           │   ├── jupyter_with_raw_cell_on_top.md
│   │           │   ├── notebook_with_complex_metadata.md
│   │           │   ├── nteract_with_parameter.md
│   │           │   ├── plotly_graphs.md
│   │           │   ├── raw_cell_with_complex_yaml_like_content.md
│   │           │   ├── raw_cell_with_non_dict_yaml_content.md
│   │           │   ├── sample_rise_notebook_66.md
│   │           │   └── text_outputs_and_images.md
│   │           ├── ipynb_to_percent/
│   │           │   ├── Line_breaks_in_LateX_305.py
│   │           │   ├── Notebook with function and cell metadata 164.py
│   │           │   ├── Notebook with html and latex cells.py
│   │           │   ├── Notebook with many hash signs.py
│   │           │   ├── Notebook with metadata and long cells.py
│   │           │   ├── Notebook_with_R_magic.py
│   │           │   ├── Notebook_with_more_R_magic_111.py
│   │           │   ├── R notebook with invalid cell keys.R
│   │           │   ├── R notebook with invalid cell keys.low.r
│   │           │   ├── Reference Guide for Calysto Scheme.scm
│   │           │   ├── Reference Guide for Calysto Scheme.ss
│   │           │   ├── The flavors of raw cells.py
│   │           │   ├── cat_variable.py
│   │           │   ├── coconut_homepage_demo.coco
│   │           │   ├── convert_to_py_then_test_with_update83.py
│   │           │   ├── csharp.cs
│   │           │   ├── demo_gdl_fbp.pro
│   │           │   ├── evcxr_jupyter_tour.rs
│   │           │   ├── frozen_cell.py
│   │           │   ├── fsharp.fsx
│   │           │   ├── gnuplot_notebook.gp
│   │           │   ├── haskell_notebook.hs
│   │           │   ├── hello_world_gonb.go
│   │           │   ├── html-demo.clj
│   │           │   ├── ijavascript.js
│   │           │   ├── ir_notebook.R
│   │           │   ├── ir_notebook.low.r
│   │           │   ├── itypescript.ts
│   │           │   ├── julia_benchmark_plotly_barchart.jl
│   │           │   ├── julia_functional_geometry.jl
│   │           │   ├── jupyter.py
│   │           │   ├── jupyter_again.py
│   │           │   ├── jupyter_with_raw_cell_in_body.py
│   │           │   ├── jupyter_with_raw_cell_on_top.py
│   │           │   ├── jupyter_with_raw_cell_with_invalid_yaml.py
│   │           │   ├── jupyterlab-slideshow_1441.py
│   │           │   ├── jupytext_replication.sos
│   │           │   ├── kalman_filter_and_visualization.q
│   │           │   ├── logtalk_notebook.lgt
│   │           │   ├── lua_example.lua
│   │           │   ├── maxima_example.mac
│   │           │   ├── notebook_with_complex_metadata.py
│   │           │   ├── nteract_with_parameter.py
│   │           │   ├── ocaml_notebook.ml
│   │           │   ├── octave_notebook.m
│   │           │   ├── plotly_graphs.py
│   │           │   ├── powershell.ps1
│   │           │   ├── raw_cell_with_complex_yaml_like_content.py
│   │           │   ├── raw_cell_with_non_dict_yaml_content.py
│   │           │   ├── root_cpp.cpp
│   │           │   ├── sage_print_hello.sage
│   │           │   ├── sample_bash_notebook.sh
│   │           │   ├── sample_rise_notebook_66.py
│   │           │   ├── sas.sas
│   │           │   ├── simple-helloworld.java
│   │           │   ├── simple_robot_notebook.robot
│   │           │   ├── simple_scala_notebook.scala
│   │           │   ├── stata_notebook.do
│   │           │   ├── tailrecursive-factorial.groovy
│   │           │   ├── tcl_test.tcl
│   │           │   ├── text_outputs_and_images.py
│   │           │   ├── wolfram.wolfram
│   │           │   ├── xcpp_by_quantstack.cpp
│   │           │   └── xonsh_example.xsh
│   │           ├── ipynb_to_quarto/
│   │           │   ├── Notebook_with_more_R_magic_111.qmd
│   │           │   ├── cat_variable.qmd
│   │           │   ├── frozen_cell.qmd
│   │           │   └── julia_benchmark_plotly_barchart.qmd
│   │           ├── ipynb_to_script/
│   │           │   ├── Line_breaks_in_LateX_305.py
│   │           │   ├── Notebook with function and cell metadata 164.py
│   │           │   ├── Notebook with html and latex cells.py
│   │           │   ├── Notebook with metadata and long cells.py
│   │           │   ├── Notebook_with_R_magic.py
│   │           │   ├── Notebook_with_more_R_magic_111.py
│   │           │   ├── R notebook with invalid cell keys.R
│   │           │   ├── R notebook with invalid cell keys.low.r
│   │           │   ├── Reference Guide for Calysto Scheme.scm
│   │           │   ├── Reference Guide for Calysto Scheme.ss
│   │           │   ├── The flavors of raw cells.py
│   │           │   ├── cat_variable.py
│   │           │   ├── coconut_homepage_demo.coco
│   │           │   ├── convert_to_py_then_test_with_update83.py
│   │           │   ├── csharp.cs
│   │           │   ├── demo_gdl_fbp.pro
│   │           │   ├── evcxr_jupyter_tour.rs
│   │           │   ├── frozen_cell.py
│   │           │   ├── fsharp.fsx
│   │           │   ├── gnuplot_notebook.gp
│   │           │   ├── haskell_notebook.hs
│   │           │   ├── hello_world_gonb.go
│   │           │   ├── html-demo.clj
│   │           │   ├── ijavascript.js
│   │           │   ├── ir_notebook.R
│   │           │   ├── ir_notebook.low.r
│   │           │   ├── itypescript.ts
│   │           │   ├── julia_benchmark_plotly_barchart.jl
│   │           │   ├── julia_functional_geometry.jl
│   │           │   ├── jupyter.py
│   │           │   ├── jupyter_again.py
│   │           │   ├── jupyter_with_raw_cell_in_body.py
│   │           │   ├── jupyter_with_raw_cell_on_top.py
│   │           │   ├── jupyter_with_raw_cell_with_invalid_yaml.py
│   │           │   ├── jupyterlab-slideshow_1441.py
│   │           │   ├── jupytext_replication.sos
│   │           │   ├── kalman_filter_and_visualization.q
│   │           │   ├── logtalk_notebook.lgt
│   │           │   ├── lua_example.lua
│   │           │   ├── maxima_example.mac
│   │           │   ├── notebook_with_complex_metadata.py
│   │           │   ├── nteract_with_parameter.py
│   │           │   ├── ocaml_notebook.ml
│   │           │   ├── octave_notebook.m
│   │           │   ├── plotly_graphs.py
│   │           │   ├── powershell.ps1
│   │           │   ├── raw_cell_with_complex_yaml_like_content.py
│   │           │   ├── raw_cell_with_non_dict_yaml_content.py
│   │           │   ├── root_cpp.cpp
│   │           │   ├── sage_print_hello.sage
│   │           │   ├── sample_bash_notebook.sh
│   │           │   ├── sample_rise_notebook_66.py
│   │           │   ├── sas.sas
│   │           │   ├── simple-helloworld.java
│   │           │   ├── simple_robot_notebook.robot
│   │           │   ├── simple_scala_notebook.scala
│   │           │   ├── stata_notebook.do
│   │           │   ├── tailrecursive-factorial.groovy
│   │           │   ├── tcl_test.tcl
│   │           │   ├── text_outputs_and_images.py
│   │           │   ├── wolfram.wolfram
│   │           │   ├── xcpp_by_quantstack.cpp
│   │           │   └── xonsh_example.xsh
│   │           ├── ipynb_to_script_vim_folding_markers/
│   │           │   ├── Line_breaks_in_LateX_305.py
│   │           │   ├── Notebook with function and cell metadata 164.py
│   │           │   ├── Notebook with html and latex cells.py
│   │           │   ├── Notebook with many hash signs.py
│   │           │   ├── Notebook with metadata and long cells.py
│   │           │   ├── Notebook_with_R_magic.py
│   │           │   ├── Notebook_with_more_R_magic_111.py
│   │           │   ├── The flavors of raw cells.py
│   │           │   ├── cat_variable.py
│   │           │   ├── convert_to_py_then_test_with_update83.py
│   │           │   ├── frozen_cell.py
│   │           │   ├── jupyter.py
│   │           │   ├── jupyter_again.py
│   │           │   ├── jupyter_with_raw_cell_in_body.py
│   │           │   ├── jupyter_with_raw_cell_on_top.py
│   │           │   ├── jupyter_with_raw_cell_with_invalid_yaml.py
│   │           │   ├── jupyterlab-slideshow_1441.py
│   │           │   ├── notebook_with_complex_metadata.py
│   │           │   ├── nteract_with_parameter.py
│   │           │   ├── plotly_graphs.py
│   │           │   ├── raw_cell_with_complex_yaml_like_content.py
│   │           │   ├── raw_cell_with_non_dict_yaml_content.py
│   │           │   ├── sample_rise_notebook_66.py
│   │           │   └── text_outputs_and_images.py
│   │           ├── ipynb_to_script_vscode_folding_markers/
│   │           │   ├── Line_breaks_in_LateX_305.py
│   │           │   ├── Notebook with function and cell metadata 164.py
│   │           │   ├── Notebook with html and latex cells.py
│   │           │   ├── Notebook with many hash signs.py
│   │           │   ├── Notebook with metadata and long cells.py
│   │           │   ├── Notebook_with_R_magic.py
│   │           │   ├── Notebook_with_more_R_magic_111.py
│   │           │   ├── The flavors of raw cells.py
│   │           │   ├── cat_variable.py
│   │           │   ├── convert_to_py_then_test_with_update83.py
│   │           │   ├── frozen_cell.py
│   │           │   ├── jupyter.py
│   │           │   ├── jupyter_again.py
│   │           │   ├── jupyter_with_raw_cell_in_body.py
│   │           │   ├── jupyter_with_raw_cell_on_top.py
│   │           │   ├── jupyter_with_raw_cell_with_invalid_yaml.py
│   │           │   ├── jupyterlab-slideshow_1441.py
│   │           │   ├── notebook_with_complex_metadata.py
│   │           │   ├── nteract_with_parameter.py
│   │           │   ├── plotly_graphs.py
│   │           │   ├── raw_cell_with_complex_yaml_like_content.py
│   │           │   ├── raw_cell_with_non_dict_yaml_content.py
│   │           │   ├── sample_rise_notebook_66.py
│   │           │   └── text_outputs_and_images.py
│   │           ├── ipynb_to_sphinx/
│   │           │   ├── Line_breaks_in_LateX_305.py
│   │           │   ├── cat_variable.py
│   │           │   ├── convert_to_py_then_test_with_update83.py
│   │           │   ├── jupyter.py
│   │           │   ├── jupyter_again.py
│   │           │   ├── jupyterlab-slideshow_1441.py
│   │           │   ├── notebook_with_complex_metadata.py
│   │           │   ├── nteract_with_parameter.py
│   │           │   ├── plotly_graphs.py
│   │           │   ├── sample_rise_notebook_66.py
│   │           │   └── text_outputs_and_images.py
│   │           ├── ipynb_to_spin/
│   │           │   ├── R notebook with invalid cell keys.R
│   │           │   ├── R notebook with invalid cell keys.low.r
│   │           │   ├── ir_notebook.R
│   │           │   └── ir_notebook.low.r
│   │           ├── md_to_ipynb/
│   │           │   ├── jupytext_markdown.ipynb
│   │           │   └── plain_markdown.ipynb
│   │           ├── myst_to_ipynb/
│   │           │   ├── fenced_code_vs_code_cells.ipynb
│   │           │   └── reference_link.ipynb
│   │           ├── script_to_ipynb/
│   │           │   ├── basic_marimo_example.ipynb
│   │           │   ├── build.ipynb
│   │           │   ├── hydrogen.ipynb
│   │           │   ├── hydrogen_latex_html_R_magics.ipynb
│   │           │   ├── julia_sample_script.ipynb
│   │           │   ├── knitr-spin.ipynb
│   │           │   ├── light_sample.ipynb
│   │           │   ├── python_notebook_sample.ipynb
│   │           │   └── simple_r_script.ipynb
│   │           ├── sphinx-rst2md_to_ipynb/
│   │           │   └── plot_notebook.ipynb
│   │           └── sphinx_to_ipynb/
│   │               └── plot_notebook.ipynb
│   ├── external/
│   │   ├── cli/
│   │   │   ├── test_black.py
│   │   │   ├── test_cli_check.py
│   │   │   └── test_isort.py
│   │   ├── conftest.py
│   │   ├── contents_manager/
│   │   │   └── test_contentsmanager_external.py
│   │   ├── docs/
│   │   │   └── test_using_cli.py
│   │   ├── jupyter_fs/
│   │   │   └── test_jupyter_fs.py
│   │   ├── pre_commit/
│   │   │   ├── test_pre_commit_0_ipynb_to_py.py
│   │   │   ├── test_pre_commit_1_sync.py
│   │   │   ├── test_pre_commit_1_sync_with_config.py
│   │   │   ├── test_pre_commit_1_sync_with_no_config.py
│   │   │   ├── test_pre_commit_2_sync_nbstripout.py
│   │   │   ├── test_pre_commit_3_sync_black_nbstripout.py
│   │   │   ├── test_pre_commit_4_sync_execute.py
│   │   │   ├── test_pre_commit_5_reformat_markdown.py
│   │   │   ├── test_pre_commit_mode.py
│   │   │   └── test_pre_commit_scripts.py
│   │   ├── round_trip/
│   │   │   └── test_mirror_external.py
│   │   ├── rst2md/
│   │   │   └── test_rst2md.py
│   │   ├── simple_external_notebooks/
│   │   │   ├── test_read_simple_pandoc.py
│   │   │   └── test_read_simple_quarto.py
│   │   └── test_marimo.py
│   ├── functional/
│   │   ├── cli/
│   │   │   ├── test_cli.py
│   │   │   ├── test_cli_config.py
│   │   │   ├── test_source_is_newer.py
│   │   │   └── test_synchronous_changes.py
│   │   ├── config/
│   │   │   └── test_config.py
│   │   ├── contents_manager/
│   │   │   └── test_async_and_sync_contents_manager_are_in_sync.py
│   │   ├── docs/
│   │   │   ├── test_changelog.py
│   │   │   └── test_doc_files_are_notebooks.py
│   │   ├── metadata/
│   │   │   ├── test_metadata_filter.py
│   │   │   └── test_metadata_filters_from_config.py
│   │   ├── others/
│   │   │   ├── invalid_file_896.md
│   │   │   ├── test_active_cells.py
│   │   │   ├── test_auto_ext.py
│   │   │   ├── test_cell_markers.py
│   │   │   ├── test_cell_metadata.py
│   │   │   ├── test_cell_tags_are_preserved.py
│   │   │   ├── test_cells.py
│   │   │   ├── test_combine.py
│   │   │   ├── test_custom_cell_magics.py
│   │   │   ├── test_doxygen.py
│   │   │   ├── test_hide_remove_input_outputs_rmarkdown.py
│   │   │   ├── test_invalid_file.py
│   │   │   ├── test_jupytext_errors.py
│   │   │   ├── test_jupytext_read.py
│   │   │   ├── test_nbformat_version.py
│   │   │   ├── test_preserve_empty_cells.py
│   │   │   ├── test_pytest.py
│   │   │   ├── test_raw_strings.py
│   │   │   ├── test_read_write_functions.py
│   │   │   ├── test_remove_encoding.py
│   │   │   ├── test_sample_notebooks_are_normalized.py
│   │   │   ├── test_save_multiple.py
│   │   │   ├── test_trust_notebook.py
│   │   │   ├── test_unicode.py
│   │   │   └── test_write_does_not_modify_notebook.py
│   │   ├── round_trip/
│   │   │   ├── test_jupytext_nbconvert_round_trip.py
│   │   │   ├── test_mirror.py
│   │   │   ├── test_myst_header.py
│   │   │   ├── test_read_all_py.py
│   │   │   └── test_rmd_to_ipynb.py
│   │   └── simple_notebooks/
│   │       ├── test_ipynb_to_R.py
│   │       ├── test_ipynb_to_myst.py
│   │       ├── test_ipynb_to_py.py
│   │       ├── test_ipynb_to_rmd.py
│   │       ├── test_knitr_spin.py
│   │       ├── test_read_dotnet_try_markdown.py
│   │       ├── test_read_empty_text_notebook.py
│   │       ├── test_read_folding_markers.py
│   │       ├── test_read_incomplete_rmd.py
│   │       ├── test_read_simple_R.py
│   │       ├── test_read_simple_clojure.py
│   │       ├── test_read_simple_csharp.py
│   │       ├── test_read_simple_go.py
│   │       ├── test_read_simple_groovy.py
│   │       ├── test_read_simple_hydrogen.py
│   │       ├── test_read_simple_ipynb.py
│   │       ├── test_read_simple_java.py
│   │       ├── test_read_simple_julia.py
│   │       ├── test_read_simple_markdown.py
│   │       ├── test_read_simple_matlab.py
│   │       ├── test_read_simple_nomarker.py
│   │       ├── test_read_simple_ocaml.py
│   │       ├── test_read_simple_percent.py
│   │       ├── test_read_simple_python.py
│   │       ├── test_read_simple_rmd.py
│   │       ├── test_read_simple_rust.py
│   │       ├── test_read_simple_scheme.py
│   │       └── test_read_simple_sphinx.py
│   ├── integration/
│   │   ├── cli/
│   │   │   ├── test_cli_pipe.py
│   │   │   └── test_execute.py
│   │   ├── contents_manager/
│   │   │   ├── test_cm_config.py
│   │   │   ├── test_contentsmanager.py
│   │   │   └── test_load_multiple.py
│   │   └── jupytext_config/
│   │       └── test_jupytext_config.py
│   └── unit/
│       ├── test_cell_id.py
│       ├── test_compare.py
│       ├── test_escape_magics.py
│       ├── test_formats.py
│       ├── test_header.py
│       ├── test_labconfig.py
│       ├── test_markdown_in_code_cells.py
│       ├── test_paired_paths.py
│       ├── test_pep8.py
│       └── test_stringparser.py
└── tools/
    └── absolute_links_in_readme.py
Download .txt
SYMBOL INDEX (1385 symbols across 182 files)

FILE: demo/Benchmarking Jupytext.py
  function sample_perf (line 43) | def sample_perf(nb, n=30):
  function performance_plot (line 69) | def performance_plot(perf, title):

FILE: jupyterlab/jupyterlab_jupytext/__init__.py
  function load_jupyter_server_extension (line 20) | def load_jupyter_server_extension(app):  # pragma: no cover
  function _jupyter_labextension_paths (line 74) | def _jupyter_labextension_paths():

FILE: jupyterlab/packages/jupyterlab-jupytext-extension/src/commands.ts
  function getWidgetJupytextFormats (line 18) | function getWidgetJupytextFormats(
  function getNotebookFileExtension (line 38) | function getNotebookFileExtension(notebookTracker: INotebookTracker): st...
  function getSelectedFormats (line 56) | function getSelectedFormats(notebookTracker: INotebookTracker): Array<st...
  function isPairCommandToggled (line 115) | function isPairCommandToggled(
  function isPairCommandEnabled (line 140) | function isPairCommandEnabled(
  function executePairCommand (line 167) | function executePairCommand(
  function isMetadataCommandToggled (line 276) | function isMetadataCommandToggled(
  function isMetadataCommandEnabled (line 302) | function isMetadataCommandEnabled(
  function executeMetadataCommand (line 332) | function executeMetadataCommand(

FILE: jupyterlab/packages/jupyterlab-jupytext-extension/src/factory.ts
  function createFactory (line 28) | function createFactory(

FILE: jupyterlab/packages/jupyterlab-jupytext-extension/src/registry.ts
  function registerFileTypes (line 9) | function registerFileTypes(

FILE: jupyterlab/packages/jupyterlab-jupytext-extension/src/tokens.ts
  constant JUPYTEXT_EXTENSION_ID (line 10) | const JUPYTEXT_EXTENSION_ID = 'jupyterlab-jupytext:plugin';
  constant FACTORY (line 15) | const FACTORY = 'Jupytext Notebook';
  constant LANGUAGE_INDEPENDENT_NOTEBOOK_EXTENSIONS (line 20) | const LANGUAGE_INDEPENDENT_NOTEBOOK_EXTENSIONS = [
  constant FILE_TYPES (line 30) | const FILE_TYPES = [
  constant SERVER_SETTINGS (line 66) | const SERVER_SETTINGS = ServerConnection.makeSettings();
  constant JUPYTEXT_PAIR_COMMANDS_FILETYPE_DATA (line 71) | const JUPYTEXT_PAIR_COMMANDS_FILETYPE_DATA = new Map<
  constant AUTO_LANGUAGE_FILETYPE_DATA (line 205) | const AUTO_LANGUAGE_FILETYPE_DATA = new Map<string, IFileTypeData[]>([
  constant JUPYTEXT_CREATE_TEXT_NOTEBOOK_FILETYPE_DATA (line 250) | const JUPYTEXT_CREATE_TEXT_NOTEBOOK_FILETYPE_DATA = new Map<
  constant JUPYTEXT_FORMATS (line 351) | const JUPYTEXT_FORMATS = Array.from(
  constant TEXT_NOTEBOOKS_LAUNCHER_ICONS (line 364) | const TEXT_NOTEBOOKS_LAUNCHER_ICONS = JUPYTEXT_FORMATS.filter(
  type IFileTypeData (line 375) | interface IFileTypeData {
  type IJupytextRepresentation (line 389) | interface IJupytextRepresentation {
  type IJupytextSection (line 397) | interface IJupytextSection {

FILE: jupyterlab/packages/jupyterlab-jupytext-extension/src/utils.ts
  function getKernelIconBase64String (line 32) | async function getKernelIconBase64String(
  function base64ToSvgStr (line 48) | function base64ToSvgStr(width: number, imageBase64: string): string {
  function getKernelIcon (line 60) | async function getKernelIcon(
  function getAvailableKernelLanguages (line 107) | async function getAvailableKernelLanguages(
  function getAvailableCreateTextNotebookCommands (line 158) | async function getAvailableCreateTextNotebookCommands(

FILE: jupyterlab/packages/jupyterlab-jupytext-extension/ui-tests/tests/jupytext-notebook.spec.ts
  function populateNotebook (line 60) | async function populateNotebook(extension, page) {

FILE: jupyterlab/scripts/install_extension.py
  function main (line 18) | def main():

FILE: src/jupytext/async_contentsmanager.py
  function build_async_jupytext_contents_manager_class (line 50) | def build_async_jupytext_contents_manager_class(base_contents_manager_cl...

FILE: src/jupytext/async_pairs.py
  function read_pair (line 10) | async def read_pair(inputs, outputs, read_one_file, must_match=False):
  function write_pair (line 32) | async def write_pair(path, formats, write_one_file):

FILE: src/jupytext/cell_metadata.py
  class RLogicalValueError (line 65) | class RLogicalValueError(Exception):
  class RMarkdownOptionParsingError (line 69) | class RMarkdownOptionParsingError(Exception):
  function _py_logical_values (line 73) | def _py_logical_values(rbool):
  function metadata_to_rmd_options (line 81) | def metadata_to_rmd_options(language, metadata, use_runtools=False):
  function update_metadata_from_rmd_options (line 126) | def update_metadata_from_rmd_options(name, value, metadata, use_runtools...
  class ParsingContext (line 142) | class ParsingContext:
    method __init__ (line 153) | def __init__(self, line):
    method in_global_expression (line 156) | def in_global_expression(self):
    method count_special_chars (line 166) | def count_special_chars(self, char, prev_char):
  function parse_rmd_options (line 192) | def parse_rmd_options(line):
  function rmd_options_to_metadata (line 235) | def rmd_options_to_metadata(options, use_runtools=False):
  function try_eval_metadata (line 275) | def try_eval_metadata(metadata, name):
  function is_active (line 295) | def is_active(ext, metadata, default=True):
  function metadata_to_double_percent_options (line 307) | def metadata_to_double_percent_options(metadata, plain_json):
  function incorrectly_encoded_metadata (line 319) | def incorrectly_encoded_metadata(text):
  function is_identifier (line 324) | def is_identifier(text):
  function is_valid_metadata_key (line 328) | def is_valid_metadata_key(text):
  function is_jupyter_language (line 333) | def is_jupyter_language(language):
  function parse_key_equal_value (line 341) | def parse_key_equal_value(text):
  function relax_json_loads (line 388) | def relax_json_loads(text, catch=False):
  function is_json_metadata (line 407) | def is_json_metadata(text):
  function text_to_metadata (line 420) | def text_to_metadata(text, allow_title=False):
  function metadata_to_text (line 466) | def metadata_to_text(language_or_title, metadata=None, plain_json=False):

FILE: src/jupytext/cell_reader.py
  function uncomment (line 34) | def uncomment(lines, prefix="#", suffix=""):
  function paragraph_is_fully_commented (line 65) | def paragraph_is_fully_commented(lines, comment, main_language):
  function next_code_is_indented (line 78) | def next_code_is_indented(lines):
  function count_lines_to_next_cell (line 87) | def count_lines_to_next_cell(cell_end_marker, next_cell_start, total, ex...
  function last_two_lines_blank (line 100) | def last_two_lines_blank(source):
  class BaseCellReader (line 107) | class BaseCellReader:
    method __init__ (line 123) | def __init__(self, fmt=None, default_language=None):
    method read (line 142) | def read(self, lines):
    method metadata_and_language_from_option_line (line 182) | def metadata_and_language_from_option_line(self, line):
    method options_to_metadata (line 188) | def options_to_metadata(self, options):
    method find_cell_end (line 192) | def find_cell_end(self, lines):
    method find_cell_content (line 197) | def find_cell_content(self, lines):
    method uncomment_code_and_magics (line 266) | def uncomment_code_and_magics(self, lines):
    method extract_content (line 270) | def extract_content(self, lines):
  class MarkdownCellReader (line 305) | class MarkdownCellReader(BaseCellReader):
    method __init__ (line 318) | def __init__(self, fmt=None, default_language=None):
    method metadata_and_language_from_option_line (line 328) | def metadata_and_language_from_option_line(self, line):
    method options_to_metadata (line 353) | def options_to_metadata(self, options):
    method find_cell_end (line 362) | def find_cell_end(self, lines):
    method uncomment_code_and_magics (line 453) | def uncomment_code_and_magics(self, lines):
  class RMarkdownCellReader (line 461) | class RMarkdownCellReader(MarkdownCellReader):
    method options_to_metadata (line 470) | def options_to_metadata(self, options):
    method uncomment_code_and_magics (line 473) | def uncomment_code_and_magics(self, lines):
  class ScriptCellReader (line 480) | class ScriptCellReader(BaseCellReader):  # pylint: disable=W0223
    method uncomment_code_and_magics (line 484) | def uncomment_code_and_magics(self, lines):
  class RScriptCellReader (line 511) | class RScriptCellReader(ScriptCellReader):
    method options_to_metadata (line 522) | def options_to_metadata(self, options):
    method find_cell_end (line 525) | def find_cell_end(self, lines):
  class LightScriptCellReader (line 573) | class LightScriptCellReader(ScriptCellReader):
    method __init__ (line 582) | def __init__(self, fmt=None, default_language=None):
    method metadata_and_language_from_option_line (line 598) | def metadata_and_language_from_option_line(self, line):
    method options_to_metadata (line 622) | def options_to_metadata(self, options):
    method find_cell_end (line 652) | def find_cell_end(self, lines):
    method find_region_end (line 673) | def find_region_end(self, lines):
  class DoublePercentScriptCellReader (line 724) | class DoublePercentScriptCellReader(LightScriptCellReader):
    method __init__ (line 729) | def __init__(self, fmt, default_language=None):
    method metadata_and_language_from_option_line (line 739) | def metadata_and_language_from_option_line(self, line):
    method find_cell_content (line 748) | def find_cell_content(self, lines):
    method find_cell_end (line 768) | def find_cell_end(self, lines):
  class HydrogenCellReader (line 802) | class HydrogenCellReader(DoublePercentScriptCellReader):
  class SphinxGalleryScriptCellReader (line 808) | class SphinxGalleryScriptCellReader(ScriptCellReader):  # pylint: disabl...
    method __init__ (line 818) | def __init__(self, fmt=None, default_language="python"):
    method start_of_new_markdown_cell (line 823) | def start_of_new_markdown_cell(self, line):
    method metadata_and_language_from_option_line (line 839) | def metadata_and_language_from_option_line(self, line):
    method find_cell_end (line 848) | def find_cell_end(self, lines):
    method find_cell_content (line 895) | def find_cell_content(self, lines):

FILE: src/jupytext/cell_to_text.py
  function cell_source (line 22) | def cell_source(cell):
  function three_backticks_or_more (line 32) | def three_backticks_or_more(lines):
  class BaseCellExporter (line 48) | class BaseCellExporter:
    method __init__ (line 54) | def __init__(self, cell, default_language, fmt=None, unsupported_keys=...
    method is_code (line 98) | def is_code(self):
    method use_triple_quotes (line 110) | def use_triple_quotes(self):
    method cell_to_text (line 122) | def cell_to_text(self):
    method markdown_to_text (line 140) | def markdown_to_text(self, source):
    method code_to_text (line 181) | def code_to_text(self):
    method remove_eoc_marker (line 185) | def remove_eoc_marker(self, text, next_text):
  class MarkdownCellExporter (line 191) | class MarkdownCellExporter(BaseCellExporter):
    method __init__ (line 197) | def __init__(self, *args, **kwargs):
    method html_comment (line 201) | def html_comment(self, metadata, code="region"):
    method cell_to_text (line 215) | def cell_to_text(self):
    method code_to_text (line 234) | def code_to_text(self):
  class RMarkdownCellExporter (line 251) | class RMarkdownCellExporter(MarkdownCellExporter):
    method __init__ (line 257) | def __init__(self, *args, **kwargs):
    method code_to_text (line 262) | def code_to_text(self):
  function endofcell_marker (line 280) | def endofcell_marker(source, comment):
  class LightScriptCellExporter (line 292) | class LightScriptCellExporter(BaseCellExporter):
    method __init__ (line 300) | def __init__(self, *args, **kwargs):
    method is_code (line 315) | def is_code(self):
    method code_to_text (line 327) | def code_to_text(self):
    method explicit_start_marker (line 361) | def explicit_start_marker(self, source):
    method remove_eoc_marker (line 381) | def remove_eoc_marker(self, text, next_text):
  class BareScriptCellExporter (line 408) | class BareScriptCellExporter(LightScriptCellExporter):
  class RScriptCellExporter (line 414) | class RScriptCellExporter(BaseCellExporter):
    method __init__ (line 419) | def __init__(self, *args, **kwargs):
    method code_to_text (line 423) | def code_to_text(self):
  class DoublePercentCellExporter (line 445) | class DoublePercentCellExporter(BaseCellExporter):  # pylint: disable=W0223
    method __init__ (line 451) | def __init__(self, *args, **kwargs):
    method cell_to_text (line 455) | def cell_to_text(self):
  class HydrogenCellExporter (line 492) | class HydrogenCellExporter(DoublePercentCellExporter):  # pylint: disabl...
  class SphinxGalleryCellExporter (line 499) | class SphinxGalleryCellExporter(BaseCellExporter):  # pylint: disable=W0223
    method __init__ (line 506) | def __init__(self, *args, **kwargs):
    method cell_to_text (line 520) | def cell_to_text(self):

FILE: src/jupytext/cli.py
  function system (line 53) | def system(*args, **kwargs):
  function tool_version (line 63) | def tool_version(tool):
  function str2bool (line 72) | def str2bool(value):
  function parse_jupytext_args (line 84) | def parse_jupytext_args(args=None):
  function jupytext (line 342) | def jupytext(args=None):
  function jupytext_single_file (line 502) | def jupytext_single_file(nb_file, args, log):
  function notebooks_in_git_index (line 967) | def notebooks_in_git_index(fmt):
  function is_untracked (line 984) | def is_untracked(filepath):
  function print_paired_paths (line 1000) | def print_paired_paths(nb_file, fmt):
  function set_format_options (line 1009) | def set_format_options(fmt, format_options):
  function set_prefix_and_suffix (line 1031) | def set_prefix_and_suffix(fmt, formats, nb_file):
  class NotAPairedNotebook (line 1043) | class NotAPairedNotebook(ValueError):
  class InconsistentVersions (line 1047) | class InconsistentVersions(ValueError):
  function file_in_git_index (line 1051) | def file_in_git_index(path):
  function git_timestamp (line 1057) | def git_timestamp(path):
  function get_timestamp (line 1082) | def get_timestamp(path: str) -> Optional[float]:
  class SynchronousModificationError (line 1088) | class SynchronousModificationError(OSError):
  class TimestampChecker (line 1092) | class TimestampChecker:
    method __init__ (line 1099) | def __init__(self, pre_commit_mode: bool = False):
    method get_and_check_timestamp (line 1103) | def get_and_check_timestamp(self, path: str) -> Optional[float]:
    method check_timestamp (line 1115) | def check_timestamp(self, path: str) -> Optional[float]:
    method update_timestamp (line 1132) | def update_timestamp(self, path: str):
    method check_all_timestamps (line 1138) | def check_all_timestamps(self):
    method check_file_is_newest (line 1142) | def check_file_is_newest(self, path: str) -> Optional[float]:
  function load_paired_notebook (line 1160) | def load_paired_notebook(
  function exec_command (line 1211) | def exec_command(command, input=None, capture=False, warn_only=False, qu...
  function pipe_notebook (line 1236) | def pipe_notebook(
  function execution_counts_are_in_order (line 1324) | def execution_counts_are_in_order(notebook):
  function code_cells_have_changed (line 1335) | def code_cells_have_changed(notebook, nb_files):

FILE: src/jupytext/combine.py
  function black_invariant (line 16) | def black_invariant(text, chars=None):
  function same_content (line 26) | def same_content(ref, test, endswith=False):
  function combine_inputs_with_outputs (line 36) | def combine_inputs_with_outputs(nb_source, nb_outputs, fmt=None):
  function map_outputs_to_inputs (line 119) | def map_outputs_to_inputs(cells_inputs, cells_outputs):

FILE: src/jupytext/compare.py
  function _multilines (line 21) | def _multilines(obj):
  function compare (line 31) | def compare(actual, expected, actual_name="actual", expected_name="expec...
  function filtered_cell (line 50) | def filtered_cell(cell, preserve_outputs, cell_metadata_filter):
  function filtered_notebook_metadata (line 66) | def filtered_notebook_metadata(notebook, ignore_kernelspec=False):
  class NotebookDifference (line 83) | class NotebookDifference(Exception):
  function same_content (line 87) | def same_content(ref_source, test_source, allow_removed_final_blank_line):
  function compare_notebooks (line 108) | def compare_notebooks(
  function compare_cells (line 175) | def compare_cells(
  function test_round_trip_conversion (line 317) | def test_round_trip_conversion(notebook, fmt, update, allow_expected_dif...
  function create_mirror_file_if_missing (line 335) | def create_mirror_file_if_missing(mirror_file, notebook, fmt):
  function assert_conversion_same_as_mirror (line 340) | def assert_conversion_same_as_mirror(nb_file, fmt, mirror_name, compare_...
  function notebook_model (line 407) | def notebook_model(nb):

FILE: src/jupytext/config.py
  class JupytextConfigurationError (line 29) | class JupytextConfigurationError(ValueError):
  class JupytextConfiguration (line 48) | class JupytextConfiguration(Configurable):
    method set_default_format_options (line 176) | def set_default_format_options(self, format_options, read=False):
    method default_formats (line 220) | def default_formats(self, path):
    method __eq__ (line 241) | def __eq__(self, other):
  function preferred_format (line 249) | def preferred_format(incomplete_format, preferred_formats):
  function global_jupytext_configuration_directories (line 273) | def global_jupytext_configuration_directories():
  function find_global_jupytext_configuration_file (line 300) | def find_global_jupytext_configuration_file():
  function find_jupytext_configuration_file (line 311) | def find_jupytext_configuration_file(path: typing.Union[str, Path], sear...
  function parse_jupytext_configuration_file (line 344) | def parse_jupytext_configuration_file(jupytext_config_file, stream=None):
  function normalize_formats (line 369) | def normalize_formats(formats) -> list[str]:
  function load_jupytext_configuration_file (line 406) | def load_jupytext_configuration_file(config_file, stream=None):
  function load_jupytext_config (line 417) | def load_jupytext_config(nb_file):
  function validate_jupytext_configuration_file (line 428) | def validate_jupytext_configuration_file(config_file, config_dict):
  function notebook_formats (line 446) | def notebook_formats(nbk, config, path, fallback_on_current_fmt=True):
  function get_formats_from_notebook_and_config (line 492) | def get_formats_from_notebook_and_config(notebook, config, nb_file):

FILE: src/jupytext/doxygen.py
  function markdown_to_doxygen (line 7) | def markdown_to_doxygen(string):
  function doxygen_to_markdown (line 14) | def doxygen_to_markdown(string):

FILE: src/jupytext/formats.py
  class JupytextFormatError (line 48) | class JupytextFormatError(ValueError):
  class NotebookFormatDescription (line 52) | class NotebookFormatDescription:
    method __init__ (line 55) | def __init__(
  function get_format_implementation (line 251) | def get_format_implementation(ext, format_name=None):
  function read_metadata (line 272) | def read_metadata(text, ext):
  function read_format_from_metadata (line 299) | def read_format_from_metadata(text, ext):
  function guess_format (line 306) | def guess_format(text, ext):
  function divine_format (line 397) | def divine_format(text):
  function check_file_version (line 420) | def check_file_version(notebook, source_path, outputs_path):
  function format_name_for_ext (line 474) | def format_name_for_ext(metadata, ext, cm_default_formats=None, explicit...
  function identical_format_path (line 495) | def identical_format_path(fmt1, fmt2):
  function update_jupytext_formats_metadata (line 503) | def update_jupytext_formats_metadata(metadata, new_format):
  function rearrange_jupytext_metadata (line 518) | def rearrange_jupytext_metadata(metadata):
  function long_form_one_format (line 562) | def long_form_one_format(jupytext_format, metadata=None, update=None, au...
  function long_form_multiple_formats (line 634) | def long_form_multiple_formats(
  function short_form_one_format (line 659) | def short_form_one_format(jupytext_format: dict[str, str]) -> str:
  function short_form_multiple_formats (line 683) | def short_form_multiple_formats(jupytext_formats: list[dict[str, str]]) ...
  function validate_one_format (line 713) | def validate_one_format(jupytext_format: dict[str, str]) -> dict[str, str]:
  function auto_ext_from_metadata (line 748) | def auto_ext_from_metadata(metadata):
  function check_auto_ext (line 782) | def check_auto_ext(fmt, metadata, option):
  function formats_with_support_for_cell_metadata (line 801) | def formats_with_support_for_cell_metadata():
  function get_formats_from_notebook_metadata (line 813) | def get_formats_from_notebook_metadata(notebook):

FILE: src/jupytext/header.py
  function insert_or_test_version_number (line 38) | def insert_or_test_version_number():
  function uncomment_line (line 44) | def uncomment_line(line, prefix, suffix=""):
  function encoding_and_executable (line 59) | def encoding_and_executable(notebook, metadata, ext):
  function insert_jupytext_info_and_filter_metadata (line 82) | def insert_jupytext_info_and_filter_metadata(metadata, fmt, text_format,...
  function metadata_and_cell_to_header (line 105) | def metadata_and_cell_to_header(notebook, metadata, text_format, fmt, un...
  function recursive_update (line 148) | def recursive_update(target, update, overwrite=True):
  function header_to_metadata_and_cell (line 169) | def header_to_metadata_and_cell(lines, header_prefix, header_suffix, ext...
  function default_root_level_metadata_filter (line 280) | def default_root_level_metadata_filter(fmt):
  function metadata_to_metadata_and_cell (line 289) | def metadata_to_metadata_and_cell(nb, metadata, fmt, unsupported_keys=No...
  function metadata_and_cell_to_metadata (line 310) | def metadata_and_cell_to_metadata(nb, fmt, unsupported_keys=None):

FILE: src/jupytext/jupytext.py
  class NotSupportedNBFormatVersion (line 50) | class NotSupportedNBFormatVersion(NotImplementedError):
  class TextNotebookConverter (line 54) | class TextNotebookConverter(NotebookReader, NotebookWriter):
    method __init__ (line 57) | def __init__(self, fmt, config):
    method update_fmt_with_notebook_options (line 63) | def update_fmt_with_notebook_options(self, metadata, read=False):
    method reads (line 98) | def reads(self, s, **_):
    method filter_notebook (line 174) | def filter_notebook(self, nb, metadata, preserve_cell_ids=True):
    method writes (line 212) | def writes(self, nb, metadata=None, **kwargs):
    method split_frontmatter (line 319) | def split_frontmatter(self, nb):
    method merge_frontmatter (line 336) | def merge_frontmatter(self, nb):
  function reads (line 344) | def reads(text, fmt=None, as_version=nbformat.NO_CONVERT, config=None, *...
  function read (line 393) | def read(fp, as_version=nbformat.NO_CONVERT, fmt=None, config=None, **kw...
  function writes (line 434) | def writes(notebook, fmt, version=nbformat.NO_CONVERT, config=None, **kw...
  function drop_text_representation_metadata (line 491) | def drop_text_representation_metadata(notebook, metadata=None):
  function write (line 512) | def write(nb, fp, version=nbformat.NO_CONVERT, fmt=None, config=None, **...
  function create_prefix_dir (line 554) | def create_prefix_dir(nb_file, fmt):
  function _warn_on_unsupported_keys (line 563) | def _warn_on_unsupported_keys(unsupported_keys):
  function get_formats_from_notebook_path (line 568) | def get_formats_from_notebook_path(nb_file, fmt=None):

FILE: src/jupytext/kernels.py
  function set_kernelspec_from_language (line 17) | def set_kernelspec_from_language(notebook):
  function kernelspec_from_language (line 29) | def kernelspec_from_language(language):

FILE: src/jupytext/languages.py
  function default_language_from_metadata_and_ext (line 112) | def default_language_from_metadata_and_ext(metadata, ext, pop_main_langu...
  function usual_language_name (line 132) | def usual_language_name(language):
  function same_language (line 150) | def same_language(kernel_language, language):
  function set_main_and_cell_language (line 155) | def set_main_and_cell_language(metadata, cells, ext, custom_cell_magics):
  function cell_language (line 194) | def cell_language(source, default_language, custom_cell_magics):
  function comment_lines (line 221) | def comment_lines(lines, prefix, suffix=""):

FILE: src/jupytext/magics.py
  function get_comment (line 9) | def get_comment(ext):
  function is_magic (line 69) | def is_magic(line, language, global_escape_flag=True, explicitly_code=Fa...
  function need_explicit_marker (line 91) | def need_explicit_marker(source, language="python", global_escape_flag=T...
  function comment_magic (line 105) | def comment_magic(source, language="python", global_escape_flag=True, ex...
  function unesc (line 125) | def unesc(line, language):
  function uncomment_magic (line 137) | def uncomment_magic(source, language="python", global_escape_flag=True, ...
  function is_escaped_code_start (line 159) | def is_escaped_code_start(line, ext):
  function escape_code_start (line 164) | def escape_code_start(source, ext, language="python"):
  function unescape_code_start (line 174) | def unescape_code_start(source, ext, language="python"):

FILE: src/jupytext/marimo.py
  class MarimoError (line 12) | class MarimoError(OSError):
  function is_marimo_available (line 16) | def is_marimo_available(min_version=MARIMO_MIN_VERSION, max_version=None):
  function raise_if_marimo_is_not_available (line 25) | def raise_if_marimo_is_not_available(min_version=MARIMO_MIN_VERSION, max...
  function marimo_version (line 40) | def marimo_version():
  function marimo_py_to_notebook (line 48) | def marimo_py_to_notebook(text):
  function notebook_to_marimo_py (line 116) | def notebook_to_marimo_py(notebook):
  function marimo (line 144) | def marimo(*args: str):

FILE: src/jupytext/metadata_filter.py
  function metadata_filter_as_dict (line 24) | def metadata_filter_as_dict(metadata_config):
  function metadata_filter_as_string (line 64) | def metadata_filter_as_string(metadata_filter):
  function update_metadata_filters (line 84) | def update_metadata_filters(metadata, jupyter_md, cell_metadata):
  function filter_metadata (line 119) | def filter_metadata(metadata, user_filter, default_filter="", unsupporte...
  function second_level (line 185) | def second_level(keys):
  function suppress_unsupported_keys (line 196) | def suppress_unsupported_keys(metadata, unsupported_keys=None):
  function subset_metadata (line 205) | def subset_metadata(metadata, keep_only=None, exclude=None, unsupported_...
  function restore_filtered_metadata (line 245) | def restore_filtered_metadata(filtered_metadata, unfiltered_metadata, us...

FILE: src/jupytext/myst.py
  function is_myst_available (line 34) | def is_myst_available():
  function raise_if_myst_is_not_available (line 39) | def raise_if_myst_is_not_available():
  function myst_version (line 44) | def myst_version():
  function myst_extensions (line 49) | def myst_extensions(no_md=False):
  function get_parser (line 56) | def get_parser():
  function matches_mystnb (line 70) | def matches_mystnb(
  class CompactDumper (line 126) | class CompactDumper(yaml.SafeDumper):
  function represent_list (line 130) | def represent_list(self, data):
  function represent_dict (line 136) | def represent_dict(self, data):
  function dump_yaml_blocks (line 145) | def dump_yaml_blocks(data, compact=True):
  class MystMetadataParsingError (line 168) | class MystMetadataParsingError(Exception):
  function strip_blank_lines (line 172) | def strip_blank_lines(text):
  function read_fenced_cell (line 180) | def read_fenced_cell(token, cell_index, cell_type):
  function parse_directive_options (line 195) | def parse_directive_options(content, error_msg):
  function read_cell_metadata (line 229) | def read_cell_metadata(token, cell_index):
  function myst_to_notebook (line 243) | def myst_to_notebook(
  function notebook_to_myst (line 352) | def notebook_to_myst(

FILE: src/jupytext/paired_paths.py
  class InconsistentPath (line 15) | class InconsistentPath(ValueError):
  class InconsistentSuffix (line 20) | class InconsistentSuffix(InconsistentPath):
  class InconsistentPrefix (line 25) | class InconsistentPrefix(InconsistentPath):
  class InconsistentPrefixDirectory (line 30) | class InconsistentPrefixDirectory(InconsistentPath):
  class InconsistentPrefixRoot (line 35) | class InconsistentPrefixRoot(InconsistentPath):
  class NonNotebookExtension (line 40) | class NonNotebookExtension(InconsistentPath):
  class InconsistentExtension (line 44) | class InconsistentExtension(InconsistentPath):
  function split (line 49) | def split(path, sep):
  function join (line 56) | def join(left, right, sep):
  function separator (line 62) | def separator(path):
  function get_prefix_root_prefix_dir_prefix_file_name (line 69) | def get_prefix_root_prefix_dir_prefix_file_name(prefix: str) -> tuple[st...
  function get_prefix (line 78) | def get_prefix(prefix_root: str, prefix_dir: str, prefix_file_name: str)...
  function base_path (line 86) | def base_path(main_path, fmt, formats=None):
  function base_path_and_adjusted_fmt (line 194) | def base_path_and_adjusted_fmt(path: str, fmt: dict[str, str]) -> tuple[...
  function full_path (line 234) | def full_path(base, fmt):
  function find_base_path_and_format (line 291) | def find_base_path_and_format(main_path, formats: list[dict[str, str]]) ...
  function paired_paths (line 307) | def paired_paths(main_path, fmt, formats):

FILE: src/jupytext/pairs.py
  class PairedFilesDiffer (line 11) | class PairedFilesDiffer(ValueError):
  function latest_inputs_and_outputs (line 15) | def latest_inputs_and_outputs(path, fmt, formats, get_timestamp, content...

FILE: src/jupytext/pandoc.py
  class PandocError (line 13) | class PandocError(OSError):
  function pandoc (line 17) | def pandoc(args, filein=None, fileout=None):
  function is_pandoc_available (line 37) | def is_pandoc_available(min_version="2.7.2", max_version=None):
  function raise_if_pandoc_is_not_available (line 46) | def raise_if_pandoc_is_not_available(min_version="2.7.2", max_version=No...
  function pandoc_version (line 65) | def pandoc_version():
  function md_to_notebook (line 73) | def md_to_notebook(text):
  function notebook_to_md (line 97) | def notebook_to_md(notebook):

FILE: src/jupytext/pep8.py
  function next_instruction_is_function_or_class (line 6) | def next_instruction_is_function_or_class(lines):
  function cell_ends_with_function_or_class (line 27) | def cell_ends_with_function_or_class(lines):
  function cell_ends_with_code (line 53) | def cell_ends_with_code(lines):
  function cell_has_code (line 64) | def cell_has_code(lines):
  function pep8_lines_between_cells (line 82) | def pep8_lines_between_cells(prev_lines, next_lines, ext):

FILE: src/jupytext/quarto.py
  class QuartoError (line 19) | class QuartoError(OSError):
  function quarto (line 23) | def quarto(args, filein=None):
  function is_quarto_available (line 45) | def is_quarto_available(min_version=QUARTO_MIN_VERSION):
  function raise_if_quarto_is_not_available (line 54) | def raise_if_quarto_is_not_available(min_version=QUARTO_MIN_VERSION):
  function quarto_version (line 68) | def quarto_version():
  function qmd_to_notebook (line 76) | def qmd_to_notebook(text):
  function notebook_to_qmd (line 146) | def notebook_to_qmd(notebook):

FILE: src/jupytext/reraise.py
  function reraise (line 4) | def reraise(error):

FILE: src/jupytext/stringparser.py
  class StringParser (line 7) | class StringParser:
    method __init__ (line 15) | def __init__(self, language):
    method is_quoted (line 20) | def is_quoted(self):
    method read_line (line 26) | def read_line(self, line):

FILE: src/jupytext/sync_contentsmanager.py
  function build_sync_jupytext_contents_manager_class (line 56) | def build_sync_jupytext_contents_manager_class(base_contents_manager_cla...

FILE: src/jupytext/sync_pairs.py
  function read_pair (line 16) | def read_pair(inputs, outputs, read_one_file, must_match=False):
  function write_pair (line 40) | def write_pair(path, formats, write_one_file):

FILE: src/jupytext_config/jupytext_config.py
  class SubCommand (line 16) | class SubCommand:
    method __init__ (line 21) | def __init__(self, name, help):
    method main (line 25) | def main(self, args):
  class ListDefaultViewer (line 32) | class ListDefaultViewer(SubCommand):
    method __init__ (line 33) | def __init__(self):
    method main (line 36) | def main(self, args):
    method fill_parser (line 40) | def fill_parser(self, subparser):
  class SetDefaultViewer (line 44) | class SetDefaultViewer(SubCommand):
    method __init__ (line 45) | def __init__(self):
    method main (line 48) | def main(self, args):
    method fill_parser (line 52) | def fill_parser(self, subparser):
  class UnsetDefaultViewer (line 60) | class UnsetDefaultViewer(SubCommand):
    method __init__ (line 61) | def __init__(self):
    method main (line 64) | def main(self, args):
    method fill_parser (line 68) | def fill_parser(self, subparser):
  function main (line 84) | def main():

FILE: src/jupytext_config/labconfig.py
  class LabConfig (line 13) | class LabConfig:
    method __init__ (line 24) | def __init__(self, *, settings_file, logger=None):
    method read (line 29) | def read(self):
    method get_viewers (line 41) | def get_viewers(self):
    method list_default_viewer (line 44) | def list_default_viewer(self):
    method set_default_viewers (line 52) | def set_default_viewers(self, doctypes=None):
    method set_default_viewer (line 59) | def set_default_viewer(self, doctype):
    method unset_default_viewers (line 64) | def unset_default_viewers(self, doctypes=None):
    method unset_default_viewer (line 71) | def unset_default_viewer(self, doctype):
    method write (line 76) | def write(self):

FILE: tests/conftest.py
  function nbformat_reads (line 38) | def nbformat_reads(s, as_version, capture_validation_error=None, **kwargs):
  function force_validate_nbformat (line 46) | def force_validate_nbformat(monkeypatch):
  function cm (line 52) | def cm(request):
  function no_jupytext_version_number (line 60) | def no_jupytext_version_number():
  function cwd_tmpdir (line 66) | def cwd_tmpdir(tmpdir):
  function cwd_tmp_path (line 73) | def cwd_tmp_path(tmp_path):
  function jupytext_repo_root (line 85) | def jupytext_repo_root():
  function jupytext_repo_rev (line 91) | def jupytext_repo_rev(jupytext_repo_root):
  function python_notebook (line 97) | def python_notebook():
  function notebook_with_outputs (line 123) | def notebook_with_outputs():
  function fmt_with_cell_metadata (line 149) | def fmt_with_cell_metadata(request):
  function list_notebooks (line 153) | def list_notebooks(path="ipynb", skip=""):
  function notebook_id_func (line 185) | def notebook_id_func(nb_file):
  function ipynb_file (line 193) | def ipynb_file(request):
  function any_nb_file (line 198) | def any_nb_file(request):
  function ipynb_py_R_jl_files (line 203) | def ipynb_py_R_jl_files():
  function ipynb_py_R_jl_file (line 208) | def ipynb_py_R_jl_file(request):
  function ipynb_py_R_jl_ext (line 213) | def ipynb_py_R_jl_ext(ipynb_py_R_jl_file):
  function ipynb_or_rmd_file (line 222) | def ipynb_or_rmd_file(request):
  function ipynb_py_R_file (line 227) | def ipynb_py_R_file(request):
  function ipynb_py_files (line 232) | def ipynb_py_files():
  function ipynb_py_file (line 237) | def ipynb_py_file(request):
  function marimo_compatible_ipynb (line 242) | def marimo_compatible_ipynb(request):
  function ipynb_R_file (line 266) | def ipynb_R_file(request):
  function ipynb_julia_file (line 271) | def ipynb_julia_file(request):
  function ipynb_scheme_file (line 276) | def ipynb_scheme_file(request):
  function ipynb_cpp_file (line 281) | def ipynb_cpp_file(request):
  function ipynb_to_light (line 286) | def ipynb_to_light(request):
  function ipynb_to_myst (line 291) | def ipynb_to_myst(request):
  function py_file (line 301) | def py_file(request):
  function script_to_ipynb (line 309) | def script_to_ipynb(request):
  function python_file (line 314) | def python_file(request):
  function percent_file (line 319) | def percent_file(request):
  function hydrogen_file (line 324) | def hydrogen_file(request):
  function r_file (line 329) | def r_file(request):
  function r_spin_file (line 334) | def r_spin_file(request):
  function marimo_file (line 339) | def marimo_file(request):
  function md_file (line 344) | def md_file(request):
  function myst_file (line 349) | def myst_file(request):
  function ipynb_to_pandoc (line 357) | def ipynb_to_pandoc(request):
  function ipynb_to_quarto (line 369) | def ipynb_to_quarto(request):
  function ipynb_to_sphinx (line 377) | def ipynb_to_sphinx(request):
  function rmd_file (line 382) | def rmd_file(request):
  function sphinx_file (line 387) | def sphinx_file(request):
  function pytest_runtest_setup (line 391) | def pytest_runtest_setup(item):
  function pytest_collection_modifyitems (line 445) | def pytest_collection_modifyitems(config, items):
  function cell_id (line 452) | def cell_id():

FILE: tests/data/notebooks/inputs/marimo/basic_marimo_example.py
  function _ (line 8) | def _(mo):
  function _ (line 16) | def _():
  function _ (line 22) | def _(x):
  function _ (line 29) | def _():

FILE: tests/data/notebooks/inputs/python/python_notebook_sample.py
  function f (line 21) | def f(x):
  function g (line 35) | def g(x):

FILE: tests/data/notebooks/inputs/sphinx/plot_notebook.py
  function dummy (line 84) | def dummy():

FILE: tests/data/notebooks/outputs/ipynb_to_hydrogen/Notebook with function and cell metadata 164.py
  function f (line 18) | def f(x):

FILE: tests/data/notebooks/outputs/ipynb_to_hydrogen/evcxr_jupyter_tour.rs
  function fib (line 39) | pub fn fib(x: i32) -> i32 {
  function fib (line 50) | pub fn fib(x: i32) -> i32 {
  type Matrix (line 94) | pub struct Matrix<T> {pub values: Vec<T>, pub row_size: usize}
  function evcxr_display (line 96) | pub fn evcxr_display(&self) {
  type EvcxrResult (line 123) | pub trait EvcxrResult {fn evcxr_display(&self);}
    method evcxr_display (line 123) | fn evcxr_display(&self);
    method evcxr_display (line 125) | fn evcxr_display(&self) {
    method evcxr_display (line 134) | fn evcxr_display(&self) {

FILE: tests/data/notebooks/outputs/ipynb_to_hydrogen/hello_world_gonb.go
  function main (line 17) | func main() {
  function main (line 45) | func main() {
  function init_a (line 62) | func init_a() {

FILE: tests/data/notebooks/outputs/ipynb_to_hydrogen/ijavascript.js
  function add (line 21) | function add(num1, num2) {
  class User (line 58) | class User {
    method constructor (line 59) | constructor(name){
    method sayHello (line 62) | sayHello(){

FILE: tests/data/notebooks/outputs/ipynb_to_hydrogen/itypescript.ts
  function add (line 17) | function add(num1: number, num2: number): number {
  class User (line 27) | class User {
    method constructor (line 28) | constructor(private name: string) {
    method sayHello (line 31) | sayHello(): string {

FILE: tests/data/notebooks/outputs/ipynb_to_hydrogen/simple-helloworld.java
  class A (line 16) | class A {
    method hello (line 17) | public void hello() {

FILE: tests/data/notebooks/outputs/ipynb_to_hydrogen/xcpp_by_quantstack.cpp
  function j (line 62) | j
  function asqr (line 81) | asqr
  class Bar (line 107) | class Bar : public Foo
    method print (line 113) | virtual void print(double value) const
  class FooT (line 131) | class FooT
    method FooT (line 135) | explicit FooT(const T& t) : m_t(t) {}
    method print (line 137) | void print() const
  class FooT<int> (line 148) | class FooT<int>
    method FooT (line 152) | explicit FooT(const int& t) : m_t(t) {}
    method print (line 154) | void print() const
  class Foo11 (line 176) | class Foo11
    method Foo11 (line 180) | Foo11() { std::cout << "Foo11 default constructor" << std::endl; }
    method Foo11 (line 181) | Foo11(const Foo11&) { std::cout << "Foo11 copy constructor" << std::en...
    method Foo11 (line 182) | Foo11(Foo11&&) { std::cout << "Foo11 move constructor" << std::endl; }
  type ht (line 310) | namespace ht
    type html (line 312) | struct html
      method html (line 314) | inline html(const std::string& content)
    function mime_bundle_repr (line 321) | xeus::xjson mime_bundle_repr(const html& a)

FILE: tests/data/notebooks/outputs/ipynb_to_marimo/Line_breaks_in_LateX_305.py
  function _ (line 8) | def _(mo):
  function _ (line 24) | def _(mo):
  function _ (line 40) | def _(mo):
  function _ (line 56) | def _():

FILE: tests/data/notebooks/outputs/ipynb_to_marimo/Notebook with function and cell metadata 164.py
  function _ (line 8) | def _():
  function _ (line 14) | def _(mo):
  function f (line 23) | def f(x):
  function _ (line 28) | def _():
  function _ (line 34) | def _(mo):
  function _ (line 42) | def _():
  function _ (line 48) | def _():

FILE: tests/data/notebooks/outputs/ipynb_to_marimo/Notebook with many hash signs.py
  function _ (line 8) | def _(mo):
  function _ (line 19) | def _():
  function _ (line 32) | def _(mo):
  function _ (line 43) | def _():

FILE: tests/data/notebooks/outputs/ipynb_to_marimo/cat_variable.py
  function _ (line 8) | def _():

FILE: tests/data/notebooks/outputs/ipynb_to_marimo/frozen_cell.py
  function _ (line 8) | def _():
  function _ (line 15) | def _():

FILE: tests/data/notebooks/outputs/ipynb_to_marimo/jupyter.py
  function _ (line 8) | def _(mo):
  function _ (line 18) | def _():
  function _ (line 26) | def _(mo):
  function _ (line 34) | def _(a, b):
  function _ (line 40) | def _(a, b):
  function _ (line 46) | def _(mo):
  function _ (line 54) | def _():

FILE: tests/data/notebooks/outputs/ipynb_to_marimo/notebook_with_complex_metadata.py
  function _ (line 8) | def _():

FILE: tests/data/notebooks/outputs/ipynb_to_marimo/plotly_graphs.py
  function _ (line 8) | def _(mo):
  function _ (line 16) | def _(mo):
  function _ (line 24) | def _(mo):
  function _ (line 32) | def _():
  function _ (line 39) | def _():
  function _ (line 51) | def _():

FILE: tests/data/notebooks/outputs/ipynb_to_marimo/sample_rise_notebook_66.py
  function _ (line 8) | def _(mo):
  function _ (line 16) | def _():
  function _ (line 22) | def _(mo):
  function _ (line 30) | def _():

FILE: tests/data/notebooks/outputs/ipynb_to_marimo/text_outputs_and_images.py
  function _ (line 8) | def _(mo):
  function _ (line 16) | def _(mo):
  function _ (line 26) | def _():
  function _ (line 35) | def _():
  function _ (line 45) | def _(mo):
  function _ (line 55) | def _():
  function _ (line 62) | def _(pd):
  function _ (line 70) | def _(mo):
  function _ (line 78) | def _():
  function _ (line 84) | def _():
  function _ (line 106) | def _(mo):
  function _ (line 114) | def _(undefined_variable):
  function _ (line 120) | def _():

FILE: tests/data/notebooks/outputs/ipynb_to_percent/Notebook with function and cell metadata 164.py
  function f (line 18) | def f(x):

FILE: tests/data/notebooks/outputs/ipynb_to_percent/evcxr_jupyter_tour.rs
  function fib (line 39) | pub fn fib(x: i32) -> i32 {
  function fib (line 50) | pub fn fib(x: i32) -> i32 {
  function evcxr_display (line 96) | pub fn evcxr_display(&self) {
  type EvcxrResult (line 123) | pub trait EvcxrResult {fn evcxr_display(&self);}
    method evcxr_display (line 123) | fn evcxr_display(&self);
    method evcxr_display (line 125) | fn evcxr_display(&self) {
    method evcxr_display (line 134) | fn evcxr_display(&self) {

FILE: tests/data/notebooks/outputs/ipynb_to_percent/hello_world_gonb.go
  function main (line 17) | func main() {
  function main (line 45) | func main() {
  function init_a (line 62) | func init_a() {

FILE: tests/data/notebooks/outputs/ipynb_to_percent/ijavascript.js
  function add (line 21) | function add(num1, num2) {
  class User (line 58) | class User {
    method constructor (line 59) | constructor(name){
    method sayHello (line 62) | sayHello(){

FILE: tests/data/notebooks/outputs/ipynb_to_percent/itypescript.ts
  function add (line 17) | function add(num1: number, num2: number): number {
  class User (line 27) | class User {
    method constructor (line 28) | constructor(private name: string) {
    method sayHello (line 31) | sayHello(): string {

FILE: tests/data/notebooks/outputs/ipynb_to_percent/simple-helloworld.java
  class A (line 16) | class A {
    method hello (line 17) | public void hello() {

FILE: tests/data/notebooks/outputs/ipynb_to_percent/xcpp_by_quantstack.cpp
  function j (line 62) | j
  function asqr (line 81) | asqr
  class Bar (line 107) | class Bar : public Foo
    method print (line 113) | virtual void print(double value) const
  class FooT (line 131) | class FooT
    method FooT (line 135) | explicit FooT(const T& t) : m_t(t) {}
    method print (line 137) | void print() const
  class FooT<int> (line 148) | class FooT<int>
    method FooT (line 152) | explicit FooT(const int& t) : m_t(t) {}
    method print (line 154) | void print() const
  class Foo11 (line 176) | class Foo11
    method Foo11 (line 180) | Foo11() { std::cout << "Foo11 default constructor" << std::endl; }
    method Foo11 (line 181) | Foo11(const Foo11&) { std::cout << "Foo11 copy constructor" << std::en...
    method Foo11 (line 182) | Foo11(Foo11&&) { std::cout << "Foo11 move constructor" << std::endl; }
  type ht (line 310) | namespace ht
    type html (line 312) | struct html
      method html (line 314) | inline html(const std::string& content)
    function mime_bundle_repr (line 321) | xeus::xjson mime_bundle_repr(const html& a)

FILE: tests/data/notebooks/outputs/ipynb_to_script/Notebook with function and cell metadata 164.py
  function f (line 16) | def f(x):

FILE: tests/data/notebooks/outputs/ipynb_to_script/evcxr_jupyter_tour.rs
  function fib (line 31) | pub fn fib(x: i32) -> i32 {
  function fib (line 39) | pub fn fib(x: i32) -> i32 {
  type Matrix (line 74) | pub struct Matrix<T> {pub values: Vec<T>, pub row_size: usize}
  function evcxr_display (line 76) | pub fn evcxr_display(&self) {
  type EvcxrResult (line 100) | pub trait EvcxrResult {fn evcxr_display(&self);}
    method evcxr_display (line 100) | fn evcxr_display(&self);
    method evcxr_display (line 102) | fn evcxr_display(&self) {
    method evcxr_display (line 111) | fn evcxr_display(&self) {

FILE: tests/data/notebooks/outputs/ipynb_to_script/hello_world_gonb.go
  function main (line 14) | func main() {
  function main (line 40) | func main() {
  function init_a (line 56) | func init_a() {

FILE: tests/data/notebooks/outputs/ipynb_to_script/ijavascript.js
  function add (line 17) | function add(num1, num2) {
  class User (line 45) | class User {
    method constructor (line 46) | constructor(name){
    method sayHello (line 49) | sayHello(){

FILE: tests/data/notebooks/outputs/ipynb_to_script/itypescript.ts
  function add (line 15) | function add(num1: number, num2: number): number {
  class User (line 23) | class User {
    method constructor (line 24) | constructor(private name: string) {
    method sayHello (line 27) | sayHello(): string {

FILE: tests/data/notebooks/outputs/ipynb_to_script/simple-helloworld.java
  class A (line 14) | class A {
    method hello (line 15) | public void hello() {

FILE: tests/data/notebooks/outputs/ipynb_to_script/xcpp_by_quantstack.cpp
  function j (line 54) | j
  function asqr (line 69) | asqr
  class Bar (line 90) | class Bar : public Foo
    method print (line 96) | virtual void print(double value) const
  class FooT (line 112) | class FooT
    method FooT (line 116) | explicit FooT(const T& t) : m_t(t) {}
    method print (line 118) | void print() const
  class FooT<int> (line 129) | class FooT<int>
    method FooT (line 133) | explicit FooT(const int& t) : m_t(t) {}
    method print (line 135) | void print() const
  class Foo11 (line 154) | class Foo11
    method Foo11 (line 158) | Foo11() { std::cout << "Foo11 default constructor" << std::endl; }
    method Foo11 (line 159) | Foo11(const Foo11&) { std::cout << "Foo11 copy constructor" << std::en...
    method Foo11 (line 160) | Foo11(Foo11&&) { std::cout << "Foo11 move constructor" << std::endl; }
  type ht (line 276) | namespace ht
    type html (line 278) | struct html
      method html (line 280) | inline html(const std::string& content)
    function mime_bundle_repr (line 287) | xeus::xjson mime_bundle_repr(const html& a)

FILE: tests/data/notebooks/outputs/ipynb_to_script_vim_folding_markers/Notebook with function and cell metadata 164.py
  function f (line 18) | def f(x):

FILE: tests/data/notebooks/outputs/ipynb_to_script_vscode_folding_markers/Notebook with function and cell metadata 164.py
  function f (line 18) | def f(x):

FILE: tests/external/cli/test_black.py
  function test_apply_black_on_python_notebooks (line 16) | def test_apply_black_on_python_notebooks(tmpdir, cwd_tmpdir, ipynb_py_fi...
  function test_black_invariant (line 44) | def test_black_invariant():
  function test_pipe_into_black (line 57) | def test_pipe_into_black():
  function test_pipe_into_autopep8 (line 66) | def test_pipe_into_autopep8():
  function test_pipe_into_flake8 (line 75) | def test_pipe_into_flake8():
  function test_apply_black_through_jupytext (line 88) | def test_apply_black_through_jupytext(tmpdir, python_notebook):
  function test_apply_black_and_sync_on_paired_notebook (line 135) | def test_apply_black_and_sync_on_paired_notebook(tmpdir, cwd_tmpdir, pyt...
  function test_apply_black_on_markdown_notebook (line 161) | def test_apply_black_on_markdown_notebook(tmpdir):
  function test_black_through_tempfile (line 197) | def test_black_through_tempfile(
  function test_pipe_black_removes_lines_to_next_cell_metadata (line 218) | def test_pipe_black_removes_lines_to_next_cell_metadata(
  function test_pipe_black_uses_warn_only_781 (line 246) | def test_pipe_black_uses_warn_only_781(tmpdir, cwd_tmpdir, code, black_s...
  function test_pipe_black_preserve_outputs (line 273) | def test_pipe_black_preserve_outputs(notebook_with_outputs, tmpdir, cwd_...

FILE: tests/external/cli/test_cli_check.py
  function non_black_notebook (line 9) | def non_black_notebook(python_notebook):
  function test_check_notebooks_left_or_right_black (line 14) | def test_check_notebooks_left_or_right_black(python_notebook, tmpdir, cw...
  function test_check_notebooks_left_or_right_not_black (line 23) | def test_check_notebooks_left_or_right_not_black(non_black_notebook, tmp...

FILE: tests/external/cli/test_isort.py
  function test_pipe_into_isort (line 9) | def test_pipe_into_isort():

FILE: tests/external/conftest.py
  function tmp_repo (line 6) | def tmp_repo(tmpdir):

FILE: tests/external/contents_manager/test_contentsmanager_external.py
  function test_save_load_paired_md_pandoc_notebook (line 13) | async def test_save_load_paired_md_pandoc_notebook(ipynb_py_R_jl_file, t...
  function test_save_load_paired_qmd_notebook (line 33) | async def test_save_load_paired_qmd_notebook(ipynb_py_R_jl_file, tmpdir,...

FILE: tests/external/docs/test_using_cli.py
  function test_jupytext_commands_in_the_documentation_work (line 17) | def test_jupytext_commands_in_the_documentation_work(tmpdir):

FILE: tests/external/jupyter_fs/test_jupyter_fs.py
  function cm_from_fs_meta_manager (line 12) | def cm_from_fs_meta_manager(tmpdir, request):
  function test_jupytext_jupyter_fs_metamanager (line 34) | async def test_jupytext_jupyter_fs_metamanager(cm_from_fs_meta_manager):
  function test_config_jupytext_jupyter_fs_meta_manager (line 78) | async def test_config_jupytext_jupyter_fs_meta_manager(tmpdir, cm_from_f...

FILE: tests/external/pre_commit/test_pre_commit_0_ipynb_to_py.py
  function test_pre_commit_hook_ipynb_to_py (line 11) | def test_pre_commit_hook_ipynb_to_py(tmpdir, cwd_tmpdir, tmp_repo, jupyt...

FILE: tests/external/pre_commit/test_pre_commit_1_sync.py
  function test_pre_commit_hook_sync (line 12) | def test_pre_commit_hook_sync(

FILE: tests/external/pre_commit/test_pre_commit_1_sync_with_config.py
  function test_pre_commit_hook_sync_with_config (line 9) | def test_pre_commit_hook_sync_with_config(

FILE: tests/external/pre_commit/test_pre_commit_1_sync_with_no_config.py
  function test_pre_commit_hook_sync_with_no_config (line 13) | def test_pre_commit_hook_sync_with_no_config(

FILE: tests/external/pre_commit/test_pre_commit_2_sync_nbstripout.py
  function test_pre_commit_hook_sync_nbstripout (line 9) | def test_pre_commit_hook_sync_nbstripout(

FILE: tests/external/pre_commit/test_pre_commit_3_sync_black_nbstripout.py
  function test_pre_commit_hook_sync_black_nbstripout (line 10) | def test_pre_commit_hook_sync_black_nbstripout(

FILE: tests/external/pre_commit/test_pre_commit_4_sync_execute.py
  function test_pre_commit_hook_sync_execute (line 10) | def test_pre_commit_hook_sync_execute(

FILE: tests/external/pre_commit/test_pre_commit_5_reformat_markdown.py
  function test_pre_commit_hook_sync_reformat_code_and_markdown (line 10) | def test_pre_commit_hook_sync_reformat_code_and_markdown(

FILE: tests/external/pre_commit/test_pre_commit_mode.py
  function test_is_untracked (line 11) | def test_is_untracked(tmpdir, cwd_tmpdir, tmp_repo):
  function test_ignore_unmatched_ignores (line 36) | def test_ignore_unmatched_ignores(tmpdir, cwd_tmpdir):
  function test_alert_untracked_alerts (line 48) | def test_alert_untracked_alerts(tmpdir, cwd_tmpdir, tmp_repo, capsys):
  function test_alert_untracked_alerts_when_using_sync (line 62) | def test_alert_untracked_alerts_when_using_sync(tmpdir, cwd_tmpdir, tmp_...
  function test_alert_untracked_alerts_for_modified (line 78) | def test_alert_untracked_alerts_for_modified(tmpdir, cwd_tmpdir, tmp_rep...
  function test_alert_inconsistent_versions (line 97) | def test_alert_inconsistent_versions(tmpdir, cwd_tmpdir, tmp_repo, capsys):
  function test_pre_commit_local_config (line 131) | def test_pre_commit_local_config(tmpdir, cwd_tmpdir, tmp_repo, python_no...
  function test_git_timestamp (line 161) | def test_git_timestamp(tmpdir, cwd_tmpdir, tmp_repo):
  function test_sync_pre_commit_mode_respects_commit_order_780 (line 207) | def test_sync_pre_commit_mode_respects_commit_order_780(
  function test_skip_execution (line 248) | def test_skip_execution(tmpdir, cwd_tmpdir, tmp_repo, python_notebook, c...

FILE: tests/external/pre_commit/test_pre_commit_scripts.py
  function git_in_tmpdir (line 13) | def git_in_tmpdir(tmpdir):
  function system_in_tmpdir (line 29) | def system_in_tmpdir(tmpdir):
  function test_pre_commit_hook (line 38) | def test_pre_commit_hook(tmpdir):
  function test_sync_with_pre_commit_hook (line 64) | def test_sync_with_pre_commit_hook(tmpdir):
  function test_pre_commit_hook_in_subfolder (line 140) | def test_pre_commit_hook_in_subfolder(tmpdir):
  function test_pre_commit_hook_py_to_ipynb_and_md (line 166) | def test_pre_commit_hook_py_to_ipynb_and_md(tmpdir):
  function test_pre_commit_hook_sync_black_flake8 (line 201) | def test_pre_commit_hook_sync_black_flake8(tmpdir, python_notebook):
  function test_pre_commit_hook_sync_flake8 (line 245) | def test_pre_commit_hook_sync_flake8(tmpdir, python_notebook):
  function test_manual_call_of_pre_commit_hook (line 277) | def test_manual_call_of_pre_commit_hook(tmpdir):
  function test_pre_commit_hook_with_subfolders_issue_506 (line 303) | def test_pre_commit_hook_with_subfolders_issue_506(tmpdir):
  function test_wrap_markdown_cell (line 347) | def test_wrap_markdown_cell(tmpdir):

FILE: tests/external/round_trip/test_mirror_external.py
  function test_ipynb_to_pandoc (line 13) | def test_ipynb_to_pandoc(ipynb_to_pandoc, no_jupytext_version_number):
  function test_ipynb_to_quarto (line 18) | def test_ipynb_to_quarto(
  function test_ipynb_to_python_sphinx (line 26) | def test_ipynb_to_python_sphinx(ipynb_to_sphinx, no_jupytext_version_num...
  function test_Rmd_to_ipynb (line 37) | def test_Rmd_to_ipynb(rmd_file, no_jupytext_version_number):
  function test_sphinx_to_ipynb (line 42) | def test_sphinx_to_ipynb(sphinx_file, no_jupytext_version_number):
  function test_sphinx_md_to_ipynb (line 47) | def test_sphinx_md_to_ipynb(sphinx_file, no_jupytext_version_number):

FILE: tests/external/rst2md/test_rst2md.py
  function test_rst2md (line 11) | def test_rst2md(tmpdir, cwd_tmpdir):
  function test_rst2md_option (line 49) | def test_rst2md_option(tmpdir):

FILE: tests/external/simple_external_notebooks/test_read_simple_pandoc.py
  function test_pandoc_implicit (line 11) | def test_pandoc_implicit(
  function test_pandoc_explicit (line 34) | def test_pandoc_explicit(
  function test_pandoc_utf8_in_md (line 49) | def test_pandoc_utf8_in_md(
  function test_pandoc_utf8_in_nb (line 63) | def test_pandoc_utf8_in_nb(
  function test_meaningfull_error_when_pandoc_is_missing (line 81) | def test_meaningfull_error_when_pandoc_is_missing(tmpdir):

FILE: tests/external/simple_external_notebooks/test_read_simple_quarto.py
  function test_qmd_to_ipynb (line 9) | def test_qmd_to_ipynb(

FILE: tests/external/test_marimo.py
  function py_marimo (line 9) | def py_marimo() -> str:
  function notebook (line 27) | def notebook():
  function test_guess_format (line 31) | def test_guess_format(py_marimo):
  function test_notebook_to_py_marimo (line 36) | def test_notebook_to_py_marimo(py_marimo, notebook):
  function test_marimo_py_to_notebook (line 42) | def test_marimo_py_to_notebook(py_marimo, notebook):

FILE: tests/functional/cli/test_cli.py
  function test_str2bool (line 26) | def test_str2bool():
  function test_cli_single_file (line 34) | def test_cli_single_file(ipynb_py_R_jl_file):
  function test_cli_multiple_files (line 38) | def test_cli_multiple_files(ipynb_py_R_jl_files):
  function test_convert_single_file_in_place (line 42) | def test_convert_single_file_in_place(ipynb_py_file, tmpdir):
  function test_convert_single_file_in_place_m (line 57) | def test_convert_single_file_in_place_m(ipynb_py_file, tmpdir):
  function test_convert_single_file (line 74) | def test_convert_single_file(ipynb_or_rmd_file, tmpdir, capsys):
  function test_jupytext_version (line 87) | def test_jupytext_version(capsys):
  function test_wildcard (line 95) | def test_wildcard(tmpdir):
  function test_to_cpluplus (line 115) | def test_to_cpluplus(ipynb_cpp_file, tmpdir, capsys):
  function test_convert_multiple_file (line 128) | def test_convert_multiple_file(ipynb_py_files, tmpdir):
  function test_error_not_notebook_ext_input (line 148) | def test_error_not_notebook_ext_input(tmpdir, capsys):
  function tmp_ipynb (line 158) | def tmp_ipynb(tmpdir):
  function tmp_py (line 165) | def tmp_py(tmpdir):
  function test_error_not_notebook_ext_to (line 172) | def test_error_not_notebook_ext_to(tmp_ipynb):
  function test_error_not_notebook_ext_output (line 177) | def test_error_not_notebook_ext_output(tmp_ipynb, tmpdir):
  function test_error_not_same_ext (line 185) | def test_error_not_same_ext(tmp_ipynb, tmpdir):
  function test_error_no_action (line 190) | def test_error_no_action(tmp_ipynb):
  function test_error_update_not_ipynb (line 195) | def test_error_update_not_ipynb(tmp_py):
  function test_error_multiple_input (line 200) | def test_error_multiple_input(tmp_ipynb):
  function test_error_opt_missing_equal (line 205) | def test_error_opt_missing_equal(tmp_ipynb):
  function test_error_unknown_opt (line 210) | def test_error_unknown_opt(tmp_ipynb):
  function test_combine_same_version_ok (line 215) | def test_combine_same_version_ok(tmpdir):
  function test_combine_lower_version_raises (line 255) | def test_combine_lower_version_raises(tmpdir):
  function test_ipynb_to_py_then_update_test (line 293) | def test_ipynb_to_py_then_update_test(ipynb_py_file, tmpdir):
  function test_test_to_ipynb_ignore_version_number_414 (line 304) | def test_test_to_ipynb_ignore_version_number_414(
  function test_convert_to_percent_format (line 333) | def test_convert_to_percent_format(ipynb_py_file, tmpdir):
  function test_convert_to_percent_format_and_keep_magics (line 351) | def test_convert_to_percent_format_and_keep_magics(ipynb_py_file, tmpdir):
  function test_set_formats (line 371) | def test_set_formats(python_file, tmpdir):
  function test_update_metadata (line 382) | def test_update_metadata(python_file, tmpdir, capsys):
  function test_set_kernel_inplace (line 414) | def test_set_kernel_inplace(python_file, tmpdir):
  function test_set_kernel_auto (line 428) | def test_set_kernel_auto(python_file, tmpdir):
  function test_set_kernel_with_name (line 443) | def test_set_kernel_with_name(python_file, tmpdir):
  function test_paired_paths (line 459) | def test_paired_paths(ipynb_py_file, tmpdir, capsys):
  function test_sync (line 474) | def test_sync(ipynb_py_file, tmpdir, cwd_tmpdir, capsys):
  function test_sync_pandoc (line 525) | def test_sync_pandoc(ipynb_to_pandoc, tmpdir, cwd_tmpdir, capsys):
  function test_cli_can_infer_jupytext_format (line 550) | def test_cli_can_infer_jupytext_format(ipynb_py_R_jl_file, ipynb_py_R_jl...
  function test_cli_to_script (line 568) | def test_cli_to_script(ipynb_py_R_jl_file, ipynb_py_R_jl_ext, tmpdir, cw...
  function test_cli_to_auto (line 579) | def test_cli_to_auto(ipynb_py_R_jl_file, ipynb_py_R_jl_ext, tmpdir, cwd_...
  function test_cli_can_infer_jupytext_format_from_stdin (line 590) | def test_cli_can_infer_jupytext_format_from_stdin(ipynb_py_file, tmpdir,...
  function test_set_kernel_works_with_pipes_326 (line 622) | def test_set_kernel_works_with_pipes_326(capsys):
  function test_cli_expect_errors (line 637) | def test_cli_expect_errors(tmp_ipynb):
  function test_format_prefix_suffix (line 660) | def test_format_prefix_suffix(tmpdir, cwd_tmpdir):
  function test_cli_sync_file_with_suffix (line 707) | def test_cli_sync_file_with_suffix(tmpdir, cwd_tmpdir):
  function test_cli_sync_file_with_prefix_974 (line 734) | def test_cli_sync_file_with_prefix_974(tmp_path, python_notebook):
  function test_remove_jupytext_metadata (line 761) | def test_remove_jupytext_metadata(tmpdir, cwd_tmpdir):
  function test_convert_and_update_preserves_notebook (line 791) | def test_convert_and_update_preserves_notebook(ipynb_py_file, fmt, tmpdi...
  function test_incorrect_notebook_causes_early_exit (line 815) | def test_incorrect_notebook_causes_early_exit(tmpdir, cwd_tmpdir):
  function test_warn_only_skips_incorrect_notebook (line 833) | def test_warn_only_skips_incorrect_notebook(tmpdir, cwd_tmpdir, capsys):
  function test_339_ipynb (line 854) | def test_339_ipynb(tmpdir, cwd_tmpdir, fmt):
  function test_339_py (line 862) | def test_339_py(tmpdir, cwd_tmpdir):
  function test_339_require_to (line 879) | def test_339_require_to(tmpdir, cwd_tmpdir):
  function test_399_to_script_then_set_formats (line 885) | def test_399_to_script_then_set_formats(tmpdir, cwd_tmpdir):
  function test_set_format_with_subfolder (line 897) | def test_set_format_with_subfolder(tmpdir, cwd_tmpdir):
  function skip_if_format_missing (line 914) | def skip_if_format_missing(format_name):
  function test_create_header_with_set_formats (line 923) | def test_create_header_with_set_formats(format_name, cwd_tmpdir, tmpdir):
  function test_create_header_with_set_formats_and_set_kernel (line 938) | def test_create_header_with_set_formats_and_set_kernel(format_name, tmpd...
  function test_set_option_split_at_heading (line 954) | def test_set_option_split_at_heading(tmpdir, cwd_tmpdir):
  function test_pair_in_tree (line 971) | def test_pair_in_tree(tmpdir):
  function test_pair_in_tree_and_parent (line 983) | def test_pair_in_tree_and_parent(tmpdir):
  function test_sync_pipe_config (line 996) | def test_sync_pipe_config(tmpdir):
  function test_sync_script_dotdot_folder_564 (line 1034) | def test_sync_script_dotdot_folder_564(tmpdir):
  function test_jupytext_to_file_emits_a_warning (line 1048) | def test_jupytext_to_file_emits_a_warning(tmpdir):
  function test_jupytext_set_formats_file_gives_an_informative_error (line 1067) | def test_jupytext_set_formats_file_gives_an_informative_error(tmpdir, cw...
  function test_diff (line 1095) | def test_diff(tmpdir, cwd_tmpdir, capsys):
  function test_show_changes (line 1104) | def test_show_changes(tmpdir, cwd_tmpdir, capsys):
  function test_glob_recursive (line 1113) | def test_glob_recursive(tmpdir, cwd_tmpdir):
  function test_jupytext_sync_preserves_cell_ids (line 1122) | def test_jupytext_sync_preserves_cell_ids(tmpdir, cwd_tmpdir, notebook_w...
  function test_jupytext_update_preserves_cell_ids (line 1142) | def test_jupytext_update_preserves_cell_ids(tmpdir, cwd_tmpdir, notebook...
  function test_jupytext_to_ipynb_suggests_update (line 1163) | def test_jupytext_to_ipynb_suggests_update(tmpdir, cwd_tmpdir, capsys):
  function test_jupytext_to_ipynb_does_not_update_timestamp_if_output_not_in_pair (line 1175) | def test_jupytext_to_ipynb_does_not_update_timestamp_if_output_not_in_pair(
  function test_jupytext_to_ipynb_does_not_update_timestamp_if_not_paired (line 1200) | def test_jupytext_to_ipynb_does_not_update_timestamp_if_not_paired(tmpdi...
  function test_use_source_timestamp (line 1221) | async def test_use_source_timestamp(tmpdir, cwd_tmpdir, python_notebook,...
  function test_round_trip_with_null_metadata_792 (line 1267) | def test_round_trip_with_null_metadata_792(tmpdir, cwd_tmpdir, python_no...
  function test_set_shebang_with_update_metadata (line 1285) | def test_set_shebang_with_update_metadata(tmp_path, python_notebook):
  function test_set_formats_does_not_override_existing_ipynb (line 1302) | def test_set_formats_does_not_override_existing_ipynb(tmp_path, notebook...
  function test_lexer_is_preserved_in_round_trips (line 1338) | def test_lexer_is_preserved_in_round_trips(
  function test_pipe_with_quiet_does_not_print (line 1357) | def test_pipe_with_quiet_does_not_print(tmp_path, capsys):
  function test_update_formats_1386 (line 1369) | def test_update_formats_1386(python_notebook, tmp_path, capsys):
  function test_paired_paths_from_notebook_metadata (line 1407) | def test_paired_paths_from_notebook_metadata(tmp_path, python_notebook, ...
  function test_paired_paths_from_config (line 1424) | def test_paired_paths_from_config(tmp_path, python_notebook, capsys):
  function test_sync_keeps_simple_python_file_unchanged (line 1442) | def test_sync_keeps_simple_python_file_unchanged(tmp_path, with_config: ...
  function test_set_formats_pairing_in_subfolders (line 1490) | def test_set_formats_pairing_in_subfolders(tmp_path, python_notebook):
  function test_sync_in_subfolders (line 1504) | def test_sync_in_subfolders(tmp_path, python_notebook):

FILE: tests/functional/cli/test_cli_config.py
  function test_pairing_through_config_leaves_ipynb_unmodified (line 11) | def test_pairing_through_config_leaves_ipynb_unmodified(tmpdir):
  function test_formats (line 28) | def test_formats(tmpdir):
  function test_formats_with_suffix (line 41) | def test_formats_with_suffix(tmpdir):
  function test_formats_does_not_apply_to_config_file (line 56) | def test_formats_does_not_apply_to_config_file(tmpdir):
  function test_preferred_jupytext_formats_save (line 68) | def test_preferred_jupytext_formats_save(tmpdir):
  function test_save_using_preferred_and_default_format (line 97) | def test_save_using_preferred_and_default_format(config, tmpdir):
  function test_hide_notebook_metadata (line 112) | def test_hide_notebook_metadata(tmpdir, no_jupytext_version_number):
  function test_cli_config_on_windows_issue_629 (line 145) | def test_cli_config_on_windows_issue_629(tmpdir):
  function test_sync_config_does_not_create_formats_metadata (line 160) | def test_sync_config_does_not_create_formats_metadata(tmpdir, cwd_tmpdir...
  function test_multiple_formats_771 (line 173) | def test_multiple_formats_771(tmpdir, cwd_tmpdir, python_notebook):

FILE: tests/functional/cli/test_source_is_newer.py
  function test_check_source_is_newer_when_using_jupytext_to (line 12) | def test_check_source_is_newer_when_using_jupytext_to(tmp_path, python_n...
  function test_check_source_is_newer_when_using_jupytext_sync (line 37) | def test_check_source_is_newer_when_using_jupytext_sync(tmp_path, python...

FILE: tests/functional/cli/test_synchronous_changes.py
  function test_jupytext_sync_raises_on_synchronous_edits (line 15) | def test_jupytext_sync_raises_on_synchronous_edits(tmp_path, python_note...
  function test_jupytext_to_raises_on_synchronous_edits (line 73) | def test_jupytext_to_raises_on_synchronous_edits(tmp_path, python_notebo...

FILE: tests/functional/config/test_config.py
  function change_dir (line 16) | def change_dir(path):
  function temp_folder_tree (line 27) | def temp_folder_tree(tmp_path):
  function test_issue_1440 (line 42) | def test_issue_1440(temp_folder_tree):
  function test_find_jupytext_configuration_file (line 55) | def test_find_jupytext_configuration_file(tmpdir):
  function test_jupytext_py_is_not_a_configuration_file (line 80) | def test_jupytext_py_is_not_a_configuration_file(tmpdir):
  function test_load_jupytext_configuration_file (line 103) | def test_load_jupytext_configuration_file(tmpdir, config_file):
  function test_jupytext_formats (line 192) | def test_jupytext_formats(tmpdir, content_toml, formats_short_form):
  function test_deprecated_formats_cause_warning (line 200) | def test_deprecated_formats_cause_warning(tmpdir, content_toml="default_...
  function test_deprecated_options_cause_warning (line 213) | def test_deprecated_options_cause_warning(tmpdir, option_name):
  function test_simple_py_file_is_not_paired (line 223) | def test_simple_py_file_is_not_paired(tmp_path):
  function test_pairing_groups (line 237) | def test_pairing_groups(tmp_path):
  function test_pairing_groups_multiple_groups (line 271) | def test_pairing_groups_multiple_groups(tmp_path):
  function test_formats_list_without_default (line 306) | def test_formats_list_without_default(tmp_path):
  function test_formats_list_yaml (line 330) | def test_formats_list_yaml(tmp_path):
  function test_formats_list_json (line 348) | def test_formats_list_json(tmp_path):
  function test_formats_semicolon_separated (line 372) | def test_formats_semicolon_separated(tmp_path):
  function test_formats_toml_list_of_strings (line 395) | def test_formats_toml_list_of_strings(tmp_path):

FILE: tests/functional/contents_manager/test_async_and_sync_contents_manager_are_in_sync.py
  function generate_sync_code_from_async_code (line 12) | def generate_sync_code_from_async_code(async_code: str) -> str:
  function test_async_and_sync_files_are_in_sync (line 46) | def test_async_and_sync_files_are_in_sync(async_file, sync_file):

FILE: tests/functional/docs/test_changelog.py
  function replace_issue_number_with_links (line 9) | def replace_issue_number_with_links(text):
  function test_replace_issue_numbers_with_links (line 34) | def test_replace_issue_numbers_with_links(input, output):
  function test_update_changelog (line 39) | def test_update_changelog():
  function test_version_matches_changelog (line 47) | def test_version_matches_changelog():
  function test_version_pep440_compliance (line 72) | def test_version_pep440_compliance():

FILE: tests/functional/docs/test_doc_files_are_notebooks.py
  function documentation_files (line 8) | def documentation_files():
  function test_doc_files_are_notebooks (line 19) | def test_doc_files_are_notebooks(doc_file):

FILE: tests/functional/metadata/test_metadata_filter.py
  function to_dict (line 12) | def to_dict(keys):
  function test_string_to_dict_conversion (line 32) | def test_string_to_dict_conversion(metadata_filter_string, metadata_filt...
  function test_metadata_filter_as_dict (line 36) | def test_metadata_filter_as_dict():
  function test_metadata_filter_default (line 42) | def test_metadata_filter_default():
  function test_metadata_filter_user_plus_default (line 47) | def test_metadata_filter_user_plus_default():
  function test_metadata_filter_user_overrides_default (line 57) | def test_metadata_filter_user_overrides_default():
  function test_negative_cell_metadata_filter (line 64) | def test_negative_cell_metadata_filter():
  function test_cell_metadata_filter_is_updated (line 68) | def test_cell_metadata_filter_is_updated():
  function test_notebook_metadata_all (line 86) | def test_notebook_metadata_all():
  function test_notebook_metadata_none (line 97) | def test_notebook_metadata_none():
  function test_filter_nested_metadata (line 103) | def test_filter_nested_metadata():
  function test_filter_out_execution_metadata (line 118) | def test_filter_out_execution_metadata():
  function test_default_config_has_priority_over_current_metadata (line 140) | def test_default_config_has_priority_over_current_metadata(
  function test_metadata_filter_in_notebook_757 (line 165) | def test_metadata_filter_in_notebook_757():

FILE: tests/functional/metadata/test_metadata_filters_from_config.py
  function test_metadata_filters_from_config (line 11) | def test_metadata_filters_from_config(tmpdir):
  function test_root_level_metadata_filters_from_config (line 54) | def test_root_level_metadata_filters_from_config(tmpdir):

FILE: tests/functional/others/test_active_cells.py
  function check_active_cell (line 63) | def check_active_cell(ext, active_dict):
  function test_active_all (line 73) | def test_active_all(ext, no_jupytext_version_number):
  function test_active_ipynb (line 107) | def test_active_ipynb(ext, no_jupytext_version_number):
  function test_active_ipynb_rmd_using_tags (line 141) | def test_active_ipynb_rmd_using_tags(ext, no_jupytext_version_number):
  function test_active_ipynb_rspin (line 160) | def test_active_ipynb_rspin(no_jupytext_version_number):
  function test_active_py_ipynb (line 194) | def test_active_py_ipynb(ext, no_jupytext_version_number):
  function test_active_py_r_ipynb (line 220) | def test_active_py_r_ipynb(ext, no_jupytext_version_number):
  function test_active_rmd (line 244) | def test_active_rmd(ext, no_jupytext_version_number):
  function test_active_not_include_rmd (line 268) | def test_active_not_include_rmd(ext, no_jupytext_version_number):
  function test_active_cells_from_py_percent (line 272) | def test_active_cells_from_py_percent(
  function test_comments_work_in_active_cells_from_py_percent_1131 (line 294) | def test_comments_work_in_active_cells_from_py_percent_1131(
  function test_comments_work_in_active_cells_from_py_light_1131 (line 307) | def test_comments_work_in_active_cells_from_py_light_1131(
  function test_comments_plus_code_work_in_active_cells_from_py_percent_1131 (line 320) | def test_comments_plus_code_work_in_active_cells_from_py_percent_1131(
  function test_comments_plus_code_work_in_active_cells_from_py_light_1131 (line 334) | def test_comments_plus_code_work_in_active_cells_from_py_light_1131(
  function test_active_cells_from_py_light (line 348) | def test_active_cells_from_py_light(

FILE: tests/functional/others/test_auto_ext.py
  function test_auto_in_fmt (line 7) | def test_auto_in_fmt(ipynb_py_R_file):
  function test_auto_from_kernelspecs_works (line 25) | def test_auto_from_kernelspecs_works(ipynb_file):
  function test_auto_in_formats (line 44) | def test_auto_in_formats(ipynb_py_R_jl_file):

FILE: tests/functional/others/test_cell_markers.py
  function test_set_cell_markers_cli (line 7) | def test_set_cell_markers_cli(tmpdir, cwd_tmpdir):
  function test_add_cell_to_script_with_cell_markers (line 14) | def test_add_cell_to_script_with_cell_markers(

FILE: tests/functional/others/test_cell_metadata.py
  function r_options_language_metadata (line 22) | def r_options_language_metadata():
  function test_parse_rmd_options (line 67) | def test_parse_rmd_options(options, language, metadata):
  function test_build_options (line 72) | def test_build_options(options, language, metadata):
  function test_build_options_random_order (line 77) | def test_build_options_random_order(options, language, metadata):
  function test_parsing_error (line 88) | def test_parsing_error(options):
  function test_ignore_metadata (line 93) | def test_ignore_metadata():
  function test_filter_metadata (line 99) | def test_filter_metadata():
  function test_try_eval_metadata (line 103) | def test_try_eval_metadata():
  function test_language_no_metadata (line 110) | def test_language_no_metadata(text="python", value=("python", {})):
  function test_only_metadata (line 115) | def test_only_metadata(text='key="value"', value=("", {"key": "value"})):
  function test_only_metadata_2 (line 120) | def test_only_metadata_2(text='key="value"', value=("", {"key": "value"})):
  function test_no_language (line 125) | def test_no_language(text=".class", value=("", {".class": None})):
  function test_language_metadata_no_space (line 130) | def test_language_metadata_no_space(text='python{"a":1}', value=("python...
  function test_title_no_metadata (line 135) | def test_title_no_metadata(text="title", value=("title", {})):
  function test_simple_metadata (line 140) | def test_simple_metadata(
  function test_simple_metadata_with_spaces (line 148) | def test_simple_metadata_with_spaces(
  function test_title_and_relax_json (line 156) | def test_title_and_relax_json(
  function test_title_and_json_dict (line 164) | def test_title_and_json_dict(
  function test_attribute (line 173) | def test_attribute(allow_title):
  function test_language_and_attribute (line 180) | def test_language_and_attribute(text="python .class", value=("python", {...
  function test_title_and_attribute (line 185) | def test_title_and_attribute(text="This is my title. .class", value=("Th...
  function test_values_with_equal_signs_inside (line 190) | def test_values_with_equal_signs_inside(text='python string="value=5"', ...
  function test_incorrectly_encoded (line 195) | def test_incorrectly_encoded(text="this is an incorrect expression d={{4...
  function test_incorrectly_encoded_json (line 200) | def test_incorrectly_encoded_json(text='this is an incorrect expression ...
  function test_parse_key_value (line 205) | def test_parse_key_value():
  function test_parse_key_value_key (line 212) | def test_parse_key_value_key():
  function test_is_valid_metadata_key (line 220) | def test_is_valid_metadata_key(key):
  function notebook_with_unsupported_key_in_metadata (line 225) | def notebook_with_unsupported_key_in_metadata(python_notebook):
  function test_unsupported_key_in_metadata (line 231) | def test_unsupported_key_in_metadata(notebook_with_unsupported_key_in_me...
  function notebook_with_collapsed_cell (line 246) | def notebook_with_collapsed_cell(python_notebook):
  function test_notebook_with_collapsed_cell (line 252) | def test_notebook_with_collapsed_cell(notebook_with_collapsed_cell, fmt_...
  function test_empty_tags_are_not_saved_in_text_notebooks (line 259) | def test_empty_tags_are_not_saved_in_text_notebooks(no_jupytext_version_...

FILE: tests/functional/others/test_cell_tags_are_preserved.py
  function notebook_with_tags (line 9) | def notebook_with_tags(python_notebook):
  function test_main_formats_support_cell_metadata (line 19) | def test_main_formats_support_cell_metadata(fmt):
  function test_tags_are_preserved (line 25) | def test_tags_are_preserved(notebook_with_tags, fmt_with_cell_metadata):

FILE: tests/functional/others/test_cells.py
  function test_paragraph_is_fully_commented (line 24) | def test_paragraph_is_fully_commented(lines):
  function test_paragraph_is_not_fully_commented (line 28) | def test_paragraph_is_not_fully_commented(lines="# text\nnot fully comme...
  function test_uncomment (line 32) | def test_uncomment():
  function test_text_to_code_cell (line 45) | def test_text_to_code_cell():
  function test_text_to_code_cell_empty_code (line 59) | def test_text_to_code_cell_empty_code():
  function test_text_to_code_cell_empty_code_no_blank_line (line 72) | def test_text_to_code_cell_empty_code_no_blank_line():
  function test_text_to_markdown_cell (line 85) | def test_text_to_markdown_cell():
  function test_text_to_markdown_no_blank_line (line 102) | def test_text_to_markdown_no_blank_line():
  function test_text_to_markdown_two_blank_line (line 118) | def test_text_to_markdown_two_blank_line():
  function test_text_to_markdown_one_blank_line (line 134) | def test_text_to_markdown_one_blank_line():
  function test_empty_markdown_to_text (line 149) | def test_empty_markdown_to_text():
  function test_text_to_cell_py (line 155) | def test_text_to_cell_py():
  function test_text_to_cell_py2 (line 165) | def test_text_to_cell_py2():
  function test_code_to_cell (line 176) | def test_code_to_cell():
  function test_uncomment_ocaml (line 187) | def test_uncomment_ocaml():

FILE: tests/functional/others/test_combine.py
  function test_combine (line 12) | def test_combine():
  function test_read_text_and_combine_with_outputs (line 45) | async def test_read_text_and_combine_with_outputs(tmpdir, cm):
  function test_combine_stable (line 135) | def test_combine_stable(ipynb_file):
  function test_combine_reorder (line 147) | def test_combine_reorder():
  function test_combine_split (line 183) | def test_combine_split():
  function test_combine_refactor (line 196) | def test_combine_refactor():
  function test_combine_attachments (line 211) | def test_combine_attachments():

FILE: tests/functional/others/test_custom_cell_magics.py
  function test_custom_cell_magics (line 9) | def test_custom_cell_magics(

FILE: tests/functional/others/test_doxygen.py
  function test_markdown_to_doxygen (line 22) | def test_markdown_to_doxygen():
  function test_doxygen_to_markdown (line 26) | def test_doxygen_to_markdown():
  function test_simple_equations_to_doxygen_and_back (line 42) | def test_simple_equations_to_doxygen_and_back(latex, doxygen):
  function test_doxygen_equation_markers (line 47) | def test_doxygen_equation_markers(tmpdir):

FILE: tests/functional/others/test_hide_remove_input_outputs_rmarkdown.py
  function test_jupyter_book_options_to_rmarkdown (line 16) | def test_jupyter_book_options_to_rmarkdown(md, rmd):
  function test_runtools_options_to_rmarkdown (line 57) | def test_runtools_options_to_rmarkdown(md, rmd):

FILE: tests/functional/others/test_invalid_file.py
  function invalid_md_file (line 14) | def invalid_md_file():
  function test_read_invalid_md_file_fails (line 19) | def test_read_invalid_md_file_fails(invalid_md_file):
  function test_convert_invalid_md_file_fails (line 25) | def test_convert_invalid_md_file_fails(invalid_md_file):
  function test_open_invalid_md_file_fails (line 31) | async def test_open_invalid_md_file_fails(invalid_md_file, tmp_path, cm):

FILE: tests/functional/others/test_jupytext_errors.py
  function test_read_wrong_ext (line 8) | def test_read_wrong_ext(tmpdir, nb_file="notebook.ext"):
  function test_write_wrong_ext (line 15) | def test_write_wrong_ext(tmpdir, nb_file="notebook.ext"):

FILE: tests/functional/others/test_jupytext_read.py
  function test_as_version_has_appropriate_type (line 7) | def test_as_version_has_appropriate_type():
  function test_read_file_with_explicit_fmt (line 12) | def test_read_file_with_explicit_fmt(tmpdir):

FILE: tests/functional/others/test_nbformat_version.py
  function sample_notebook_v3 (line 12) | def sample_notebook_v3():
  function sample_notebook_v3_json (line 17) | def sample_notebook_v3_json(sample_notebook_v3):
  function sample_notebook_v4_99 (line 22) | def sample_notebook_v4_99():
  function test_jupytext_can_read_nbformat_3 (line 28) | def test_jupytext_can_read_nbformat_3(
  function test_jupytext_gives_a_meaningful_error_when_writing_nbformat_3 (line 40) | def test_jupytext_gives_a_meaningful_error_when_writing_nbformat_3(sampl...
  function test_jupytext_gives_a_meaningful_error_when_writing_nbformat_4_99 (line 51) | def test_jupytext_gives_a_meaningful_error_when_writing_nbformat_4_99(sa...

FILE: tests/functional/others/test_preserve_empty_cells.py
  function test_file_with_blank_lines (line 9) | def test_file_with_blank_lines(blank_lines):
  function test_notebook_with_empty_cells (line 20) | def test_notebook_with_empty_cells(blank_cells):

FILE: tests/functional/others/test_pytest.py
  function test_run_pytest_ok (line 6) | def test_run_pytest_ok(
  function test_run_pytest_fail (line 21) | def test_run_pytest_fail(

FILE: tests/functional/others/test_raw_strings.py
  function test_markdown_cell_with_backslash_is_encoded_with_raw_string (line 8) | def test_markdown_cell_with_backslash_is_encoded_with_raw_string(
  function test_raw_string_is_stable_over_round_trip (line 27) | def test_raw_string_is_stable_over_round_trip(r, triple_quote, expr):

FILE: tests/functional/others/test_read_write_functions.py
  function test_simple_hook (line 11) | def test_simple_hook(tmpdir):
  function test_simple_hook_with_explicit_format (line 25) | def test_simple_hook_with_explicit_format(tmpdir):
  function test_no_error_on_path_object (line 40) | def test_no_error_on_path_object(tmpdir):
  function test_read_ipynb_from_stream (line 49) | def test_read_ipynb_from_stream():
  function test_read_py_percent_from_stream (line 76) | def test_read_py_percent_from_stream():

FILE: tests/functional/others/test_remove_encoding.py
  function test_remove_encoding_907 (line 6) | async def test_remove_encoding_907(tmp_path, python_notebook, cm):

FILE: tests/functional/others/test_sample_notebooks_are_normalized.py
  function test_sample_notebooks_are_normalized (line 12) | def test_sample_notebooks_are_normalized(any_nb_file):

FILE: tests/functional/others/test_save_multiple.py
  function test_rmd_is_ok (line 15) | async def test_rmd_is_ok(ipynb_file, tmpdir, cm):
  function test_ipynb_is_ok (line 31) | async def test_ipynb_is_ok(rmd_file, tmpdir, cm):
  function test_all_files_created (line 45) | async def test_all_files_created(ipynb_py_file, tmpdir, cm):
  function test_no_files_created_on_no_format (line 63) | async def test_no_files_created_on_no_format(tmpdir, cm):
  function test_raise_on_wrong_format (line 82) | async def test_raise_on_wrong_format(tmpdir, cm):
  function test_no_rmd_on_not_notebook (line 99) | async def test_no_rmd_on_not_notebook(tmpdir, cm):
  function test_no_rmd_on_not_v4 (line 111) | async def test_no_rmd_on_not_v4(tmpdir, cm):

FILE: tests/functional/others/test_trust_notebook.py
  function test_py_notebooks_are_trusted (line 13) | async def test_py_notebooks_are_trusted(python_file, cm):
  function test_rmd_notebooks_are_trusted (line 21) | async def test_rmd_notebooks_are_trusted(rmd_file, cm):
  function test_ipynb_notebooks_can_be_trusted (line 30) | async def test_ipynb_notebooks_can_be_trusted(ipynb_py_file, tmpdir, no_...
  function test_ipynb_notebooks_can_be_trusted_even_with_metadata_filter (line 75) | async def test_ipynb_notebooks_can_be_trusted_even_with_metadata_filter(...
  function test_text_notebooks_can_be_trusted (line 114) | async def test_text_notebooks_can_be_trusted(percent_file, tmpdir, no_ju...
  function test_simple_notebook_is_trusted (line 142) | async def test_simple_notebook_is_trusted(tmpdir, python_notebook, cm):
  function test_myst_notebook_is_trusted_941 (line 162) | async def test_myst_notebook_is_trusted_941(
  function test_paired_notebook_with_outputs_is_not_trusted_941 (line 200) | async def test_paired_notebook_with_outputs_is_not_trusted_941(tmp_path,...

FILE: tests/functional/others/test_unicode.py
  function test_notebook_contents_is_unicode (line 7) | def test_notebook_contents_is_unicode(ipynb_file):
  function test_rmd_notebook_contents_is_unicode (line 14) | def test_rmd_notebook_contents_is_unicode(rmd_file):
  function test_write_non_ascii (line 21) | def test_write_non_ascii(tmpdir):
  function test_no_encoding_in_python_scripts (line 27) | def test_no_encoding_in_python_scripts(no_jupytext_version_number):
  function test_encoding_in_scripts_only (line 57) | def test_encoding_in_scripts_only(no_jupytext_version_number):

FILE: tests/functional/others/test_write_does_not_modify_notebook.py
  function test_write_notebook_does_not_change_it (line 14) | def test_write_notebook_does_not_change_it(ipynb_py_R_jl_file, fmt, tmpd...

FILE: tests/functional/round_trip/test_jupytext_nbconvert_round_trip.py
  function test_markdown_jupytext_nbconvert_is_identity (line 8) | def test_markdown_jupytext_nbconvert_is_identity(md_file):
  function test_jupytext_markdown_similar_to_nbconvert (line 38) | def test_jupytext_markdown_similar_to_nbconvert(ipynb_py_R_jl_file):

FILE: tests/functional/round_trip/test_mirror.py
  function test_create_mirror_file_if_missing (line 22) | def test_create_mirror_file_if_missing(tmpdir, no_jupytext_version_number):
  function test_ipynb_to_percent (line 36) | def test_ipynb_to_percent(ipynb_file, no_jupytext_version_number):
  function test_ipynb_to_hydrogen (line 40) | def test_ipynb_to_hydrogen(ipynb_file, no_jupytext_version_number):
  function test_ipynb_to_light (line 44) | def test_ipynb_to_light(ipynb_to_light, no_jupytext_version_number):
  function test_ipynb_to_marimo (line 49) | def test_ipynb_to_marimo(marimo_compatible_ipynb, no_jupytext_version_nu...
  function test_ipynb_to_md (line 57) | def test_ipynb_to_md(ipynb_file, no_jupytext_version_number):
  function test_ipynb_to_Rmd (line 61) | def test_ipynb_to_Rmd(ipynb_file, no_jupytext_version_number):
  function test_ipynb_to_myst (line 66) | def test_ipynb_to_myst(ipynb_file, no_jupytext_version_number):
  function test_script_to_ipynb (line 79) | def test_script_to_ipynb(script_to_ipynb, no_jupytext_version_number):
  function test_percent_to_ipynb (line 83) | def test_percent_to_ipynb(percent_file, no_jupytext_version_number):
  function test_hydrogen_to_ipynb (line 87) | def test_hydrogen_to_ipynb(hydrogen_file, no_jupytext_version_number):
  function test_spin_to_ipynb (line 91) | def test_spin_to_ipynb(r_spin_file, no_jupytext_version_number):
  function test_marimo_to_ipynb (line 96) | def test_marimo_to_ipynb(marimo_file, no_jupytext_version_number):
  function test_md_to_ipynb (line 100) | def test_md_to_ipynb(md_file, no_jupytext_version_number):
  function test_myst_file_has_myst_format (line 105) | def test_myst_file_has_myst_format(myst_file):
  function test_myst_to_ipynb (line 113) | def test_myst_to_ipynb(myst_file, no_jupytext_version_number):
  function test_ipynb_to_percent_to_light (line 124) | def test_ipynb_to_percent_to_light(ipynb_file):
  function test_ipynb_to_python_vim (line 141) | def test_ipynb_to_python_vim(ipynb_py_file, no_jupytext_version_number):
  function test_ipynb_to_python_vscode (line 149) | def test_ipynb_to_python_vscode(ipynb_py_file, no_jupytext_version_number):
  function test_ipynb_to_r_light (line 157) | def test_ipynb_to_r_light(ipynb_R_file, no_jupytext_version_number):
  function test_ipynb_to_r_percent (line 161) | def test_ipynb_to_r_percent(ipynb_R_file, no_jupytext_version_number):
  function test_ipynb_to_R_spin (line 165) | def test_ipynb_to_R_spin(ipynb_R_file, no_jupytext_version_number):
  function test_ipynb_to_r_spin (line 169) | def test_ipynb_to_r_spin(ipynb_R_file, no_jupytext_version_number):
  function test_ipynb_to_scheme_light (line 174) | def test_ipynb_to_scheme_light(ipynb_scheme_file, extension, no_jupytext...
  function test_ipynb_to_scheme_percent (line 179) | def test_ipynb_to_scheme_percent(ipynb_scheme_file, extension, no_jupyte...

FILE: tests/functional/round_trip/test_myst_header.py
  function test_myst_header_is_stable_1247_using_inline_filter (line 12) | def test_myst_header_is_stable_1247_using_inline_filter(
  function test_myst_header_is_stable_1247_using_config (line 39) | def test_myst_header_is_stable_1247_using_config(
  function test_myst_frontmatter_metadata_combo (line 69) | def test_myst_frontmatter_metadata_combo(no_jupytext_version_number):

FILE: tests/functional/round_trip/test_read_all_py.py
  function test_identity_source_write_read (line 5) | def test_identity_source_write_read(py_file):

FILE: tests/functional/round_trip/test_rmd_to_ipynb.py
  function test_identity_write_read (line 5) | def test_identity_write_read(rmd_file, no_jupytext_version_number):
  function test_two_blank_lines_as_cell_separator (line 17) | def test_two_blank_lines_as_cell_separator():

FILE: tests/functional/simple_notebooks/test_ipynb_to_R.py
  function test_identity_source_write_read (line 9) | def test_identity_source_write_read(ipynb_R_file, ext):

FILE: tests/functional/simple_notebooks/test_ipynb_to_myst.py
  function test_bad_notebook_metadata (line 28) | def test_bad_notebook_metadata():
  function test_bad_code_metadata (line 43) | def test_bad_code_metadata():
  function test_bad_markdown_metadata (line 60) | def test_bad_markdown_metadata():
  function test_bad_markdown_metadata2 (line 73) | def test_bad_markdown_metadata2():
  function test_matches_mystnb (line 86) | def test_matches_mystnb():
  function test_not_installed (line 139) | def test_not_installed():
  function test_add_source_map (line 146) | def test_add_source_map():
  function test_meaningfull_error_write_myst_missing (line 174) | def test_meaningfull_error_write_myst_missing(tmpdir):
  function test_meaningfull_error_open_myst_missing (line 184) | async def test_meaningfull_error_open_myst_missing(tmpdir, cm):
  function test_myst_representation_same_cli_or_contents_manager (line 214) | async def test_myst_representation_same_cli_or_contents_manager(tmpdir, ...

FILE: tests/functional/simple_notebooks/test_ipynb_to_py.py
  function test_identity_source_write_read (line 7) | def test_identity_source_write_read(ipynb_py_file):

FILE: tests/functional/simple_notebooks/test_ipynb_to_rmd.py
  function test_identity_source_write_read (line 7) | def test_identity_source_write_read(ipynb_py_R_jl_file):

FILE: tests/functional/simple_notebooks/test_knitr_spin.py
  function test_jupytext_same_as_knitr_spin (line 4) | def test_jupytext_same_as_knitr_spin(r_spin_file, tmpdir):

FILE: tests/functional/simple_notebooks/test_read_dotnet_try_markdown.py
  function test_parse_metadata (line 6) | def test_parse_metadata():
  function test_parse_double_hyphen_metadata (line 12) | def test_parse_double_hyphen_metadata():
  function test_read_dotnet_try_markdown (line 18) | def test_read_dotnet_try_markdown(

FILE: tests/functional/simple_notebooks/test_read_empty_text_notebook.py
  function test_read_empty_text_notebook (line 11) | def test_read_empty_text_notebook(ext, tmp_path):

FILE: tests/functional/simple_notebooks/test_read_folding_markers.py
  function test_mark_cell_with_vim_folding_markers (line 7) | def test_mark_cell_with_vim_folding_markers(
  function test_mark_cell_with_vscode_pycharm_folding_markers (line 38) | def test_mark_cell_with_vscode_pycharm_folding_markers(
  function test_mark_cell_with_no_title_and_inner_region (line 65) | def test_mark_cell_with_no_title_and_inner_region(
  function test_adjacent_regions (line 108) | def test_adjacent_regions(
  function test_indented_markers_are_ignored (line 131) | def test_indented_markers_are_ignored(

FILE: tests/functional/simple_notebooks/test_read_incomplete_rmd.py
  function test_incomplete_header (line 4) | def test_incomplete_header(
  function test_code_in_markdown_block (line 21) | def test_code_in_markdown_block(
  function test_unterminated_header (line 58) | def test_unterminated_header(

FILE: tests/functional/simple_notebooks/test_read_simple_R.py
  function test_read_simple_file (line 8) | def test_read_simple_file(
  function test_read_less_simple_file (line 51) | def test_read_less_simple_file(
  function test_no_space_after_code (line 101) | def test_no_space_after_code(
  function test_read_write_script (line 135) | def test_read_write_script(
  function test_escape_start_pattern (line 148) | def test_escape_start_pattern(
  function test_read_simple_r (line 182) | def test_read_simple_r(

FILE: tests/functional/simple_notebooks/test_read_simple_clojure.py
  function test_read_simple_file (line 5) | def test_read_simple_file(

FILE: tests/functional/simple_notebooks/test_read_simple_csharp.py
  function test_simple_cs (line 8) | def test_simple_cs(lang):
  function test_csharp_magics (line 31) | def test_csharp_magics(no_jupytext_version_number, lang):
  function test_read_html_cell_from_md (line 61) | def test_read_html_cell_from_md(no_jupytext_version_number):

FILE: tests/functional/simple_notebooks/test_read_simple_go.py
  function test_read_simple_file (line 5) | def test_read_simple_file(
  function test_read_go_notebook_with_percent_percent_and_arguments (line 31) | def test_read_go_notebook_with_percent_percent_and_arguments(
  function test_read_go_notebook_with_magic_main (line 69) | def test_read_go_notebook_with_magic_main(
  function test_commented_magic (line 110) | def test_commented_magic(
  function test_magic_commands_are_commented (line 138) | def test_magic_commands_are_commented(

FILE: tests/functional/simple_notebooks/test_read_simple_groovy.py
  function test_read_simple_file (line 5) | def test_read_simple_file(

FILE: tests/functional/simple_notebooks/test_read_simple_hydrogen.py
  function test_read_simple_file (line 5) | def test_read_simple_file(
  function test_read_cell_with_metadata (line 61) | def test_read_cell_with_metadata(
  function test_read_nbconvert_script (line 79) | def test_read_nbconvert_script(
  function test_read_remove_blank_lines (line 122) | def test_read_remove_blank_lines(
  function test_no_crash_on_square_bracket (line 157) | def test_no_crash_on_square_bracket(
  function test_nbconvert_cell (line 167) | def test_nbconvert_cell(
  function test_nbformat_v3_nbpy_cell (line 180) | def test_nbformat_v3_nbpy_cell(

FILE: tests/functional/simple_notebooks/test_read_simple_ipynb.py
  function test_save_ipynb_with_jupytext_has_final_newline (line 8) | def test_save_ipynb_with_jupytext_has_final_newline(tmpdir):

FILE: tests/functional/simple_notebooks/test_read_simple_java.py
  function test_read_simple_file (line 5) | def test_read_simple_file(

FILE: tests/functional/simple_notebooks/test_read_simple_julia.py
  function test_read_simple_file (line 5) | def test_read_simple_file(

FILE: tests/functional/simple_notebooks/test_read_simple_markdown.py
  function test_read_mostly_py_markdown_file (line 13) | def test_read_mostly_py_markdown_file(
  function test_read_md_and_markdown_regions (line 93) | def test_read_md_and_markdown_regions(
  function test_read_mostly_R_markdown_file (line 143) | def test_read_mostly_R_markdown_file(
  function test_read_markdown_file_no_language (line 168) | def test_read_markdown_file_no_language(
  function test_read_julia_notebook (line 183) | def test_read_julia_notebook(
  function test_split_on_header (line 197) | def test_split_on_header(
  function test_split_on_header_after_two_blank_lines (line 217) | def test_split_on_header_after_two_blank_lines(
  function test_split_at_heading_in_metadata (line 230) | def test_split_at_heading_in_metadata(
  function test_code_cell_with_metadata (line 247) | def test_code_cell_with_metadata(
  function test_raw_cell_with_metadata_json (line 264) | def test_raw_cell_with_metadata_json(
  function test_raw_cell_with_metadata (line 280) | def test_raw_cell_with_metadata(
  function test_read_raw_cell_markdown_version_1_1 (line 296) | def test_read_raw_cell_markdown_version_1_1(
  function test_read_raw_cell_markdown_version_1_1_with_mimetype (line 322) | def test_read_raw_cell_markdown_version_1_1_with_mimetype(
  function test_markdown_cell_with_metadata_json (line 370) | def test_markdown_cell_with_metadata_json(
  function test_markdown_cell_with_metadata (line 389) | def test_markdown_cell_with_metadata(
  function test_two_markdown_cells (line 408) | def test_two_markdown_cells(
  function test_combine_md_version_one (line 432) | def test_combine_md_version_one():
  function test_jupyter_cell_is_not_split (line 470) | def test_jupyter_cell_is_not_split():
  function test_indented_code_is_not_split (line 505) | def test_indented_code_is_not_split():
  function test_non_jupyter_code_is_not_split (line 522) | def test_non_jupyter_code_is_not_split():
  function test_read_markdown_idl (line 541) | def test_read_markdown_idl(
  function test_read_markdown_IDL (line 567) | def test_read_markdown_IDL(
  function test_inactive_cell (line 593) | def test_inactive_cell(
  function test_inactive_cell_using_tag (line 606) | def test_inactive_cell_using_tag(
  function test_inactive_cell_using_noeval (line 619) | def test_inactive_cell_using_noeval(
  function test_noeval_followed_by_code_works (line 635) | def test_noeval_followed_by_code_works(
  function test_markdown_cell_with_code_works (line 661) | def test_markdown_cell_with_code_works(
  function test_markdown_cell_with_noeval_code_works (line 677) | def test_markdown_cell_with_noeval_code_works(
  function test_two_markdown_cell_with_code_works (line 693) | def test_two_markdown_cell_with_code_works(
  function test_two_markdown_cell_with_no_language_code_works (line 714) | def test_two_markdown_cell_with_no_language_code_works(
  function test_markdown_cell_with_code_inside_multiline_string_419 (line 735) | def test_markdown_cell_with_code_inside_multiline_string_419(
  function test_notebook_with_python3_magic (line 755) | def test_notebook_with_python3_magic(
  function test_update_metadata_filter (line 796) | def test_update_metadata_filter(
  function test_update_metadata_filter_2 (line 826) | def test_update_metadata_filter_2(
  function test_custom_metadata (line 856) | def test_custom_metadata(
  function test_hide_notebook_metadata (line 890) | def test_hide_notebook_metadata(
  function test_notebook_with_empty_header_1070 (line 924) | def test_notebook_with_empty_header_1070(

FILE: tests/functional/simple_notebooks/test_read_simple_matlab.py
  function test_hide_code_tag (line 7) | def test_hide_code_tag(
  function test_hide_code_tag_percent_format (line 23) | def test_hide_code_tag_percent_format(

FILE: tests/functional/simple_notebooks/test_read_simple_nomarker.py
  function test_write_reload_simple_notebook (line 12) | def test_write_reload_simple_notebook():
  function test_jupytext_cli_bare (line 58) | def test_jupytext_cli_bare(tmpdir):

FILE: tests/functional/simple_notebooks/test_read_simple_ocaml.py
  function test_read_simple_code (line 7) | def test_read_simple_code(
  function test_read_simple_markdown (line 24) | def test_read_simple_markdown(

FILE: tests/functional/simple_notebooks/test_read_simple_percent.py
  function test_read_simple_file (line 16) | def test_read_simple_file(
  function test_read_cell_with_metadata (line 79) | def test_read_cell_with_metadata(
  function test_read_nbconvert_script (line 97) | def test_read_nbconvert_script(
  function test_read_remove_blank_lines (line 139) | def test_read_remove_blank_lines(
  function test_no_crash_on_square_bracket (line 174) | def test_no_crash_on_square_bracket(
  function test_nbconvert_cell (line 184) | def test_nbconvert_cell(
  function test_nbformat_v3_nbpy_cell (line 197) | def test_nbformat_v3_nbpy_cell(
  function test_multiple_empty_cells (line 210) | def test_multiple_empty_cells():
  function test_first_cell_markdown_191 (line 228) | def test_first_cell_markdown_191():
  function test_multiline_comments_in_markdown_1 (line 245) | def test_multiline_comments_in_markdown_1():
  function test_multiline_comments_in_markdown_2 (line 261) | def test_multiline_comments_in_markdown_2():
  function test_multiline_comments_format_option (line 277) | def test_multiline_comments_format_option():
  function test_multiline_comments_in_raw_cell (line 293) | def test_multiline_comments_in_raw_cell():
  function test_multiline_comments_in_markdown_cell_no_line_return (line 308) | def test_multiline_comments_in_markdown_cell_no_line_return():
  function test_multiline_comments_in_markdown_cell_is_robust_to_additional_cell_marker (line 320) | def test_multiline_comments_in_markdown_cell_is_robust_to_additional_cel...
  function test_cell_markers_option_in_contents_manager (line 336) | async def test_cell_markers_option_in_contents_manager(tmpdir, cm):
  function test_cell_markers_in_config (line 379) | async def test_cell_markers_in_config(tmpdir, python_notebook, cm):
  function test_cell_markers_in_contents_manager (line 403) | async def test_cell_markers_in_contents_manager(tmpdir, cm):
  function test_cell_markers_in_contents_manager_does_not_impact_light_format (line 446) | async def test_cell_markers_in_contents_manager_does_not_impact_light_fo...
  function test_single_triple_quote_works (line 485) | def test_single_triple_quote_works(
  function test_docstring_with_quadruple_quote (line 505) | def test_docstring_with_quadruple_quote(
  function test_cell_marker_has_same_indentation_as_code (line 531) | def test_cell_marker_has_same_indentation_as_code(
  function test_read_simple_gonb_cell_with_double_percent (line 561) | def test_read_simple_gonb_cell_with_double_percent(
  function test_write_simple_gonb_cell_with_double_percent (line 590) | def test_write_simple_gonb_cell_with_double_percent(

FILE: tests/functional/simple_notebooks/test_read_simple_python.py
  function test_read_simple_file (line 13) | def test_read_simple_file(
  function test_read_less_simple_file (line 52) | def test_read_less_simple_file(
  function test_indented_comment (line 89) | def test_indented_comment(
  function test_non_pep8 (line 123) | def test_non_pep8(
  function test_read_non_pep8_file (line 148) | def test_read_non_pep8_file(
  function test_read_cell_two_blank_lines (line 176) | def test_read_cell_two_blank_lines(
  function test_read_cell_explicit_start (line 200) | def test_read_cell_explicit_start(
  function test_read_complex_cells (line 216) | def test_read_complex_cells(
  function test_read_prev_function (line 273) | def test_read_prev_function(
  function test_read_cell_with_one_blank_line_end (line 293) | def test_read_cell_with_one_blank_line_end(
  function test_read_code_cell_fully_commented (line 304) | def test_read_code_cell_fully_commented(
  function test_file_with_two_blank_line_end (line 322) | def test_file_with_two_blank_line_end(
  function test_one_blank_lines_after_endofcell (line 333) | def test_one_blank_lines_after_endofcell(
  function test_two_cells_with_explicit_start (line 365) | def test_two_cells_with_explicit_start(
  function test_escape_start_pattern (line 401) | def test_escape_start_pattern(
  function test_dictionary_with_blank_lines_not_broken (line 433) | def test_dictionary_with_blank_lines_not_broken(
  function test_isolated_cell_with_magic (line 469) | def test_isolated_cell_with_magic(
  function test_ipython_help_are_commented_297 (line 507) | def test_ipython_help_are_commented_297(
  function test_questions_in_unmarked_cells_are_not_uncommented_297 (line 544) | def test_questions_in_unmarked_cells_are_not_uncommented_297(
  function test_read_multiline_comment (line 565) | def test_read_multiline_comment(
  function test_no_space_after_code (line 599) | def test_no_space_after_code(
  function test_read_write_script (line 623) | def test_read_write_script(
  function test_read_write_script_with_metadata_241 (line 634) | def test_read_write_script_with_metadata_241(
  function test_notebook_blank_lines (line 663) | def test_notebook_blank_lines(
  function test_notebook_two_blank_lines_before_next_cell (line 714) | def test_notebook_two_blank_lines_before_next_cell(
  function test_notebook_one_blank_line_between_cells (line 750) | def test_notebook_one_blank_line_between_cells(
  function test_notebook_with_magic_and_bash_cells (line 805) | def test_notebook_with_magic_and_bash_cells(
  function test_notebook_no_line_to_next_cell (line 825) | def test_notebook_no_line_to_next_cell(
  function test_notebook_one_blank_line_before_first_markdown_cell (line 844) | def test_notebook_one_blank_line_before_first_markdown_cell(
  function test_read_markdown_cell_with_triple_quote_307 (line 863) | def test_read_markdown_cell_with_triple_quote_307(
  function test_read_explicit_markdown_cell_with_triple_quote_307 (line 885) | def test_read_explicit_markdown_cell_with_triple_quote_307(
  function test_round_trip_markdown_cell_with_magic (line 910) | def test_round_trip_markdown_cell_with_magic():
  function test_round_trip_python_with_js_cell (line 920) | def test_round_trip_python_with_js_cell():
  function test_round_trip_python_with_js_cell_no_cell_metadata (line 938) | def test_round_trip_python_with_js_cell_no_cell_metadata():
  function test_raw_with_metadata (line 962) | def test_raw_with_metadata(
  function test_raw_with_metadata_2 (line 975) | def test_raw_with_metadata_2(
  function test_markdown_with_metadata (line 987) | def test_markdown_with_metadata(
  function test_multiline_comments_in_markdown_1 (line 999) | def test_multiline_comments_in_markdown_1():
  function test_multiline_comments_in_markdown_2 (line 1015) | def test_multiline_comments_in_markdown_2():
  function test_multiline_comments_in_raw_cell (line 1031) | def test_multiline_comments_in_raw_cell():
  function test_multiline_comments_in_markdown_cell_no_line_return (line 1046) | def test_multiline_comments_in_markdown_cell_no_line_return():
  function test_multiline_comments_in_markdown_cell_is_robust_to_additional_cell_marker (line 1058) | def test_multiline_comments_in_markdown_cell_is_robust_to_additional_cel...
  function test_active_tag (line 1073) | def test_active_tag(
  function test_indented_bash_command (line 1093) | def test_indented_bash_command(
  function test_two_raw_cells_are_preserved (line 1120) | def test_two_raw_cells_are_preserved(nb=new_notebook(cells=[new_raw_cell...
  function test_no_metadata_on_multiline_decorator (line 1127) | def test_no_metadata_on_multiline_decorator(
  function test_indented_magic_commands (line 1181) | def test_indented_magic_commands(script, cell):

FILE: tests/functional/simple_notebooks/test_read_simple_rmd.py
  function test_read_mostly_py_rmd_file (line 18) | def test_read_mostly_py_rmd_file(
  function test_markdown_cell_with_code_works (line 67) | def test_markdown_cell_with_code_works(
  function test_two_markdown_cell_with_code_works (line 83) | def test_two_markdown_cell_with_code_works(
  function test_tags_in_rmd (line 104) | def test_tags_in_rmd(
  function round_trip_cell_metadata (line 125) | def round_trip_cell_metadata(cell_metadata):
  function test_comma_in_metadata (line 135) | def test_comma_in_metadata(cell_metadata={"a": "b, c"}):
  function test_dict_in_metadata (line 139) | def test_dict_in_metadata(cell_metadata={"a": {"b": "c"}}):
  function test_list_in_metadata (line 143) | def test_list_in_metadata(cell_metadata={"d": ["e"]}):
  function test_root_level_metadata_as_raw_cell (line 148) | def test_root_level_metadata_as_raw_cell(
  function test_pair_rmd_file_with_cell_tags_and_options (line 198) | def test_pair_rmd_file_with_cell_tags_and_options(tmpdir, cwd_tmpdir, no...
  function test_apostrophe_in_parameter_1079 (line 229) | def test_apostrophe_in_parameter_1079(
  function test_commented_triple_quote_1060 (line 243) | def test_commented_triple_quote_1060(line):
  function test_bibliography_in_rmd (line 261) | def test_bibliography_in_rmd(
  function test_non_language_code_fence (line 284) | def test_non_language_code_fence():

FILE: tests/functional/simple_notebooks/test_read_simple_rust.py
  function test_read_magics (line 7) | def test_read_magics(text="// :vars\n"):
  function test_read_simple_file (line 13) | def test_read_simple_file(
  function test_read_write_script_with_metadata_241 (line 64) | def test_read_write_script_with_metadata_241(

FILE: tests/functional/simple_notebooks/test_read_simple_scheme.py
  function test_read_simple_file (line 5) | def test_read_simple_file(

FILE: tests/functional/simple_notebooks/test_read_simple_sphinx.py
  function test_read_simple_file (line 5) | def test_read_simple_file(
  function test_read_more_complex_file (line 60) | def test_read_more_complex_file(
  function test_read_empty_code_cell (line 119) | def test_read_empty_code_cell(

FILE: tests/integration/cli/test_cli_pipe.py
  function test_cli_black_myst (line 8) | def test_cli_black_myst(

FILE: tests/integration/cli/test_execute.py
  function test_pipe_nbconvert_execute (line 15) | def test_pipe_nbconvert_execute(tmpdir):
  function test_pipe_nbconvert_execute_sync (line 45) | def test_pipe_nbconvert_execute_sync(tmpdir):
  function test_execute (line 76) | def test_execute(tmpdir, caplog, capsys):
  function test_execute_readme_ok (line 95) | def test_execute_readme_ok(tmpdir):
  function test_execute_readme_not_ok (line 115) | def test_execute_readme_not_ok(tmpdir):
  function test_execute_sync (line 138) | def test_execute_sync(tmpdir, caplog, capsys):
  function test_execute_r (line 158) | def test_execute_r(tmpdir, caplog, capsys):  # pragma: no cover
  function test_execute_in_subfolder (line 180) | def test_execute_in_subfolder(tmpdir, caplog, capsys):
  function sample_md_notebook (line 239) | def sample_md_notebook():
  function test_execute_text_file_does_update_the_metadata (line 259) | def test_execute_text_file_does_update_the_metadata(sample_md_notebook, ...
  function test_cat_execute_does_not_update_the_metadata (line 271) | def test_cat_execute_does_not_update_the_metadata(sample_md_notebook, tm...
  function test_utf8_out_331 (line 288) | def test_utf8_out_331(capsys, caplog):

FILE: tests/integration/contents_manager/test_cm_config.py
  function test_local_config_overrides_cm_config (line 20) | async def test_local_config_overrides_cm_config(tmpdir, cm):
  function test_config_file_is_called_just_once (line 37) | async def test_config_file_is_called_just_once(tmpdir, cm, n=2):
  function test_pairing_through_config_leaves_ipynb_unmodified (line 59) | async def test_pairing_through_config_leaves_ipynb_unmodified(tmpdir, cm):
  function test_incorrect_config_message (line 91) | async def test_incorrect_config_message(tmpdir, cfg_file, cfg_text, cm):
  function test_global_config_file (line 106) | async def test_global_config_file(tmpdir, cm):
  function test_paired_files_and_symbolic_links (line 132) | async def test_paired_files_and_symbolic_links(tmpdir, cm):
  function test_metadata_filter_from_config_has_precedence_over_notebook_metadata (line 170) | async def test_metadata_filter_from_config_has_precedence_over_notebook_...
  function test_test_no_text_representation_metadata_in_ipynb_900 (line 182) | async def test_test_no_text_representation_metadata_in_ipynb_900(tmpdir,...
  function test_cm_config_no_log (line 207) | async def test_cm_config_no_log(cwd_tmp_path, tmp_path, caplog, cm):
  function test_cm_config_log_only_if_changed (line 227) | async def test_cm_config_log_only_if_changed(cwd_tmp_path, tmp_path, cap...

FILE: tests/integration/contents_manager/test_contentsmanager.py
  function test_rename (line 23) | async def test_rename(tmpdir, cm):
  function test_rename_inconsistent_path (line 35) | async def test_rename_inconsistent_path(tmpdir, cm):
  function test_pair_unpair_notebook (line 56) | async def test_pair_unpair_notebook(tmpdir, cm):
  function test_load_save_rename (line 108) | async def test_load_save_rename(ipynb_py_R_jl_file, cm, tmpdir):
  function test_save_load_paired_md_notebook (line 150) | async def test_save_load_paired_md_notebook(ipynb_py_R_jl_file, cm, tmpd...
  function test_pair_plain_script (line 167) | async def test_pair_plain_script(percent_file, cm, tmpdir, caplog):
  function test_load_save_rename_nbpy (line 207) | async def test_load_save_rename_nbpy(ipynb_py_file, cm, tmpdir):
  function test_load_save_py_freeze_metadata (line 236) | async def test_load_save_py_freeze_metadata(python_file, cm, tmpdir):
  function test_load_text_notebook (line 262) | async def test_load_text_notebook(tmpdir, cm):
  function test_load_save_rename_notebook_with_dot (line 285) | async def test_load_save_rename_notebook_with_dot(ipynb_py_file, cm, tmp...
  function test_load_save_rename_nbpy_default_config (line 310) | async def test_load_save_rename_nbpy_default_config(ipynb_py_file, cm, t...
  function test_load_save_rename_non_ascii_path (line 348) | async def test_load_save_rename_non_ascii_path(ipynb_py_file, cm, tmpdir):
  function test_outdated_text_notebook (line 387) | async def test_outdated_text_notebook(python_notebook, cm, tmpdir):
  function test_outdated_text_notebook_no_diff_ok (line 422) | async def test_outdated_text_notebook_no_diff_ok(tmpdir, cm, python_note...
  function test_outdated_text_notebook_diff_is_shown (line 448) | async def test_outdated_text_notebook_diff_is_shown(tmpdir, cm, python_n...
  function test_reload_notebook_after_jupytext_cli (line 497) | async def test_reload_notebook_after_jupytext_cli(python_notebook, cm, t...
  function test_load_save_percent_format (line 523) | async def test_load_save_percent_format(percent_file, cm, tmpdir):
  function test_save_to_percent_format (line 551) | async def test_save_to_percent_format(ipynb_julia_file, cm, tmpdir):
  function test_save_using_preferred_and_default_format_170 (line 573) | async def test_save_using_preferred_and_default_format_170(ipynb_py_file...
  function test_open_using_preferred_and_default_format_174 (line 618) | async def test_open_using_preferred_and_default_format_174(ipynb_py_file...
  function test_kernelspec_are_preserved (line 652) | async def test_kernelspec_are_preserved(ipynb_py_file, cm, tmpdir):
  function test_save_to_light_percent_sphinx_format (line 680) | async def test_save_to_light_percent_sphinx_format(ipynb_py_file, cm, tm...
  function test_pair_notebook_with_dot (line 717) | async def test_pair_notebook_with_dot(ipynb_py_file, cm, tmpdir):
  function test_preferred_format_allows_to_read_others_format (line 745) | async def test_preferred_format_allows_to_read_others_format(python_note...
  function test_preferred_formats_read_auto (line 786) | async def test_preferred_formats_read_auto(tmpdir, cm):
  function test_save_in_auto_extension_global (line 806) | async def test_save_in_auto_extension_global(ipynb_py_R_jl_file, cm, tmp...
  function test_global_auto_pairing_works_with_empty_notebook (line 835) | async def test_global_auto_pairing_works_with_empty_notebook(tmpdir, cm):
  function test_save_in_auto_extension_global_with_format (line 887) | async def test_save_in_auto_extension_global_with_format(ipynb_py_R_jl_f...
  function test_save_in_auto_extension_local (line 915) | async def test_save_in_auto_extension_local(ipynb_py_R_jl_file, cm, tmpd...
  function test_save_in_pct_and_lgt_auto_extensions (line 940) | async def test_save_in_pct_and_lgt_auto_extensions(ipynb_py_R_jl_file, c...
  function test_metadata_filter_is_effective (line 966) | async def test_metadata_filter_is_effective(ipynb_py_R_jl_file, cm, tmpd...
  function test_no_metadata_added_to_scripts_139 (line 1007) | async def test_no_metadata_added_to_scripts_139(tmpdir, cm):
  function test_local_format_can_deactivate_pairing (line 1052) | async def test_local_format_can_deactivate_pairing(ipynb_py_file, cm, ex...
  function test_global_pairing_allows_to_save_other_file_types (line 1079) | async def test_global_pairing_allows_to_save_other_file_types(rmd_file, ...
  function test_python_kernel_preserves_R_files (line 1100) | async def test_python_kernel_preserves_R_files(r_file, cm, tmpdir):
  function test_pair_notebook_in_another_folder (line 1122) | async def test_pair_notebook_in_another_folder(tmpdir, cm):
  function test_pair_notebook_in_dotdot_folder (line 1145) | async def test_pair_notebook_in_dotdot_folder(tmpdir, cm):
  function test_split_at_heading_option (line 1166) | async def test_split_at_heading_option(tmpdir, cm):
  function test_load_then_change_formats (line 1192) | async def test_load_then_change_formats(tmpdir, cm):
  function test_set_then_change_formats (line 1225) | async def test_set_then_change_formats(tmpdir, cm):
  function test_set_then_change_auto_formats (line 1247) | async def test_set_then_change_auto_formats(tmpdir, cm, python_notebook):
  function test_share_py_recreate_ipynb (line 1284) | async def test_share_py_recreate_ipynb(tmpdir, cm, ipynb_py_R_jl_file):
  function test_vim_folding_markers (line 1319) | async def test_vim_folding_markers(tmpdir, cm):
  function test_vscode_pycharm_folding_markers (line 1374) | async def test_vscode_pycharm_folding_markers(tmpdir, cm):
  function test_open_file_with_cell_markers (line 1429) | async def test_open_file_with_cell_markers(tmpdir, cm):
  function test_save_file_with_cell_markers (line 1466) | async def test_save_file_with_cell_markers(tmpdir, cm):
  function test_notebook_extensions (line 1508) | async def test_notebook_extensions(tmpdir, cm, cwd_tmpdir):
  function test_notebook_extensions_in_config (line 1527) | async def test_notebook_extensions_in_config(tmpdir, cm, cwd_tmpdir):
  function test_invalid_config_in_cm (line 1546) | async def test_invalid_config_in_cm(tmpdir, cm, cwd_tmpdir):
  function test_download_file_318 (line 1564) | async def test_download_file_318(tmpdir, cm):
  function test_markdown_and_r_extensions (line 1580) | async def test_markdown_and_r_extensions(tmpdir, cm):
  function test_server_extension_issubclass (line 1597) | async def test_server_extension_issubclass(cm):
  function test_multiple_pairing (line 1605) | async def test_multiple_pairing(tmpdir, cm):
  function test_filter_jupytext_version_information_416 (line 1659) | async def test_filter_jupytext_version_information_416(python_notebook, ...
  function test_new_untitled (line 1684) | async def test_new_untitled(tmpdir, cm):
  function test_nested_prefix (line 1708) | async def test_nested_prefix(tmpdir, cm):
  function test_timestamp_is_correct_after_reload_978 (line 1721) | async def test_timestamp_is_correct_after_reload_978(tmp_path, cm, pytho...
  function test_move_paired_notebook_to_subdir_1059 (line 1762) | async def test_move_paired_notebook_to_subdir_1059(tmp_path, cm, python_...
  function list_folder_contents (line 1787) | def list_folder_contents(tmp_path):
  function test_move_paired_notebook_outside_of_notebook_dir_1414 (line 1797) | async def test_move_paired_notebook_outside_of_notebook_dir_1414(tmp_pat...
  function test_move_paired_notebook_outside_of_pairing_config_1414 (line 1831) | async def test_move_paired_notebook_outside_of_pairing_config_1414(tmp_p...
  function test_hash_changes_if_paired_file_is_edited (line 1868) | async def test_hash_changes_if_paired_file_is_edited(tmp_path, cm, pytho...
  function test_metadata_stays_in_order_1368 (line 1907) | async def test_metadata_stays_in_order_1368(
  function test_jupytext_orders_root_metadata (line 1942) | async def test_jupytext_orders_root_metadata(
  function test_load_save_keeps_simple_python_file_unchanged (line 1983) | async def test_load_save_keeps_simple_python_file_unchanged(tmp_path, cm...
  function test_pairing_groups_in_contents_manager (line 2027) | async def test_pairing_groups_in_contents_manager(tmp_path, cm, python_n...

FILE: tests/integration/contents_manager/test_load_multiple.py
  function test_combine_same_version_ok (line 10) | async def test_combine_same_version_ok(tmpdir, cm):
  function test_combine_lower_version_raises (line 40) | async def test_combine_lower_version_raises(tmpdir, cm):

FILE: tests/integration/jupytext_config/test_jupytext_config.py
  function test_jupytext_config_cli (line 4) | def test_jupytext_config_cli(tmp_path):

FILE: tests/unit/test_cell_id.py
  function test_cell_id_is_not_random (line 4) | def test_cell_id_is_not_random():

FILE: tests/unit/test_compare.py
  function notebook_metadata (line 18) | def notebook_metadata():
  function notebook_expected (line 51) | def notebook_expected():
  function notebook_actual (line 63) | def notebook_actual():
  function test_compare_on_notebooks (line 76) | def test_compare_on_notebooks(notebook_actual, notebook_expected):
  function test_raise_on_different_metadata (line 106) | def test_raise_on_different_metadata():
  function test_raise_on_different_cell_type (line 126) | def test_raise_on_different_cell_type(raise_on_first_difference):
  function test_raise_on_different_cell_content (line 134) | def test_raise_on_different_cell_content(raise_on_first_difference):
  function test_raise_on_incomplete_markdown_cell (line 141) | def test_raise_on_incomplete_markdown_cell():
  function test_does_raise_on_split_markdown_cell (line 148) | def test_does_raise_on_split_markdown_cell():
  function test_raise_on_different_cell_metadata (line 155) | def test_raise_on_different_cell_metadata():
  function test_raise_on_different_cell_count (line 163) | def test_raise_on_different_cell_count(raise_on_first_difference):
  function test_does_not_raise_on_blank_line_removed (line 173) | def test_does_not_raise_on_blank_line_removed():
  function test_strict_raise_on_blank_line_removed (line 179) | def test_strict_raise_on_blank_line_removed():
  function test_dont_raise_on_different_outputs (line 186) | def test_dont_raise_on_different_outputs():
  function test_raise_on_different_outputs (line 207) | def test_raise_on_different_outputs(raise_on_first_difference):
  function test_test_round_trip_conversion (line 234) | def test_test_round_trip_conversion():
  function test_mutiple_cells_differ (line 255) | def test_mutiple_cells_differ():
  function test_cell_metadata_differ (line 263) | def test_cell_metadata_differ():
  function test_notebook_metadata_differ (line 281) | def test_notebook_metadata_differ():
  function test_cell_ids_differ (line 298) | def test_cell_ids_differ():

FILE: tests/unit/test_escape_magics.py
  function test_unesc (line 16) | def test_unesc():
  function test_escape (line 33) | def test_escape(line):
  function test_escape_magic_only (line 39) | def test_escape_magic_only(line):
  function test_force_noescape (line 44) | def test_force_noescape(line):
  function test_force_noescape_with_gbl_esc_flag (line 49) | def test_force_noescape_with_gbl_esc_flag(line):
  function test_force_escape_with_gbl_esc_flag (line 54) | def test_force_escape_with_gbl_esc_flag(line):
  function test_magics_commented_default (line 74) | def test_magics_commented_default(fmt, commented):
  function test_magics_are_commented (line 91) | def test_magics_are_commented(fmt):
  function test_magics_are_not_commented (line 116) | def test_magics_are_not_commented(fmt):
  function test_force_comment_using_contents_manager (line 138) | async def test_force_comment_using_contents_manager(tmpdir, cm):
  function test_comment_bash_commands_in_python (line 187) | def test_comment_bash_commands_in_python(magic_cmd):
  function test_do_not_comment_python_cmds (line 196) | def test_do_not_comment_python_cmds(not_magic_cmd):
  function test_do_not_comment_bash_commands_in_R (line 202) | def test_do_not_comment_bash_commands_in_R(magic_cmd):
  function test_markdown_image_is_not_magic (line 207) | def test_markdown_image_is_not_magic():
  function test_question_is_not_magic (line 212) | def test_question_is_not_magic():
  function test_multiline_python_magic (line 218) | def test_multiline_python_magic(no_jupytext_version_number):
  function test_configure_magic (line 247) | def test_configure_magic(no_jupytext_version_number):
  function test_indented_magic (line 267) | def test_indented_magic():
  function test_magic_assign_781 (line 277) | def test_magic_assign_781():
  function test_magic_assign_816 (line 285) | def test_magic_assign_816():

FILE: tests/unit/test_formats.py
  function test_guess_format_light (line 21) | def test_guess_format_light(python_file):
  function test_guess_format_percent (line 26) | def test_guess_format_percent(percent_file):
  function test_guess_format_simple_percent (line 31) | def test_guess_format_simple_percent(
  function test_guess_format_simple_percent_with_magic (line 39) | def test_guess_format_simple_percent_with_magic(
  function test_guess_format_simple_hydrogen_with_magic (line 48) | def test_guess_format_simple_hydrogen_with_magic(
  function test_guess_format_sphinx (line 57) | def test_guess_format_sphinx(sphinx_file):
  function test_guess_format_hydrogen (line 62) | def test_guess_format_hydrogen():
  function test_divine_format (line 69) | def test_divine_format():
  function test_get_format_implementation (line 117) | def test_get_format_implementation():
  function test_script_with_magics_not_percent (line 124) | def test_script_with_magics_not_percent(
  function test_script_with_spyder_cell_is_percent (line 131) | def test_script_with_spyder_cell_is_percent(
  function test_script_with_percent_cell_and_magic_is_hydrogen (line 138) | def test_script_with_percent_cell_and_magic_is_hydrogen(
  function test_script_with_percent_cell_and_kernelspec (line 146) | def test_script_with_percent_cell_and_kernelspec(
  function test_script_with_spyder_cell_with_name_is_percent (line 162) | def test_script_with_spyder_cell_with_name_is_percent(
  function test_read_format_from_metadata (line 169) | def test_read_format_from_metadata(
  function test_update_jupytext_formats_metadata (line 184) | def test_update_jupytext_formats_metadata():
  function test_decompress_formats (line 194) | def test_decompress_formats():
  function test_compress_formats (line 211) | def test_compress_formats():
  function test_rearrange_jupytext_metadata (line 232) | def test_rearrange_jupytext_metadata():
  function test_rearrange_jupytext_metadata_metadata_filter (line 246) | def test_rearrange_jupytext_metadata_metadata_filter():
  function test_rearrange_jupytext_metadata_add_dot_in_suffix (line 267) | def test_rearrange_jupytext_metadata_add_dot_in_suffix():
  function test_fix_139 (line 286) | def test_fix_139():
  function test_validate_one_format (line 312) | def test_validate_one_format():
  function test_set_auto_ext (line 329) | def test_set_auto_ext():
  function test_pandoc_format_is_preserved (line 335) | def test_pandoc_format_is_preserved():
  function test_write_as_myst (line 344) | def test_write_as_myst(tmpdir):
  function test_write_raises_when_fmt_does_not_exists (line 357) | def test_write_raises_when_fmt_does_not_exists(tmpdir):
  function test_configuration_examples_from_documentation (line 403) | async def test_configuration_examples_from_documentation(config_file, co...

FILE: tests/unit/test_header.py
  function test_uncomment (line 14) | def test_uncomment():
  function test_header_to_metadata_and_cell_blank_line (line 20) | def test_header_to_metadata_and_cell_blank_line():
  function test_header_to_metadata_and_cell_no_blank_line (line 42) | def test_header_to_metadata_and_cell_no_blank_line():
  function test_header_to_metadata_and_cell_metadata (line 63) | def test_header_to_metadata_and_cell_metadata():
  function test_metadata_and_cell_to_header (line 85) | def test_metadata_and_cell_to_header(no_jupytext_version_number):
  function test_metadata_and_cell_to_header2 (line 104) | def test_metadata_and_cell_to_header2(no_jupytext_version_number):
  function test_notebook_from_plain_script_has_metadata_filter (line 112) | def test_notebook_from_plain_script_has_metadata_filter(
  function test_multiline_metadata (line 124) | def test_multiline_metadata(
  function test_header_in_html_comment (line 157) | def test_header_in_html_comment():
  function test_header_to_html_comment (line 174) | def test_header_to_html_comment(no_jupytext_version_number):
  function test_recusive_update (line 197) | def test_recusive_update():

FILE: tests/unit/test_labconfig.py
  function sample_viewer_config (line 9) | def sample_viewer_config():
  function sample_empty_viewer_config (line 26) | def sample_empty_viewer_config():
  function settings_file (line 31) | def settings_file(tmp_path):
  function test_read_config (line 35) | def test_read_config(settings_file, sample_viewer_config):
  function test_set_unset_default_viewers (line 41) | def test_set_unset_default_viewers(settings_file, sample_viewer_config, ...
  function test_write_config (line 49) | def test_write_config(settings_file, sample_viewer_config):

FILE: tests/unit/test_markdown_in_code_cells.py
  function test_three_backticks_or_more (line 11) | def test_three_backticks_or_more():
  function test_triple_backticks_in_code_cell (line 20) | def test_triple_backticks_in_code_cell(
  function test_triple_backticks_in_code_cell_myst (line 57) | def test_triple_backticks_in_code_cell_myst(
  function test_alternate_tree_four_five_backticks (line 87) | def test_alternate_tree_four_five_backticks(

FILE: tests/unit/test_paired_paths.py
  function test_simple_pair (line 23) | def test_simple_pair():
  function test_base_path (line 33) | def test_base_path():
  function test_base_path_dotdot (line 40) | def test_base_path_dotdot():
  function test_full_path_dotdot (line 45) | def test_full_path_dotdot():
  function test_base_path_in_tree_from_root (line 50) | def test_base_path_in_tree_from_root():
  function test_base_path_in_tree_from_non_root (line 56) | def test_base_path_in_tree_from_non_root():
  function test_base_path_in_tree_from_non_root_no_subfolder (line 61) | def test_base_path_in_tree_from_non_root_no_subfolder():
  function test_full_path_in_tree_from_root (line 69) | def test_full_path_in_tree_from_root():
  function test_full_path_in_tree_from_root_no_subfolder (line 75) | def test_full_path_in_tree_from_root_no_subfolder():
  function test_full_path_in_tree_from_non_root (line 81) | def test_full_path_in_tree_from_non_root():
  function test_paired_paths_windows (line 86) | def test_paired_paths_windows():
  function test_paired_paths_windows_no_subfolder (line 94) | def test_paired_paths_windows_no_subfolder():
  function test_paired_paths_windows_relative (line 102) | def test_paired_paths_windows_relative():
  function test_paired_path_dotdot_564 (line 118) | def test_paired_path_dotdot_564(os_path_sep):
  function test_path_in_tree_limited_to_config_dir (line 128) | def test_path_in_tree_limited_to_config_dir(tmpdir):
  function test_many_and_suffix (line 172) | def test_many_and_suffix():
  function test_prefix_and_suffix (line 182) | def test_prefix_and_suffix():
  function test_prefix_on_root_174 (line 226) | def test_prefix_on_root_174():
  function test_duplicated_paths (line 237) | def test_duplicated_paths():
  function test_cm_paired_paths (line 244) | async def test_cm_paired_paths(cm):
  function test_paired_path_with_prefix (line 264) | def test_paired_path_with_prefix(
  function test_paired_notebook_ipynb_root_scripts_in_folder_806 (line 281) | def test_paired_notebook_ipynb_root_scripts_in_folder_806(tmpdir, cwd_tm...
  function test_paired_paths_and_adjusted_fmt (line 339) | def test_paired_paths_and_adjusted_fmt(path, input_fmt, adjusted_fmt):
  function test_base_path_os_sep (line 345) | def test_base_path_os_sep(os_sep):

FILE: tests/unit/test_pep8.py
  function test_next_instruction_is_function_or_class (line 14) | def test_next_instruction_is_function_or_class():
  function test_cell_ends_with_code (line 24) | def test_cell_ends_with_code():
  function test_cell_ends_with_function_or_class (line 28) | def test_cell_ends_with_function_or_class():
  function test_pep8_lines_between_cells (line 64) | def test_pep8_lines_between_cells():
  function test_pep8_lines_between_cells_bis (line 76) | def test_pep8_lines_between_cells_bis():
  function test_pep8_lines_between_cells_ter (line 101) | def test_pep8_lines_between_cells_ter():
  function test_pep8 (line 125) | def test_pep8():
  function test_pep8_bis (line 166) | def test_pep8_bis():
  function test_no_metadata_when_py_is_pep8 (line 185) | def test_no_metadata_when_py_is_pep8(py_file):
  function test_notebook_ends_with_exactly_one_empty_line_682 (line 198) | def test_notebook_ends_with_exactly_one_empty_line_682():

FILE: tests/unit/test_stringparser.py
  function test_long_string (line 4) | def test_long_string(
  function test_single_chars (line 27) | def test_single_chars(
  function test_long_string_with_four_quotes (line 46) | def test_long_string_with_four_quotes(
  function test_long_string_ends_with_four_quotes (line 64) | def test_long_string_ends_with_four_quotes(

FILE: tools/absolute_links_in_readme.py
  class AbsoluteLinksInReadme (line 7) | class AbsoluteLinksInReadme(MetadataHookInterface):
    method update (line 10) | def update(self, metadata):
    method convert_links (line 22) | def convert_links(self, src_path, output_path, base_url):
Condensed preview — 805 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (9,013K chars).
[
  {
    "path": ".git-blame-ignore-revs",
    "chars": 98,
    "preview": "# git config blame.ignoreRevsFile .git-blame-ignore-revs\n961ce04d240560ea5d54b5d1ab40e6b5d76b4474\n"
  },
  {
    "path": ".git_archival.txt",
    "chars": 125,
    "preview": "node: $Format:%H$\nnode-date: $Format:%cI$\ndescribe-name: $Format:%(describe:tags=true,match=*[0-9]*)$\nref-names: $Format"
  },
  {
    "path": ".gitattributes",
    "chars": 201,
    "preview": "World\\ population.ipynb linguist-documentation\n.git_archival.txt  export-subst\n# SCM syntax highlighting & preventing 3-"
  },
  {
    "path": ".github/codecov.yml",
    "chars": 668,
    "preview": "codecov:\n  token: 8bdc5016-2a81-4a43-bdd5-7b3b9adc37e7\n  notify:\n    wait_for_ci: true\n\ncoverage:\n  status:\n    project:"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 1606,
    "preview": "# To get started with Dependabot version updates, you'll need to specify which\n# package ecosystems to update and where "
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 1792,
    "preview": "name: CI\non:\n  workflow_dispatch:\n    inputs:\n      upload-build-artifacts:\n        type: boolean\n        required: fals"
  },
  {
    "path": ".github/workflows/comment-pr.yml",
    "chars": 1343,
    "preview": "name: Comment PR\n\non:\n  pull_request_target:\n\npermissions:\n  pull-requests: write\n\njobs:\n  comment-pr:\n    runs-on: ubun"
  },
  {
    "path": ".github/workflows/publish.yml",
    "chars": 780,
    "preview": "name: Publish\non:\n  push:\n    tags:\n      - \"v[0-9]+.[0-9]+.[0-9]+*\"\n\npermissions:\n  contents: read\n\njobs:\n  build:\n    "
  },
  {
    "path": ".github/workflows/step_build.yml",
    "chars": 852,
    "preview": "name: build\nrun-name: Build package\n\non:\n  workflow_call:\n    inputs:\n      upload:\n        type: boolean\n        requir"
  },
  {
    "path": ".github/workflows/step_coverage.yml",
    "chars": 1025,
    "preview": "name: coverage\nrun-name: Check coverage\n\non:\n  workflow_call:\n\npermissions:\n  contents: read\n\njobs:\n  coverage:\n    name"
  },
  {
    "path": ".github/workflows/step_pre-commit.yml",
    "chars": 1261,
    "preview": "name: pre-commit\nrun-name: Run pre-commit tests\n\non:\n  workflow_call:\n\npermissions:\n  contents: read\n\njobs:\n  pre-commit"
  },
  {
    "path": ".github/workflows/step_static-analysis.yml",
    "chars": 496,
    "preview": "name: static-analysis\nrun-name: Run CodeQL analysis\n\non:\n  workflow_call:\n\npermissions:\n  contents: read\n  security-even"
  },
  {
    "path": ".github/workflows/step_tests-conda.yml",
    "chars": 2004,
    "preview": "name: test-conda\nrun-name: Run Conda tests for different OS\n\non:\n  workflow_call:\n    inputs:\n      coverage:\n        ty"
  },
  {
    "path": ".github/workflows/step_tests-pip.yml",
    "chars": 3811,
    "preview": "name: test-pip\nrun-name: Run main tests using Pip\n\non:\n  workflow_call:\n    inputs:\n      coverage:\n        type: boolea"
  },
  {
    "path": ".github/workflows/step_tests-ui.yml",
    "chars": 1787,
    "preview": "name: test-ui\nrun-name: Run UI tests with Galata\n\non:\n  workflow_call:\n\npermissions:\n  contents: read\n\njobs:\n  test-ui:\n"
  },
  {
    "path": ".github/workflows/update-playwright-snapshots.yml",
    "chars": 1660,
    "preview": "name: Update Playwright Snapshots\n\non:\n  issue_comment:\n    types: [created, edited]\n\npermissions:\n  contents: write\n  p"
  },
  {
    "path": ".gitignore",
    "chars": 514,
    "preview": ".build\n.cache\n.eggs\n.tox\n\nbuild\n/dist\ndocs/_build\n\n# Will be created by postBuild\ndemo/get_started.ipynb\n\n# jetbrains id"
  },
  {
    "path": ".pre-commit-config.yaml",
    "chars": 1353,
    "preview": "# Install the pre-commit hooks below with\n# 'pre-commit install'\n\n# Auto-update the version of the hooks with\n# 'pre-com"
  },
  {
    "path": ".pre-commit-hooks.yaml",
    "chars": 463,
    "preview": "- id: jupytext\n  name: jupytext\n  description: Runs jupytext on all notebooks and paired files.\n  language: python\n  ent"
  },
  {
    "path": ".readthedocs.yml",
    "chars": 417,
    "preview": "# Read the Docs configuration file\n# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details\n\n# Requir"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 94057,
    "preview": "Jupytext ChangeLog\n==================\n\n1.19.1 (2026-01-25)\n-------------------\n\n**Changed**\n- Jupytext does not change t"
  },
  {
    "path": "LICENSE",
    "chars": 1072,
    "preview": "MIT License\n\nCopyright (c) 2018-2026 Marc Wouts\n\nPermission is hereby granted, free of charge, to any person obtaining a"
  },
  {
    "path": "README.md",
    "chars": 8407,
    "preview": "![](https://github.com/mwouts/jupytext/blob/17aea37c612f33a4e27eeee4b81966f1506920fd/docs/images/logo_large.png?raw=true"
  },
  {
    "path": "binder/labconfig/default_setting_overrides.json",
    "chars": 341,
    "preview": "{\n  \"@jupyterlab/docmanager-extension:plugin\": {\n    \"defaultViewers\": {\n      \"markdown\": \"Jupytext Notebook\",\n      \"m"
  },
  {
    "path": "binder/postBuild",
    "chars": 713,
    "preview": "# Stop everything if one command fails\nset -e\n\n# Install from sources\n# NB: If you want to use Jupytext on your binder, "
  },
  {
    "path": "binder/requirements.txt",
    "chars": 80,
    "preview": "jupyterlab>=4\nnotebook>=7\nplotly\nmatplotlib\nwordcloud\npandas\nwbdata\nbash_kernel\n"
  },
  {
    "path": "demo/Benchmarking Jupytext.py",
    "chars": 3317,
    "preview": "# In this notebook, we benchmark the Jupytext formats for Jupyter notebooks against the base format\n# Open this script a"
  },
  {
    "path": "demo/Jupytext's word cloud.py",
    "chars": 860,
    "preview": "# This is a notebook that I used to generate Jupytext's word cloud.\n# To open this script as a notebook in JupyterLab, r"
  },
  {
    "path": "demo/Tests in a notebook.md",
    "chars": 2540,
    "preview": "# Testing a Jupyter notebook with pytest\n\nIn this notebook we describe how to test a notebook with `jupytext`.\n\n## Writi"
  },
  {
    "path": "demo/World population.Rmd",
    "chars": 2811,
    "preview": "---\njupyter:\n  jupytext:\n    cell_markers: region,endregion\n    formats: ipynb,.pct.py:percent,.lgt.py:light,.spx.py:sph"
  },
  {
    "path": "demo/World population.ipynb",
    "chars": 6040300,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# A quick insight at world populati"
  },
  {
    "path": "demo/World population.lgt.py",
    "chars": 2732,
    "preview": "# ---\n# jupyter:\n#   jupytext:\n#     cell_markers: region,endregion\n#     formats: ipynb,.pct.py:percent,.lgt.py:light,."
  },
  {
    "path": "demo/World population.md",
    "chars": 2787,
    "preview": "---\njupyter:\n  jupytext:\n    cell_markers: region,endregion\n    formats: ipynb,.pct.py:percent,.lgt.py:light,.spx.py:sph"
  },
  {
    "path": "demo/World population.myst.md",
    "chars": 3121,
    "preview": "---\njupytext:\n  formats: ipynb,.pct.py:percent,.lgt.py:light,.spx.py:sphinx,md,Rmd,.pandoc.md:pandoc,.myst.md:myst\n  tex"
  },
  {
    "path": "demo/World population.pandoc.md",
    "chars": 3349,
    "preview": "---\njupyter:\n  jupytext:\n    cell_markers: 'region,endregion'\n    formats: 'ipynb,.pct.py:percent,.lgt.py:light,.spx.py:"
  },
  {
    "path": "demo/World population.pct.py",
    "chars": 2891,
    "preview": "# ---\n# jupyter:\n#   jupytext:\n#     cell_markers: region,endregion\n#     formats: ipynb,.pct.py:percent,.lgt.py:light,."
  },
  {
    "path": "demo/World population.spx.py",
    "chars": 3333,
    "preview": "# ---\n# jupyter:\n#   jupytext:\n#     cell_markers: region,endregion\n#     formats: ipynb,.pct.py:percent,.lgt.py:light,."
  },
  {
    "path": "demo/get_started.md",
    "chars": 2688,
    "preview": "---\njupyter:\n  jupytext:\n    formats: ipynb,md\n    text_representation:\n      extension: .md\n      format_name: markdown"
  },
  {
    "path": "demo/vscode/notebook.ipynb",
    "chars": 24686,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"fba07815\",\n   \"metadata\": {},\n   \"source\": [\n    \"This paired no"
  },
  {
    "path": "demo/vscode/notebook.py",
    "chars": 901,
    "preview": "# ---\n# jupyter:\n#   jupytext:\n#     formats: ipynb,py:percent\n#     text_representation:\n#       extension: .py\n#      "
  },
  {
    "path": "docs/Makefile",
    "chars": 581,
    "preview": "# Minimal makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS    =\nSPHI"
  },
  {
    "path": "docs/advanced-options.md",
    "chars": 2702,
    "preview": "# Advanced options\n\n## Metadata filtering\n\nThe metadata that is included in the text notebooks is governed by the two op"
  },
  {
    "path": "docs/changelog.md",
    "chars": 33,
    "preview": "```{include} ../CHANGELOG.md\n```\n"
  },
  {
    "path": "docs/conf.py",
    "chars": 2682,
    "preview": "# Configuration file for the Sphinx documentation builder.\n#\n# This file only contains a selection of the most common op"
  },
  {
    "path": "docs/config.md",
    "chars": 6386,
    "preview": "# Jupytext's configuration file\n\nJupytext can use either `jupytext.toml` or `pyproject.toml` as its configuration file.\n"
  },
  {
    "path": "docs/contributing.md",
    "chars": 1516,
    "preview": "# Contributing\n\nThanks for reading this! Contributions to this project are welcome, and there are many ways you can cont"
  },
  {
    "path": "docs/developing.md",
    "chars": 1907,
    "preview": "# Developing Jupytext\n\n## How to test development versions from GitHub\n\nIf you want to test a feature that has been inte"
  },
  {
    "path": "docs/doc-requirements.txt",
    "chars": 63,
    "preview": "sphinx\nsphinx_copybutton\nsphinx_rtd_theme\njupytext\nmyst_parser\n"
  },
  {
    "path": "docs/faq.md",
    "chars": 7633,
    "preview": "# FAQ\n\n## What is Jupytext?\n\nJupytext is a Python package that provides _two-way_ conversion between Jupyter notebooks a"
  },
  {
    "path": "docs/formats-markdown.md",
    "chars": 8403,
    "preview": "# Notebooks as Markdown\n\n## MyST Markdown\n\n[MyST (Markedly Structured Text)][myst-parser] is a markdown flavor that \"imp"
  },
  {
    "path": "docs/formats-scripts.md",
    "chars": 7542,
    "preview": "# Notebooks as code\n\n## The `percent` format\n\nThe `percent` format is a representation of Jupyter notebooks as scripts, "
  },
  {
    "path": "docs/index.md",
    "chars": 427,
    "preview": "```{include} ../README.md\n:relative-docs: docs/\n:start-after: <!-- INDEX-START -->\n```\n\n## Table of Contents\n\n```{toctre"
  },
  {
    "path": "docs/install.md",
    "chars": 4662,
    "preview": "# Installation\n\nInstalling Jupytext is as simple as\n```bash\npip install jupytext\n```\nor\n```bash\nconda install jupytext -"
  },
  {
    "path": "docs/jupyter-collaboration.md",
    "chars": 1653,
    "preview": "# Jupyter Collaboration\n\n[Jupyter Collaboration](https://github.com/jupyterlab/jupyter-collaboration) is an official Jup"
  },
  {
    "path": "docs/jupyterlab-extension.md",
    "chars": 2001,
    "preview": "# Frontend extension\n\nRecent versions of Jupytext (`>=1.16.0`) ships frontend extension that enables users\nto create tex"
  },
  {
    "path": "docs/languages.md",
    "chars": 741,
    "preview": "# Supported Languages\n\nJupytext works with notebooks in any of the following languages:\n\n- Bash\n- C#\n- C++ (using either"
  },
  {
    "path": "docs/make.bat",
    "chars": 752,
    "preview": "@ECHO OFF\n\npushd %~dp0\n\nREM Command file for Sphinx documentation\n\nif \"%SPHINXBUILD%\" == \"\" (\n\tset SPHINXBUILD=sphinx-bu"
  },
  {
    "path": "docs/paired-notebooks.md",
    "chars": 2514,
    "preview": "# Paired notebooks\n\nBoth classical Jupyter Notebooks in the `.ipynb` format, and [text notebooks](text-notebooks.md), ha"
  },
  {
    "path": "docs/text-notebooks.md",
    "chars": 5142,
    "preview": "# Text notebooks\n\nJupytext can save Jupyter Notebooks as text files, with e.g. a `.py` or `.md`\nextension. These text fi"
  },
  {
    "path": "docs/tutorials.md",
    "chars": 1158,
    "preview": "# Blog posts and talks\n\nOver the course of the years I wrote a few different blog posts about Jupytext, about text noteb"
  },
  {
    "path": "docs/using-cli.md",
    "chars": 6478,
    "preview": "# Jupytext CLI\n\n## Command line conversion\n\nJupytext provides command line interface for converting notebooks between th"
  },
  {
    "path": "docs/using-pre-commit.md",
    "chars": 2462,
    "preview": "# Pre-commit hook\n\nJupytext includes a hook for the [pre-commit](https://pre-commit.com/) framework.\n\n## Do I need to us"
  },
  {
    "path": "docs/vs-code.md",
    "chars": 1834,
    "preview": "# VS Code\n\n## The Jupytext Sync Extension\n\nYou can get the same pairing and synchronization functionality in VS Code as "
  },
  {
    "path": "jupyterlab/.gitignore",
    "chars": 373,
    "preview": ".build\n.cache\n.coverage\n.pytest_cache\n.eggs\n.tox\nbuild\n/dist\nvenv\njupytext.egg-info\nfuture\n*.pyc\ngits*\n.ipynb_checkpoint"
  },
  {
    "path": "jupyterlab/.prettierignore",
    "chars": 103,
    "preview": "node_modules\n**/node_modules\n**/lib\n**/labextension\n**/package.json\n**/venv\n**/.venv\n**/jupyter-config\n"
  },
  {
    "path": "jupyterlab/.yarnrc.yml",
    "chars": 56,
    "preview": "enableImmutableInstalls: false\nnodeLinker: node-modules\n"
  },
  {
    "path": "jupyterlab/install.json",
    "chars": 177,
    "preview": "{\n  \"packageManager\": \"python\",\n  \"packageName\": \"jupytext\",\n  \"uninstallInstructions\": \"Use your Python package manager"
  },
  {
    "path": "jupyterlab/jupyter-config/jupyter_notebook_config.d/jupytext.json",
    "chars": 96,
    "preview": "{\n  \"NotebookApp\": {\n    \"nbserver_extensions\": {\n      \"jupyterlab_jupytext\": true\n    }\n  }\n}\n"
  },
  {
    "path": "jupyterlab/jupyter-config/jupyter_server_config.d/jupytext.json",
    "chars": 94,
    "preview": "{\n  \"ServerApp\": {\n    \"jpserver_extensions\": {\n      \"jupyterlab_jupytext\": true\n    }\n  }\n}\n"
  },
  {
    "path": "jupyterlab/jupyterlab_jupytext/__init__.py",
    "chars": 2598,
    "preview": "\"\"\"Jupyter server and lab extension entry points\"\"\"\n\nimport asyncio\n\nfrom jupytext.reraise import reraise\n\ntry:\n    from"
  },
  {
    "path": "jupyterlab/lerna.json",
    "chars": 115,
    "preview": "{\n  \"$schema\": \"node_modules/lerna/schemas/lerna-schema.json\",\n  \"version\": \"independent\",\n  \"npmClient\": \"yarn\"\n}\n"
  },
  {
    "path": "jupyterlab/package.json",
    "chars": 4155,
    "preview": "{\n    \"name\": \"jupyterlab-jupytext-extensions\",\n    \"version\": \"1.0.0\",\n    \"private\": true,\n    \"files\": [],\n    \"works"
  },
  {
    "path": "jupyterlab/packages/jupyterlab-jupytext-extension/.gitignore",
    "chars": 67,
    "preview": "*.bundle.*\nlib/\nnode_modules/\n*.egg-info/\n.ipynb_checkpoints\n*.tgz\n"
  },
  {
    "path": "jupyterlab/packages/jupyterlab-jupytext-extension/CHANGELOG.md",
    "chars": 7704,
    "preview": "# 1.4.6 (2025-10-18)\n\nWe have added support for pairing notebooks to Python scripts in the Marimo format\n\n# 1.4.5 (2025-"
  },
  {
    "path": "jupyterlab/packages/jupyterlab-jupytext-extension/README.md",
    "chars": 3505,
    "preview": "# A JupyterLab extension for Jupytext\n\nThis extension adds a few [Jupytext](https://github.com/mwouts/jupytext) commands"
  },
  {
    "path": "jupyterlab/packages/jupyterlab-jupytext-extension/package.json",
    "chars": 2997,
    "preview": "{\n  \"name\": \"jupyterlab-jupytext\",\n  \"version\": \"1.4.6\",\n  \"description\": \"Save Jupyter Notebooks as Scripts or Markdown"
  },
  {
    "path": "jupyterlab/packages/jupyterlab-jupytext-extension/schema/plugin.json",
    "chars": 1442,
    "preview": "{\n  \"title\": \"Jupytext\",\n  \"description\": \"List of Jupytext Text Notebook formats that will be added to launcher and jup"
  },
  {
    "path": "jupyterlab/packages/jupyterlab-jupytext-extension/src/commands.ts",
    "chars": 9381,
    "preview": "import { showErrorMessage } from '@jupyterlab/apputils';\n\nimport { INotebookTracker } from '@jupyterlab/notebook';\n\nimpo"
  },
  {
    "path": "jupyterlab/packages/jupyterlab-jupytext-extension/src/factory.ts",
    "chars": 4225,
    "preview": "import {\n  IToolbarWidgetRegistry,\n  createToolbarFactory,\n} from '@jupyterlab/apputils';\n\nimport {\n  INotebookTracker,\n"
  },
  {
    "path": "jupyterlab/packages/jupyterlab-jupytext-extension/src/index.ts",
    "chars": 16203,
    "preview": "import {\n  JupyterFrontEnd,\n  JupyterFrontEndPlugin,\n} from '@jupyterlab/application';\n\nimport {\n  ICommandPalette,\n  IT"
  },
  {
    "path": "jupyterlab/packages/jupyterlab-jupytext-extension/src/registry.ts",
    "chars": 3701,
    "preview": "import { DocumentRegistry } from '@jupyterlab/docregistry';\n\nimport { TranslationBundle } from '@jupyterlab/translation'"
  },
  {
    "path": "jupyterlab/packages/jupyterlab-jupytext-extension/src/svg.d.ts",
    "chars": 74,
    "preview": "declare module '*.svg' {\n  const image: string;\n  export default image;\n}\n"
  },
  {
    "path": "jupyterlab/packages/jupyterlab-jupytext-extension/src/tokens.ts",
    "chars": 8083,
    "preview": "import { ServerConnection } from '@jupyterlab/services';\n\nimport { LabIcon } from '@jupyterlab/ui-components';\n\nimport j"
  },
  {
    "path": "jupyterlab/packages/jupyterlab-jupytext-extension/src/utils.ts",
    "chars": 8918,
    "preview": "import { IEditorLanguageRegistry } from '@jupyterlab/codemirror';\n\nimport {\n  ServiceManager,\n  ServerConnection,\n  Kern"
  },
  {
    "path": "jupyterlab/packages/jupyterlab-jupytext-extension/style/base.css",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "jupyterlab/packages/jupyterlab-jupytext-extension/style/index.css",
    "chars": 25,
    "preview": "@import url('base.css');\n"
  },
  {
    "path": "jupyterlab/packages/jupyterlab-jupytext-extension/style/index.js",
    "chars": 21,
    "preview": "import './base.css';\n"
  },
  {
    "path": "jupyterlab/packages/jupyterlab-jupytext-extension/tsconfig.json",
    "chars": 418,
    "preview": "{\n  \"compilerOptions\": {\n    \"declaration\": true,\n    \"lib\": [\"es2018\", \"dom\"],\n    \"module\": \"commonjs\",\n    \"moduleRes"
  },
  {
    "path": "jupyterlab/packages/jupyterlab-jupytext-extension/ui-tests/README.md",
    "chars": 3804,
    "preview": "# Integration Testing\n\nThis folder contains the integration tests of the extension.\n\nThey are defined using [Playwright]"
  },
  {
    "path": "jupyterlab/packages/jupyterlab-jupytext-extension/ui-tests/jupyter_server_test_config.py",
    "chars": 412,
    "preview": "\"\"\"Server configuration for integration tests.\n\n!! Never use this configuration in production because it\nopens the serve"
  },
  {
    "path": "jupyterlab/packages/jupyterlab-jupytext-extension/ui-tests/package.json",
    "chars": 494,
    "preview": "{\n    \"name\": \"jupyterlab-jupytext-ui-tests\",\n    \"version\": \"1.4.1\",\n    \"description\": \"Basic Integration Tests\",\n    "
  },
  {
    "path": "jupyterlab/packages/jupyterlab-jupytext-extension/ui-tests/playwright.config.js",
    "chars": 987,
    "preview": "/**\n * Configuration for Playwright using default from @jupyterlab/galata\n */\nconst baseConfig = require('@jupyterlab/ga"
  },
  {
    "path": "jupyterlab/packages/jupyterlab-jupytext-extension/ui-tests/tests/jupytext-launcher.spec.ts",
    "chars": 1075,
    "preview": "import { expect, test } from '@jupyterlab/galata';\n\ntest.describe('Jupytext Launcher Category', () => {\n  test.use({ aut"
  },
  {
    "path": "jupyterlab/packages/jupyterlab-jupytext-extension/ui-tests/tests/jupytext-menu.spec.ts",
    "chars": 705,
    "preview": "import { expect, test } from '@jupyterlab/galata';\n\n// Main Jupytext menu\nconst jupytextMenu = ['File>New Text Notebook'"
  },
  {
    "path": "jupyterlab/packages/jupyterlab-jupytext-extension/ui-tests/tests/jupytext-notebook.spec.ts",
    "chars": 5063,
    "preview": "import { expect, test } from '@jupyterlab/galata';\n\n// Currently we are enabling only percent and MyST formats in Jupyte"
  },
  {
    "path": "jupyterlab/packages/jupyterlab-jupytext-extension/ui-tests/tests/jupytext-settings.spec.ts",
    "chars": 862,
    "preview": "import { expect, test } from '@jupyterlab/galata';\n\ntest('Open the settings editor with a Jupytext query', async ({ page"
  },
  {
    "path": "jupyterlab/scripts/install_extension.py",
    "chars": 1456,
    "preview": "# This script does the \"same\" job as `jupyter labextension develop --overwrite .`\n#\n# Seems like we cannot use the upstr"
  },
  {
    "path": "jupyterlab/tsconfig.eslint.json",
    "chars": 432,
    "preview": "{\n  \"compilerOptions\": {\n    \"declaration\": true,\n    \"lib\": [\"es2018\", \"dom\"],\n    \"module\": \"commonjs\",\n    \"moduleRes"
  },
  {
    "path": "pyproject.toml",
    "chars": 10548,
    "preview": "[build-system]\nrequires = [\"hatchling>=1.5.0\", \"hatch-jupyter-builder>=0.5\", \"jupyterlab>=4\"]\nbuild-backend = \"hatchling"
  },
  {
    "path": "src/jupytext/__init__.py",
    "chars": 1223,
    "preview": "\"\"\"Read and write Jupyter notebooks as text files\"\"\"\n\nfrom .formats import NOTEBOOK_EXTENSIONS, get_format_implementatio"
  },
  {
    "path": "src/jupytext/__main__.py",
    "chars": 188,
    "preview": "\"\"\"Main for Jupytext\n\nCall with (e.g.)::\n\n    python -m jupytext my_notebook.ipynb --to Rmd\n\"\"\"\n\nimport sys\n\nfrom .cli i"
  },
  {
    "path": "src/jupytext/async_contentsmanager.py",
    "chars": 29841,
    "preview": "\"\"\"\nThis module exposes the AsyncTextFileContentsManager that allows to open\ntext files as notebooks\n\"\"\"\n\nimport inspect"
  },
  {
    "path": "src/jupytext/async_pairs.py",
    "chars": 2574,
    "preview": "import jupytext\n\nfrom .combine import combine_inputs_with_outputs\nfrom .compare import compare\nfrom .formats import chec"
  },
  {
    "path": "src/jupytext/cell_metadata.py",
    "chars": 16823,
    "preview": "\"\"\"\nConvert between text notebook metadata and jupyter cell metadata.\n\nStandard cell metadata are documented here:\nSee a"
  },
  {
    "path": "src/jupytext/cell_reader.py",
    "chars": 37851,
    "preview": "\"\"\"Read notebook cells from their text representation\"\"\"\n\nimport re\nfrom collections import defaultdict\nfrom copy import"
  },
  {
    "path": "src/jupytext/cell_to_text.py",
    "chars": 21202,
    "preview": "\"\"\"Export notebook cells as text\"\"\"\n\nimport re\nimport warnings\nfrom copy import copy\n\nfrom .cell_metadata import (\n    _"
  },
  {
    "path": "src/jupytext/cli.py",
    "chars": 50405,
    "preview": "\"\"\"`jupytext` as a command line tool\"\"\"\n\nimport argparse\nimport glob\nimport json\nimport os\nimport re\nimport shlex\nimport"
  },
  {
    "path": "src/jupytext/combine.py",
    "chars": 6447,
    "preview": "\"\"\"Combine source and outputs from two notebooks\"\"\"\n\nimport re\nfrom copy import copy\n\nfrom nbformat import NotebookNode\n"
  },
  {
    "path": "src/jupytext/compare.py",
    "chars": 15096,
    "preview": "\"\"\"Compare two Jupyter notebooks\"\"\"\n\nimport difflib\nimport json\nimport os\nimport re\n\nfrom jupytext.marimo import marimo_"
  },
  {
    "path": "src/jupytext/config.py",
    "chars": 20061,
    "preview": "\"\"\"Find and read Jupytext configuration files\"\"\"\n\nimport json\nimport os\nfrom pathlib import Path\n\ntry:\n    import tomlli"
  },
  {
    "path": "src/jupytext/doxygen.py",
    "chars": 661,
    "preview": "\"\"\"Convert Markdown equations to doxygen equations and back\nSee https://github.com/mwouts/jupytext/issues/517\"\"\"\n\nimport"
  },
  {
    "path": "src/jupytext/formats.py",
    "chars": 30928,
    "preview": "\"\"\"\nIn this file the various text notebooks formats are defined. Please contribute\nnew formats here!\n\"\"\"\n\nimport os\nimpo"
  },
  {
    "path": "src/jupytext/header.py",
    "chars": 12122,
    "preview": "\"\"\"Parse header of text notebooks\"\"\"\n\nimport logging\nimport re\n\nimport nbformat\nimport yaml\nfrom nbformat.v4.nbbase impo"
  },
  {
    "path": "src/jupytext/jupytext.py",
    "chars": 23622,
    "preview": "\"\"\"Read and write Jupyter notebooks as text files\"\"\"\n\nimport logging\nimport os\nimport sys\nimport warnings\nfrom copy impo"
  },
  {
    "path": "src/jupytext/kernels.py",
    "chars": 2158,
    "preview": "\"\"\"Find kernel specifications for a given language\"\"\"\n\nimport os\nimport sys\n\nfrom .languages import same_language\nfrom ."
  },
  {
    "path": "src/jupytext/languages.py",
    "chars": 8149,
    "preview": "\"\"\"Determine notebook or cell language\"\"\"\n\nimport re\n\n# Jupyter magic commands that are also languages\n_JUPYTER_LANGUAGE"
  },
  {
    "path": "src/jupytext/magics.py",
    "chars": 7161,
    "preview": "\"\"\"Escape Jupyter magics when converting to other formats\"\"\"\n\nimport re\n\nfrom .languages import _COMMENT, _SCRIPT_EXTENS"
  },
  {
    "path": "src/jupytext/marimo.py",
    "chars": 5095,
    "preview": "\"\"\"Jupyter notebook to Marimo py format and back, using Marimo\"\"\"\n\nimport os\nfrom packaging.version import parse\nimport "
  },
  {
    "path": "src/jupytext/metadata_filter.py",
    "chars": 9534,
    "preview": "\"\"\"Notebook and cell metadata filtering\"\"\"\n\nfrom copy import copy\n\nfrom .cell_metadata import _JUPYTEXT_CELL_METADATA, i"
  },
  {
    "path": "src/jupytext/myst.py",
    "chars": 14839,
    "preview": "\"\"\"\nThis module contains round-trip conversion between\nmyst formatted text documents and notebooks.\n\"\"\"\n\nimport json\nimp"
  },
  {
    "path": "src/jupytext/paired_paths.py",
    "chars": 11566,
    "preview": "\"\"\"List all the paths associated to a given notebook\"\"\"\n\nimport os\n\nfrom .config import find_jupytext_configuration_file"
  },
  {
    "path": "src/jupytext/pairs.py",
    "chars": 2226,
    "preview": "\"\"\"Functions to read or write paired notebooks\"\"\"\n\nfrom collections import namedtuple\n\nfrom .formats import long_form_mu"
  },
  {
    "path": "src/jupytext/pandoc.py",
    "chars": 3673,
    "preview": "\"\"\"Jupyter notebook to Markdown and back, using Pandoc\"\"\"\n\nimport os\nimport subprocess\nimport tempfile\n\n# Copy nbformat "
  },
  {
    "path": "src/jupytext/pep8.py",
    "chars": 2899,
    "preview": "\"\"\"Determine how many blank lines should be inserted between two cells\"\"\"\n\nfrom .stringparser import StringParser\n\n\ndef "
  },
  {
    "path": "src/jupytext/quarto.py",
    "chars": 5995,
    "preview": "\"\"\"Jupyter notebook to Quarto Markdown and back, using 'quarto convert'\"\"\"\n\nimport json\nimport os\nimport shutil\nimport s"
  },
  {
    "path": "src/jupytext/reraise.py",
    "chars": 229,
    "preview": "\"\"\"Raise the given error at evaluation time\"\"\"\n\n\ndef reraise(error):\n    \"\"\"Return a function that raises the given erro"
  },
  {
    "path": "src/jupytext/stringparser.py",
    "chars": 2427,
    "preview": "\"\"\"A simple file parser that can tell whether the first character of a line\nis quoted or not\"\"\"\n\nfrom .languages import "
  },
  {
    "path": "src/jupytext/sync_contentsmanager.py",
    "chars": 31098,
    "preview": "\"\"\"\nThis file is automatically generated by\ntests/functional/contents_manager/test_async_and_sync_contents_manager_are_i"
  },
  {
    "path": "src/jupytext/sync_pairs.py",
    "chars": 2707,
    "preview": "\"\"\"\nThis file is automatically generated by\ntests/functional/contents_manager/test_async_and_sync_contents_manager_are_i"
  },
  {
    "path": "src/jupytext/version.py",
    "chars": 119,
    "preview": "\"\"\"Jupytext's version number\"\"\"\n\n# Must match [N!]N(.N)*[{a|b|rc}N][.postN][.devN], cf. PEP 440\n__version__ = \"1.19.1\"\n"
  },
  {
    "path": "src/jupytext_config/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "src/jupytext_config/__main__.py",
    "chars": 199,
    "preview": "\"\"\"Main for Jupytext_config\n\nCall with (e.g.)::\n\n    python -m jupytext_config list-default-viewer\n\"\"\"\n\nimport sys\n\nfrom"
  },
  {
    "path": "src/jupytext_config/jupytext_config.py",
    "chars": 2660,
    "preview": "\"\"\"\nthe code for\njupytext-config set-default-viewer\nand related subcommands\n\"\"\"\n\nimport sys\nfrom argparse import Argumen"
  },
  {
    "path": "src/jupytext_config/labconfig.py",
    "chars": 2473,
    "preview": "\"\"\"\nhelper to inspect / initialize jupyterlab labconfig settings\nthat are required to open jupytext notebooks in jupyter"
  },
  {
    "path": "tests/conftest.py",
    "chars": 14590,
    "preview": "import contextlib\nimport itertools\nimport os.path\nimport re\nimport sys\nimport unittest.mock as mock\nfrom pathlib import "
  },
  {
    "path": "tests/data/notebooks/inputs/R/simple_r_script.R",
    "chars": 38,
    "preview": "# This is a comment\n\ncars\n\nplot(cars)\n"
  },
  {
    "path": "tests/data/notebooks/inputs/R_spin/knitr-spin.R",
    "chars": 1620,
    "preview": "#' The below derives from\n#' https://github.com/yihui/knitr/blob/master/inst/examples/knitr-spin.R\n#'\n#' This is a speci"
  },
  {
    "path": "tests/data/notebooks/inputs/Rmd/R_sample.Rmd",
    "chars": 867,
    "preview": "---\ntitle: \"R Notebook\"\noutput: html_notebook\n---\n\nThis is an [R Markdown](http://rmarkdown.rstudio.com) Notebook. When "
  },
  {
    "path": "tests/data/notebooks/inputs/Rmd/chunk_options.Rmd",
    "chars": 490,
    "preview": "---\ntitle: \"Test chunk options in Rmd/Jupyter conversion\"\nauthor: \"Marc Wouts\"\ndate: \"June 16, 2018\"\njupyter:\n  kernelsp"
  },
  {
    "path": "tests/data/notebooks/inputs/Rmd/ioslides.Rmd",
    "chars": 1114,
    "preview": "---\ntitle: \"Quick ioslides\"\nsubtitle: \"Slides generated using R, python and ioslides\"\nauthor: \"Marc Wouts\"\ndate: \"June 1"
  },
  {
    "path": "tests/data/notebooks/inputs/Rmd/knitr-spin.Rmd",
    "chars": 1647,
    "preview": "The below derives from\nhttps://github.com/yihui/knitr/blob/master/inst/examples/knitr-spin.R\n\nThis is a special R script"
  },
  {
    "path": "tests/data/notebooks/inputs/Rmd/markdown.Rmd",
    "chars": 257,
    "preview": "# This is a plain markdown file\n\n```python\n1+1\n```\n\nAnd more comments\n\nAnother comment separated by one line\n\n\nThis is a"
  },
  {
    "path": "tests/data/notebooks/inputs/hydrogen/hydrogen_latex_html_R_magics.py",
    "chars": 438,
    "preview": "# %%\n1 + 1\n\n# %%\nimport pandas as pd\npd.Series({'A':5, 'B':2}).plot()\n\n# %%\n%matplotlib inline\npd.Series({'A':5, 'B':2})"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_R/R notebook with invalid cell keys.ipynb",
    "chars": 14611,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This notebook was created with IRKe"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_R/ir_notebook.ipynb",
    "chars": 9828,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This is a jupyter notebook that use"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_bash/sample_bash_notebook.ipynb",
    "chars": 2453,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\":"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_clojure/html-demo.ipynb",
    "chars": 24994,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Clojupyter Demo\\n\",\n    \"\\n\",\n   "
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_coconut/coconut_homepage_demo.ipynb",
    "chars": 8104,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Taken from [coconut-lang.org](cocon"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_cpp/root_cpp.ipynb",
    "chars": 1135,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"id\": \"f0c19410-7bd1-4b72-9cb3-f042245a06da\",\n   \""
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_cpp/xcpp_by_quantstack.ipynb",
    "chars": 17204,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"[![xeus-cling](images/xeus-cling.pn"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_cs/csharp.ipynb",
    "chars": 3895,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We start with...\"\n   ]\n  },\n  {\n   "
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_fs/fsharp.ipynb",
    "chars": 2599,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This notebook was inspired by [Plot"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_gnuplot/gnuplot_notebook.ipynb",
    "chars": 51527,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"17cc3dd3-6209-4c98-baa8-96b1456e0573\",\n   \"metadata\": {},\n   \"so"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_go/hello_world_gonb.ipynb",
    "chars": 3220,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"8795db3a-af9a-4f03-a68d-019330861b54\",\n   \"metadata\": {},\n   \"so"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_groovy/tailrecursive-factorial.ipynb",
    "chars": 3608,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# TailRecursive annotation\\n\",\n    "
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_haskell/haskell_notebook.ipynb",
    "chars": 1246,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"decb6522\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Example Hask"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_idl/demo_gdl_fbp.ipynb",
    "chars": 118633,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## GDL demo notebook\"\n   ]\n  },\n  {"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_java/simple-helloworld.ipynb",
    "chars": 1318,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's define some class.\"\n   ]\n  },"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_js/ijavascript.ipynb",
    "chars": 4252,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## A notebook that uses IJavascript"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_julia/julia_benchmark_plotly_barchart.ipynb",
    "chars": 5480,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outp"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_julia/julia_functional_geometry.ipynb",
    "chars": 16753,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\":"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_logtalk/logtalk_notebook.ipynb",
    "chars": 2018,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# An implementation of the Ackerman"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_lua/lua_example.ipynb",
    "chars": 4495,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Source: https://www.lua.org/pil/19."
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_m/octave_notebook.ipynb",
    "chars": 24236,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"A markdown cell\"\n   ]\n  },\n  {\n   \""
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_maxima/maxima_example.ipynb",
    "chars": 1264,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"a272759d\",\n   \"metadata\": {},\n   \"source\": [\n    \"## maxima misc"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_ocaml/ocaml_notebook.ipynb",
    "chars": 1431,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"0ce05620\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Example of a"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_ps1/powershell.ipynb",
    "chars": 1161,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This is an extract from\\n\",\n    \"ht"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_py/Line_breaks_in_LateX_305.ipynb",
    "chars": 1580,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This cell uses no particular cell m"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_py/Notebook with function and cell metadata 164.ipynb",
    "chars": 2267,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\":"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_py/Notebook with html and latex cells.ipynb",
    "chars": 8819,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\":"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_py/Notebook with many hash signs.ipynb",
    "chars": 1737,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"###################################"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_py/Notebook with metadata and long cells.ipynb",
    "chars": 2534,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Part one - various cells\"\n   ]\n  "
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_py/Notebook_with_R_magic.ipynb",
    "chars": 74945,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# A notebook with R cells\\n\",\n    \""
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_py/Notebook_with_more_R_magic_111.ipynb",
    "chars": 6492,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n "
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_py/The flavors of raw cells.ipynb",
    "chars": 1224,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/latex\"\n   },\n   \"source\": [\n    \"$1+"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_py/cat_variable.ipynb",
    "chars": 574,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": "
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_py/convert_to_py_then_test_with_update83.ipynb",
    "chars": 1067,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"scrolled\": false\n   },\n   \"outp"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_py/frozen_cell.ipynb",
    "chars": 1233,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\""
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_py/jupyter.ipynb",
    "chars": 1903,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Jupyter notebook\\n\",\n    \"\\n\",\n  "
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_py/jupyter_again.ipynb",
    "chars": 1492,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n "
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_py/jupyter_with_raw_cell_in_body.ipynb",
    "chars": 969,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\":"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_py/jupyter_with_raw_cell_on_top.ipynb",
    "chars": 1139,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {},\n   \"source\": [\n    \"---\\n\",\n    \"title: Quick test\\n\",\n    \""
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_py/jupyter_with_raw_cell_with_invalid_yaml.ipynb",
    "chars": 876,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {},\n   \"source\": [\n    \"---\\n\",\n    \"title: Exception: Test\\n\",\n"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_py/jupyterlab-slideshow_1441.ipynb",
    "chars": 1024,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"7f0da6ff-9da5-453c-8515-88fabeb03582\",\n   \"metadata\": {\n    \"@de"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_py/notebook_with_complex_metadata.ipynb",
    "chars": 754,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"o"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_py/nteract_with_parameter.ipynb",
    "chars": 8185,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": false,\n    \"inputHi"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_py/plotly_graphs.ipynb",
    "chars": 58540,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This notebook contains complex outp"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_py/raw_cell_with_complex_yaml_like_content.ipynb",
    "chars": 665,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"raw\",\n   \"id\": \"b32297a4\",\n   \"metadata\": {},\n   \"source\": [\n    \"---\\n\",\n    \"\\n\",\n "
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_py/raw_cell_with_non_dict_yaml_content.ipynb",
    "chars": 523,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"raw\",\n   \"id\": \"b32297a4\",\n   \"metadata\": {},\n   \"source\": [\n    \"---\\n\",\n    \"Conten"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_py/sample_rise_notebook_66.ipynb",
    "chars": 961,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_py/text_outputs_and_images.ipynb",
    "chars": 9537,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This notebook contains outputs of m"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_q/kalman_filter_and_visualization.ipynb",
    "chars": 33698,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_robot/simple_robot_notebook.ipynb",
    "chars": 1309,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": "
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_rust/evcxr_jupyter_tour.ipynb",
    "chars": 15232,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Tour of the EvCxR Jupyter Kernel\\"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_sage/sage_print_hello.ipynb",
    "chars": 591,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": "
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_sas/sas.ipynb",
    "chars": 1620,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"14a71cf0-4339-4ae6-982d-7dda15f3810e\",\n   \"metadata\": {},\n   \"so"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_scala/simple_scala_notebook.ipynb",
    "chars": 1325,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\":"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_scheme/Reference Guide for Calysto Scheme.ipynb",
    "chars": 19379,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<img src=\\\"images/logo-64x64.png\\\"/"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_sos/jupytext_replication.ipynb",
    "chars": 4070,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"Collapsed\": \"false\",\n    \"kernel\": \"SoS\"\n   },\n   \"s"
  },
  {
    "path": "tests/data/notebooks/inputs/ipynb_stata/stata_notebook.ipynb",
    "chars": 3540,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"id\": \"a4033377\",\n   \"metadata\": {},\n   \"outputs\":"
  }
]

// ... and 605 more files (download for full content)

About this extraction

This page contains the full source code of the mwouts/jupytext GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 805 files (8.1 MB), approximately 2.2M tokens, and a symbol index with 1385 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!