Skip to content

Commit 4cf9be6

Browse files
committed
Order the notebook metadata for consistency with v1.16
1 parent b0f97c7 commit 4cf9be6

File tree

2 files changed

+80
-0
lines changed

2 files changed

+80
-0
lines changed

src/jupytext/jupytext.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,8 @@ def filter_notebook(self, nb, metadata, preserve_cell_ids=False):
188188
metadata = insert_jupytext_info_and_filter_metadata(
189189
metadata, self.fmt, self.implementation, unsupported_keys=unsupported_keys
190190
)
191+
# We sort the notebook metadata for consistency with v1.16
192+
metadata = dict(sorted(metadata.items()))
191193

192194
cells = []
193195
for cell in nb.cells:

tests/integration/contents_manager/test_contentsmanager.py

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1877,3 +1877,81 @@ async def test_hash_changes_if_paired_file_is_edited(tmp_path, cm, python_notebo
18771877
# the hash is for the pair (inputs first)
18781878
model_from_py_file = await ensure_async(cm.get("notebook.py", require_hash=True))
18791879
assert model_from_py_file["hash"] == new_model["hash"]
1880+
1881+
1882+
@pytest.mark.requires_myst
1883+
async def test_metadata_stays_in_order_1368(
1884+
tmp_path,
1885+
cm,
1886+
md="""---
1887+
jupytext:
1888+
formats: md:myst
1889+
notebook_metadata_filter: -jupytext.text_representation.jupytext_version
1890+
text_representation:
1891+
extension: .md
1892+
format_name: myst
1893+
format_version: 0.13
1894+
kernelspec:
1895+
display_name: itables
1896+
language: python
1897+
name: itables
1898+
---
1899+
1900+
A markdown cell
1901+
""",
1902+
):
1903+
cm.root_dir = str(tmp_path)
1904+
1905+
(tmp_path / "nb.md").write_text(md)
1906+
1907+
model = await ensure_async(cm.get(path="nb.md"))
1908+
assert list(model["content"]["metadata"].keys()) == [
1909+
"jupytext",
1910+
"kernelspec",
1911+
], "order must be preserved"
1912+
1913+
cm.save(model=model, path="nb.md")
1914+
compare((tmp_path / "nb.md").read_text(), md)
1915+
1916+
1917+
@pytest.mark.requires_myst
1918+
async def test_jupytext_orders_root_metadata(
1919+
tmp_path,
1920+
cm,
1921+
md="""---
1922+
title: Quick test
1923+
jupytext:
1924+
formats: md:myst
1925+
notebook_metadata_filter: -jupytext.text_representation.jupytext_version
1926+
root_level_metadata_filter: -title
1927+
text_representation:
1928+
extension: .md
1929+
format_name: myst
1930+
format_version: 0.13
1931+
kernelspec:
1932+
display_name: itables
1933+
language: python
1934+
name: itables
1935+
---
1936+
1937+
A markdown cell
1938+
""",
1939+
):
1940+
cm.root_dir = str(tmp_path)
1941+
1942+
(tmp_path / "nb.md").write_text(md)
1943+
1944+
model = await ensure_async(cm.get(path="nb.md"))
1945+
assert list(model["content"]["metadata"].keys()) == [
1946+
"jupytext",
1947+
"kernelspec",
1948+
], "order must be preserved"
1949+
1950+
# simulate jupyter changing the order of the metadata
1951+
model["content"]["metadata"]["jupytext"] = model["content"]["metadata"].pop(
1952+
"jupytext"
1953+
)
1954+
assert list(model["content"]["metadata"].keys()) == ["kernelspec", "jupytext"]
1955+
1956+
cm.save(model=model, path="nb.md")
1957+
compare((tmp_path / "nb.md").read_text(), md)

0 commit comments

Comments
 (0)