-
Notifications
You must be signed in to change notification settings - Fork 386
/
test_pre_commit_5_reformat_markdown.py
137 lines (113 loc) · 4.15 KB
/
test_pre_commit_5_reformat_markdown.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import pytest
from git.exc import HookExecutionError
from nbformat.v4.nbbase import new_code_cell, new_markdown_cell, new_notebook
from pre_commit.main import main as pre_commit
from jupytext import read, write
from .utils import (
requires_pandoc,
skip_pre_commit_tests_on_windows,
skip_pre_commit_tests_when_jupytext_folder_is_not_a_git_repo,
)
@requires_pandoc
@skip_pre_commit_tests_on_windows
@skip_pre_commit_tests_when_jupytext_folder_is_not_a_git_repo
def test_pre_commit_hook_sync_reformat_code_and_markdown(
tmpdir,
cwd_tmpdir,
tmp_repo,
jupytext_repo_root,
jupytext_repo_rev,
notebook_with_outputs,
):
"""Here we sync the ipynb notebook with a py:percent file and also apply black and pandoc to reformat both
code and markdown cells.
Note: the new cell ids introduced in nbformat 5.1.0 are not yet supported by all the programs that treat
ipynb files. Consequently we pin the version of nbformat to 5.0.8 in all the environments below (and you
will have to do the same on the environment in which you edit the notebooks).
"""
pre_commit_config_yaml = f"""
repos:
- repo: {jupytext_repo_root}
rev: {jupytext_repo_rev}
hooks:
- id: jupytext
args: [--sync, --pipe-fmt, ipynb, --pipe, 'pandoc --from ipynb --to ipynb --markdown-headings=atx', --show-changes]
additional_dependencies:
- nbformat==5.0.8 # because pandoc 2.11.4 does not preserve yet the new cell ids
- id: jupytext
args: [--sync, --pipe, black, --show-changes]
additional_dependencies:
- black==22.3.0 # Matches black hook below
- nbformat==5.0.8 # for compatibility with the pandoc hook above
- repo: https://github.com/psf/black
rev: 22.3.0
hooks:
- id: black
"""
tmpdir.join(".pre-commit-config.yaml").write(pre_commit_config_yaml)
tmp_repo.git.add(".pre-commit-config.yaml")
pre_commit(["install", "--install-hooks", "-f"])
tmpdir.join("jupytext.toml").write('formats = "ipynb,py:percent"')
tmp_repo.git.add("jupytext.toml")
tmp_repo.index.commit("pair notebooks")
# write a test notebook
notebook = new_notebook(
cells=[
new_code_cell("1+1"),
new_markdown_cell(
"""This is a complex markdown cell
# With a h1 header
## And a h2 header
| And | A | Table |
| --------- | ---| ----- |
| 0 | 1 | 2 |
!!!WARNING!!! This hook does not seem compatible with
explicit paragraph breaks (two spaces at the end of a line).
And a VERY long line.
""".replace(
"VERY ", "very " * 51
)
),
],
metadata=notebook_with_outputs.metadata,
)
# We write the notebook in version 4.4, i.e. with the equivalent of nbformat version 5.0.8
notebook.nbformat = 4
notebook.nbformat_minor = 4
write(notebook, "test.ipynb")
# try to commit it, should fail because
# 1. the py version hasn't been added
# 2. the first cell is '1+1' which is not black compliant
# 3. the second cell needs to be wrapped
tmp_repo.git.add("test.ipynb")
with pytest.raises(
HookExecutionError,
match="files were modified by this hook",
):
tmp_repo.index.commit("failing")
# Add the two files
tmp_repo.git.add("test.ipynb")
tmp_repo.git.add("test.py")
# now the commit will succeed
tmp_repo.index.commit("passing")
assert "test.ipynb" in tmp_repo.tree()
assert "test.py" in tmp_repo.tree()
# both the code and the markdown cells were reformatted
nb = read("test.ipynb")
assert nb.cells[0].source == "1 + 1"
print(nb.cells[1].source)
assert (
nb.cells[1].source
== """This is a complex markdown cell
# With a h1 header
## And a h2 header
| And | A | Table |
|-----|-----|-------|
| 0 | 1 | 2 |
!!!WARNING!!! This hook does not seem compatible with explicit paragraph
breaks (two spaces at the end of a line).
And a very very very very very very very very very very very very very
very very very very very very very very very very very very very very
very very very very very very very very very very very very very very
very very very very very very very very very very long line."""
)