Skip to content

Commit 59865fd

Browse files
committed
Simplify LabConfig
and increase the coverage
1 parent 9057817 commit 59865fd

File tree

4 files changed

+53
-69
lines changed

4 files changed

+53
-69
lines changed

src/jupytext_config/jupytext_config.py

+2-7
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,12 @@ def main(self, args):
2323
"""
2424
return 0 if all goes well
2525
"""
26-
print(
27-
f"{self.__class__.__name__}: redefine main() to implement this subcommand"
28-
)
29-
return 1
26+
raise NotImplementedError() # pragma: no cover
3027

3128

3229
class ListDefaultViewer(SubCommand):
3330
def __init__(self):
34-
super().__init__(
35-
"list-default-viewer", "Display current settings in labconfig/"
36-
)
31+
super().__init__("list-default-viewer", "Display current settings in labconfig")
3732

3833
def main(self, args):
3934
LabConfig(settings_file=args.settings_file).read().list_default_viewer()

src/jupytext_config/labconfig.py

+22-54
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,8 @@
55
notebook will cause jupyterlab to open it in an editor, i.e. as a text file
66
"""
77

8-
import copy
98
import json
109
import logging
11-
12-
# import pprint
1310
from pathlib import Path
1411

1512
DEFAULT_SETTINGS_FILE = (
@@ -28,38 +25,36 @@ class LabConfig:
2825
"r",
2926
]
3027

31-
def __init__(self, logger=None, settings_file=DEFAULT_SETTINGS_FILE):
28+
def __init__(self, *, settings_file, logger=None):
29+
self.settings_file = Path(settings_file)
3230
self.logger = logger or logging.getLogger(__name__)
3331
self.config = {}
34-
# the state before any changes
35-
self._prior_config = {}
36-
self.settings_file = Path(settings_file)
3732

3833
def read(self):
3934
"""
4035
read the labconfig settings file
4136
"""
42-
try:
43-
if self.settings_file.exists():
44-
with self.settings_file.open() as fid:
45-
self.config = json.load(fid)
46-
except OSError as exc:
47-
self.logger.error(f"Could not read {self.settings_file}", exc)
48-
return False
49-
# store for further comparison
50-
self._prior_config = copy.deepcopy(self.config)
37+
if self.settings_file.exists():
38+
with self.settings_file.open() as fid:
39+
self.config = json.load(fid)
40+
else:
41+
self.logger.info(f"Could not read from {self.settings_file} (not found)")
42+
5143
return self
5244

45+
def get_viewers(self):
46+
return self.config.setdefault(
47+
"@jupyterlab/docmanager-extension:plugin", {}
48+
).setdefault("defaultViewers", {})
49+
5350
def list_default_viewer(self):
5451
"""
5552
list the current labconfig settings
5653
"""
5754
self.logger.debug(
5855
f"Current @jupyterlab/docmanager-extension:plugin in {self.settings_file}"
5956
)
60-
docmanager = self.config.get("@jupyterlab/docmanager-extension:plugin", {})
61-
viewers = docmanager.get("defaultViewers", {})
62-
for key, value in viewers.items():
57+
for key, value in self.get_viewers().items():
6358
print(f"{key}: {value}")
6459

6560
def set_default_viewers(self, doctypes=None):
@@ -70,18 +65,7 @@ def set_default_viewers(self, doctypes=None):
7065
return self
7166

7267
def set_default_viewer(self, doctype):
73-
if "@jupyterlab/docmanager-extension:plugin" not in self.config:
74-
self.config["@jupyterlab/docmanager-extension:plugin"] = {}
75-
if (
76-
"defaultViewers"
77-
not in self.config["@jupyterlab/docmanager-extension:plugin"]
78-
):
79-
self.config["@jupyterlab/docmanager-extension:plugin"][
80-
"defaultViewers"
81-
] = {}
82-
viewers = self.config["@jupyterlab/docmanager-extension:plugin"][
83-
"defaultViewers"
84-
]
68+
viewers = self.get_viewers()
8569
if doctype not in viewers:
8670
viewers[doctype] = "Jupytext Notebook"
8771

@@ -93,30 +77,14 @@ def unset_default_viewers(self, doctypes=None):
9377
return self
9478

9579
def unset_default_viewer(self, doctype):
96-
viewers = self.config.get("@jupyterlab/docmanager-extension:plugin", {}).get(
97-
"defaultViewers", {}
98-
)
99-
if doctype not in viewers:
100-
return
101-
del viewers[doctype]
80+
viewers = self.get_viewers()
81+
if doctype in viewers:
82+
del viewers[doctype]
10283

103-
def write(self) -> bool:
84+
def write(self):
10485
"""
10586
write the labconfig settings file
10687
"""
107-
# compare - avoid changing the file if nothing changed
108-
if self.config == self._prior_config:
109-
self.logger.info(f"Nothing to do for {self.settings_file}")
110-
return True
111-
112-
# save
113-
try:
114-
self.settings_file.parent.mkdir(parents=True, exist_ok=True)
115-
with self.settings_file.open("w") as fid:
116-
json.dump(self.config, fid, indent=2)
117-
# useful in case of successive write's
118-
self._prior_config = copy.deepcopy(self.config)
119-
return True
120-
except OSError as exc:
121-
self.logger.error(f"Could not write {self.settings_file}", exc)
122-
return False
88+
self.settings_file.parent.mkdir(parents=True, exist_ok=True)
89+
with self.settings_file.open("w") as fid:
90+
json.dump(self.config, fid, indent=2)

tests/integration/jupytext_config/test_jupytext_config.py

+12
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,15 @@ def test_jupytext_config_cli(tmp_path):
1616
assert "markdown" in system(
1717
"jupytext-config", "--settings-file", settings_file, "list-default-viewer"
1818
)
19+
system(
20+
"jupytext-config",
21+
"--settings-file",
22+
str(settings_file),
23+
"unset-default-viewer",
24+
"markdown",
25+
)
26+
list_viewers = system(
27+
"jupytext-config", "--settings-file", settings_file, "list-default-viewer"
28+
)
29+
assert "python" in list_viewers
30+
assert "markdown" not in list_viewers

tests/unit/test_labconfig.py

+17-8
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77

88
@pytest.fixture()
9-
def sample_lab_config():
9+
def sample_viewer_config():
1010
return {
1111
"@jupyterlab/docmanager-extension:plugin": {
1212
"defaultViewers": {
@@ -22,25 +22,34 @@ def sample_lab_config():
2222
}
2323

2424

25+
@pytest.fixture()
26+
def sample_empty_viewer_config():
27+
return {"@jupyterlab/docmanager-extension:plugin": {"defaultViewers": {}}}
28+
29+
2530
@pytest.fixture()
2631
def settings_file(tmp_path):
2732
return tmp_path / "default_setting_overrides.json"
2833

2934

30-
def test_read_config(settings_file, sample_lab_config):
31-
(settings_file).write_text(json.dumps(sample_lab_config))
35+
def test_read_config(settings_file, sample_viewer_config):
36+
(settings_file).write_text(json.dumps(sample_viewer_config))
3237
labconfig = LabConfig(settings_file=settings_file).read()
33-
assert labconfig.config == sample_lab_config
38+
assert labconfig.config == sample_viewer_config
3439

3540

36-
def test_set_default_viewers(settings_file, sample_lab_config):
41+
def test_set_unset_default_viewers(
42+
settings_file, sample_viewer_config, sample_empty_viewer_config
43+
):
3744
labconfig = LabConfig(settings_file=settings_file)
3845
labconfig.set_default_viewers()
39-
assert labconfig.config == sample_lab_config
46+
assert labconfig.config == sample_viewer_config
47+
labconfig.unset_default_viewers()
48+
assert labconfig.config == sample_empty_viewer_config
4049

4150

42-
def test_write_config(settings_file, sample_lab_config):
51+
def test_write_config(settings_file, sample_viewer_config):
4352
labconfig = LabConfig(settings_file=settings_file)
4453
labconfig.set_default_viewers()
4554
labconfig.write()
46-
assert json.loads(settings_file.read_text()) == sample_lab_config
55+
assert json.loads(settings_file.read_text()) == sample_viewer_config

0 commit comments

Comments
 (0)