Skip to content

Commit 494147a

Browse files
committed
Use mkdocs.utils.load_config instead of ConfigData
1 parent 4578211 commit 494147a

File tree

12 files changed

+99
-69
lines changed

12 files changed

+99
-69
lines changed

mike/commands.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def _redirect_template(user_template=None):
2222

2323

2424
def _add_redirect_to_commit(commit, template, src, dst,
25-
use_directory_urls=True):
25+
use_directory_urls):
2626
if os.path.splitext(src)[1] == '.html':
2727
reldst = os.path.relpath(dst, os.path.dirname(src))
2828
href = '/'.join(reldst.split(os.path.sep))
@@ -81,15 +81,15 @@ def deploy(cfg, version, title=None, aliases=[], update_aliases=False,
8181
with git_utils.Commit(branch, message) as commit:
8282
commit.delete_files([version_str] + list(info.aliases))
8383

84-
for f in git_utils.walk_real_files(cfg.site_dir):
85-
canonical_file = f.copy(destdir, cfg.site_dir)
84+
for f in git_utils.walk_real_files(cfg['site_dir']):
85+
canonical_file = f.copy(destdir, cfg['site_dir'])
8686
commit.add_file(canonical_file)
8787
for d in alias_destdirs:
88-
alias_file = f.copy(d, cfg.site_dir)
88+
alias_file = f.copy(d, cfg['site_dir'])
8989
if redirect:
9090
_add_redirect_to_commit(
9191
commit, t, alias_file.path, canonical_file.path,
92-
cfg.use_directory_urls
92+
cfg['use_directory_urls']
9393
)
9494
else:
9595
commit.add_file(alias_file)
@@ -172,7 +172,7 @@ def alias(cfg, version, aliases, update_aliases=False, redirect=True,
172172
if redirect:
173173
_add_redirect_to_commit(
174174
commit, t, alias_file.path, canonical_file.path,
175-
cfg.use_directory_urls
175+
cfg['use_directory_urls']
176176
)
177177
else:
178178
commit.add_file(alias_file)

mike/driver.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -84,20 +84,20 @@ def add_git_arguments(parser, *, commit=True, prefix=True):
8484

8585
def load_mkdocs_config(args, strict=False):
8686
try:
87-
cfg = mkdocs_utils.ConfigData(args.config_file)
87+
cfg = mkdocs_utils.load_config(args.config_file)
8888
if args.branch is None:
89-
args.branch = cfg.remote_branch
89+
args.branch = cfg['remote_branch']
9090
if args.remote is None:
91-
args.remote = cfg.remote_name
91+
args.remote = cfg['remote_name']
9292
return cfg
93-
except OSError:
93+
except FileNotFoundError as e:
9494
if strict:
95-
raise RuntimeError('{!r} not found'.format(args.config_file))
95+
raise
9696
if args.branch is None or args.remote is None:
97-
raise RuntimeError((
98-
'{!r} not found; pass --config-file or set ' +
99-
'--remote/--branch explicitly'
100-
).format(args.config_file))
97+
raise FileNotFoundError(
98+
'{}; pass --config-file or set --remote/--branch explicitly'
99+
.format(str(e))
100+
)
101101

102102

103103
def check_remote_status(args, strict=False):

mike/mkdocs_plugin.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
try:
1111
from mkdocs.exceptions import PluginError
12-
except ImportError:
12+
except ImportError: # pragma: no cover
1313
PluginError = ValueError
1414

1515

mike/mkdocs_utils.py

+21-9
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,34 @@
1+
import mkdocs.config
12
import os
23
import re
34
import subprocess
45
import yaml
6+
from collections.abc import Iterable
57
from contextlib import contextmanager
68
from tempfile import NamedTemporaryFile
79

810
docs_version_var = 'MIKE_DOCS_VERSION'
911

1012

11-
class ConfigData:
12-
def __init__(self, config_file):
13-
with open(config_file) as f:
14-
config = yaml.load(f, Loader=yaml.Loader)
15-
self.site_dir = os.path.join(os.path.dirname(config_file),
16-
config.get('site_dir', 'site'))
17-
self.remote_name = config.get('remote_name', 'origin')
18-
self.remote_branch = config.get('remote_branch', 'gh-pages')
19-
self.use_directory_urls = config.get('use_directory_urls', True)
13+
def _open_config(config_file=None):
14+
if config_file is None:
15+
config_file = ['mkdocs.yml', 'mkdocs.yaml']
16+
elif not isinstance(config_file, Iterable) or isinstance(config_file, str):
17+
config_file = [config_file]
18+
19+
exc = None
20+
for i in config_file:
21+
try:
22+
return open(i, 'rb')
23+
except FileNotFoundError as e:
24+
if not exc:
25+
exc = e
26+
raise exc
27+
28+
29+
def load_config(config_file=None, **kwargs):
30+
with _open_config(config_file) as f:
31+
return mkdocs.config.load_config(f, **kwargs)
2032

2133

2234
@contextmanager

test/data/basic_theme/mkdocs.yml

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
site_name: test
2+
site_url: https://example.invalid/
23
theme: mkdocs
34

45
nav:

test/data/mkdocs_plugin/mkdocs.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
site_name: test
2-
site_url: https://example.com/
2+
site_url: https://example.invalid/
33
theme:
44
name: mkdocs
55
plugins:

test/data/no_directory_urls/mkdocs.yml

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
site_name: test
2+
site_url: https://example.invalid/
23
theme: mkdocs
34
use_directory_urls: false
45

test/data/remote/mkdocs.yml

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
site_name: test
2+
site_url: https://example.invalid/
23
theme: mkdocs
34
remote_name: myremote
45
remote_branch: mybranch

test/data/site_dir/mkdocs.yml

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
site_name: test
2+
site_url: https://example.invalid/
23
theme: mkdocs
34
site_dir: built_docs
45

test/integration/test_serve.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
@unittest.skipIf(platform.system() == 'Windows',
1313
"SIGINT doesn't work on windows")
14-
class TestList(unittest.TestCase):
14+
class TestServe(unittest.TestCase):
1515
def setUp(self):
1616
self.stage = stage_dir('serve')
1717
git_init()

test/unit/test_commands.py

+15-16
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,12 @@
1010
from mike import commands, git_utils, versions
1111

1212

13-
class MockConfig:
14-
def __init__(self, site_dir, remote_name='origin',
15-
remote_branch='gh-pages', use_directory_urls=True):
16-
self.site_dir = site_dir
17-
self.remote_name = remote_name
18-
self.remote_branch = remote_branch
19-
self.use_directory_urls = use_directory_urls
13+
def mock_config(site_dir, remote_name='origin',
14+
remote_branch='gh-pages', use_directory_urls=True):
15+
return {'site_dir': site_dir,
16+
'remote_name': remote_name,
17+
'remote_branch': remote_branch,
18+
'use_directory_urls': use_directory_urls}
2019

2120

2221
class TestListVersions(unittest.TestCase):
@@ -42,7 +41,7 @@ def test_versions_nonexistent(self):
4241
class TestBase(unittest.TestCase):
4342
def setUp(self):
4443
self.stage = stage_dir(self.stage_dir)
45-
self.cfg = MockConfig(self.stage)
44+
self.cfg = mock_config(self.stage)
4645
git_init()
4746
commit_files(['page.html', 'file.txt', 'dir/index.html'])
4847

@@ -75,10 +74,10 @@ class TestDeploy(TestBase):
7574

7675
def setUp(self):
7776
super().setUp()
78-
self.cfg.site_dir = os.path.join(self.cfg.site_dir, 'site')
77+
self.cfg['site_dir'] = os.path.join(self.cfg['site_dir'], 'site')
7978

8079
def _mock_build(self):
81-
copytree(self.stage, self.cfg.site_dir)
80+
copytree(self.stage, self.cfg['site_dir'])
8281

8382
def _test_deploy(self, expected_message=None,
8483
expected_versions=[versions.VersionInfo('1.0')],
@@ -90,8 +89,8 @@ def _test_deploy(self, expected_message=None,
9089
.format(rev, expected_versions[0].version)
9190
)
9291

93-
if os.path.exists(self.cfg.site_dir):
94-
shutil.rmtree(self.cfg.site_dir)
92+
if os.path.exists(self.cfg['site_dir']):
93+
shutil.rmtree(self.cfg['site_dir'])
9594
self._test_state(expected_message, expected_versions, **kwargs)
9695

9796
def _mock_commit(self):
@@ -134,7 +133,7 @@ def test_aliases(self):
134133
self.assertRegex(f.read(), match_redir('../../1.0/dir/'))
135134

136135
def test_aliases_no_directory_urls(self):
137-
self.cfg.use_directory_urls = False
136+
self.cfg['use_directory_urls'] = False
138137
with commands.deploy(self.cfg, '1.0', aliases=['latest']):
139138
self._mock_build()
140139
check_call_silent(['git', 'checkout', 'gh-pages'])
@@ -365,7 +364,7 @@ def test_alias_from_version(self):
365364

366365
def test_alias_no_directory_urls(self):
367366
self._deploy()
368-
self.cfg.use_directory_urls = False
367+
self.cfg['use_directory_urls'] = False
369368
commands.alias(self.cfg, '1.0', ['greatest'])
370369
check_call_silent(['git', 'checkout', 'gh-pages'])
371370
self._test_alias()
@@ -465,7 +464,7 @@ def test_alias_invalid_version(self):
465464
class TestRetitle(unittest.TestCase):
466465
def setUp(self):
467466
self.stage = stage_dir('retitle')
468-
self.cfg = MockConfig(self.stage)
467+
self.cfg = mock_config(self.stage)
469468
git_init()
470469
commit_files(['file.txt'])
471470

@@ -527,7 +526,7 @@ def test_retitle_invalid(self):
527526
class TestSetDefault(unittest.TestCase):
528527
def setUp(self):
529528
self.stage = stage_dir('set_default')
530-
self.cfg = MockConfig(self.stage)
529+
self.cfg = mock_config(self.stage)
531530
git_init()
532531
commit_files(['file.txt'])
533532

test/unit/test_mkdocs_utils.py

+41-26
Original file line numberDiff line numberDiff line change
@@ -8,48 +8,63 @@
88
from mike import mkdocs_utils
99

1010

11-
class TestConfigData(unittest.TestCase):
11+
# This mostly just tests `load_config` from MkDocs, but we want to be sure it
12+
# behaves as we want it.
13+
class TestLoadConfig(unittest.TestCase):
1214
def test_default(self):
1315
os.chdir(os.path.join(test_data_dir, 'basic_theme'))
14-
cfg = mkdocs_utils.ConfigData('mkdocs.yml')
15-
self.assertEqual(cfg.site_dir, 'site')
16-
self.assertEqual(cfg.remote_name, 'origin')
17-
self.assertEqual(cfg.remote_branch, 'gh-pages')
18-
self.assertEqual(cfg.use_directory_urls, True)
16+
cfg = mkdocs_utils.load_config()
17+
self.assertEqual(cfg['site_dir'], os.path.abspath('site'))
18+
self.assertEqual(cfg['remote_name'], 'origin')
19+
self.assertEqual(cfg['remote_branch'], 'gh-pages')
20+
self.assertEqual(cfg['use_directory_urls'], True)
1921

2022
def test_abs_path(self):
21-
cfg = mkdocs_utils.ConfigData(
23+
cfg = mkdocs_utils.load_config(
2224
os.path.join(test_data_dir, 'basic_theme', 'mkdocs.yml')
2325
)
24-
self.assertEqual(cfg.site_dir,
26+
self.assertEqual(cfg['site_dir'],
2527
os.path.join(test_data_dir, 'basic_theme', 'site'))
26-
self.assertEqual(cfg.remote_name, 'origin')
27-
self.assertEqual(cfg.remote_branch, 'gh-pages')
28-
self.assertEqual(cfg.use_directory_urls, True)
28+
self.assertEqual(cfg['remote_name'], 'origin')
29+
self.assertEqual(cfg['remote_branch'], 'gh-pages')
30+
self.assertEqual(cfg['use_directory_urls'], True)
2931

3032
def test_custom_site_dir(self):
3133
os.chdir(os.path.join(test_data_dir, 'site_dir'))
32-
cfg = mkdocs_utils.ConfigData('mkdocs.yml')
33-
self.assertEqual(cfg.site_dir, 'built_docs')
34-
self.assertEqual(cfg.remote_name, 'origin')
35-
self.assertEqual(cfg.remote_branch, 'gh-pages')
36-
self.assertEqual(cfg.use_directory_urls, True)
34+
cfg = mkdocs_utils.load_config()
35+
self.assertEqual(cfg['site_dir'], os.path.abspath('built_docs'))
36+
self.assertEqual(cfg['remote_name'], 'origin')
37+
self.assertEqual(cfg['remote_branch'], 'gh-pages')
38+
self.assertEqual(cfg['use_directory_urls'], True)
3739

3840
def test_remote(self):
3941
os.chdir(os.path.join(test_data_dir, 'remote'))
40-
cfg = mkdocs_utils.ConfigData('mkdocs.yml')
41-
self.assertEqual(cfg.site_dir, 'site')
42-
self.assertEqual(cfg.remote_name, 'myremote')
43-
self.assertEqual(cfg.remote_branch, 'mybranch')
44-
self.assertEqual(cfg.use_directory_urls, True)
42+
cfg = mkdocs_utils.load_config()
43+
self.assertEqual(cfg['site_dir'], os.path.abspath('site'))
44+
self.assertEqual(cfg['remote_name'], 'myremote')
45+
self.assertEqual(cfg['remote_branch'], 'mybranch')
46+
self.assertEqual(cfg['use_directory_urls'], True)
4547

4648
def test_no_directory_urls(self):
4749
os.chdir(os.path.join(test_data_dir, 'no_directory_urls'))
48-
cfg = mkdocs_utils.ConfigData('mkdocs.yml')
49-
self.assertEqual(cfg.site_dir, 'site')
50-
self.assertEqual(cfg.remote_name, 'origin')
51-
self.assertEqual(cfg.remote_branch, 'gh-pages')
52-
self.assertEqual(cfg.use_directory_urls, False)
50+
cfg = mkdocs_utils.load_config()
51+
self.assertEqual(cfg['site_dir'], os.path.abspath('site'))
52+
self.assertEqual(cfg['remote_name'], 'origin')
53+
self.assertEqual(cfg['remote_branch'], 'gh-pages')
54+
self.assertEqual(cfg['use_directory_urls'], False)
55+
56+
def test_nonexist(self):
57+
os.chdir(os.path.join(test_data_dir, 'basic_theme'))
58+
with self.assertRaisesRegex(FileNotFoundError, r"'nonexist.yml'"):
59+
mkdocs_utils.load_config('nonexist.yml')
60+
with self.assertRaisesRegex(FileNotFoundError, r"'nonexist.yml'"):
61+
mkdocs_utils.load_config(['nonexist.yml', 'nonexist2.yml'])
62+
63+
cfg = mkdocs_utils.load_config(['nonexist.yml', 'mkdocs.yml'])
64+
self.assertEqual(cfg['site_dir'], os.path.abspath('site'))
65+
self.assertEqual(cfg['remote_name'], 'origin')
66+
self.assertEqual(cfg['remote_branch'], 'gh-pages')
67+
self.assertEqual(cfg['use_directory_urls'], True)
5368

5469

5570
class TestInjectPlugin(unittest.TestCase):

0 commit comments

Comments
 (0)