Skip to content

Commit

Permalink
Improve Markdown extension error messages.
Browse files Browse the repository at this point in the history
Fixes mkdocs#782. Note that we mock Markdown in the tests to ensure those
tests are not using Markdown to validate the extension names. We don't
mock Markdown in the tests which we do want Markdown to validate the
extension names.

Also ensure project-min has all relevant extensions.
  • Loading branch information
waylan committed Apr 6, 2018
1 parent a43163f commit d7ad623
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 10 deletions.
1 change: 1 addition & 0 deletions docs/about/release-notes.md
Expand Up @@ -66,6 +66,7 @@ authors should review how [search and themes] interact.

### Other Changes and Additions to Development Version

* Improve Markdown extension error messages. (#782).
* Drop official support for Python 3.3 and set `tornado>=5.0` (#1427).
* Add support for GitLab edit links (#1435).
* Link to GitHub issues from release notes (#644).
Expand Down
12 changes: 11 additions & 1 deletion mkdocs/config/config_options.py
Expand Up @@ -3,6 +3,7 @@
from collections import Sequence
import os
from collections import namedtuple
import markdown

from mkdocs import utils, theme, plugins
from mkdocs.config.base import Config, ValidationError
Expand Down Expand Up @@ -629,7 +630,16 @@ def run_validation(self, value):
extensions.append(item)
else:
raise ValidationError('Invalid Markdown Extensions configuration')
return utils.reduce_list(self.builtins + extensions)

extensions = utils.reduce_list(self.builtins + extensions)

# Confirm that Markdown considers extensions to be valid
try:
markdown.Markdown(extensions=extensions, extension_configs=self.configdata)
except Exception as e:
raise ValidationError(e.args[0])

return extensions

def post_validation(self, config, key_name):
config[self.configkey] = self.configdata
Expand Down
38 changes: 29 additions & 9 deletions mkdocs/tests/config/config_options_tests.py
Expand Up @@ -2,6 +2,7 @@

import os
import unittest
from mock import patch

import mkdocs
from mkdocs import utils
Expand Down Expand Up @@ -491,7 +492,8 @@ def test_defined(self):

class MarkdownExtensionsTest(unittest.TestCase):

def test_simple_list(self):
@patch('markdown.Markdown')
def test_simple_list(self, mockMd):
option = config_options.MarkdownExtensions()
config = {
'markdown_extensions': ['foo', 'bar']
Expand All @@ -503,7 +505,8 @@ def test_simple_list(self):
'mdx_configs': {}
}, config)

def test_list_dicts(self):
@patch('markdown.Markdown')
def test_list_dicts(self, mockMd):
option = config_options.MarkdownExtensions()
config = {
'markdown_extensions': [
Expand All @@ -522,7 +525,8 @@ def test_list_dicts(self):
}
}, config)

def test_mixed_list(self):
@patch('markdown.Markdown')
def test_mixed_list(self, mockMd):
option = config_options.MarkdownExtensions()
config = {
'markdown_extensions': [
Expand All @@ -539,7 +543,8 @@ def test_mixed_list(self):
}
}, config)

def test_builtins(self):
@patch('markdown.Markdown')
def test_builtins(self, mockMd):
option = config_options.MarkdownExtensions(builtins=['meta', 'toc'])
config = {
'markdown_extensions': ['foo', 'bar']
Expand Down Expand Up @@ -577,7 +582,8 @@ def test_builtins_config(self):
'mdx_configs': {'toc': {'permalink': True}}
}, config)

def test_configkey(self):
@patch('markdown.Markdown')
def test_configkey(self, mockMd):
option = config_options.MarkdownExtensions(configkey='bar')
config = {
'markdown_extensions': [
Expand Down Expand Up @@ -605,12 +611,14 @@ def test_none(self):
'mdx_configs': {}
}, config)

def test_not_list(self):
@patch('markdown.Markdown')
def test_not_list(self, mockMd):
option = config_options.MarkdownExtensions()
self.assertRaises(config_options.ValidationError,
option.validate, 'not a list')

def test_invalid_config_option(self):
@patch('markdown.Markdown')
def test_invalid_config_option(self, mockMd):
option = config_options.MarkdownExtensions()
config = {
'markdown_extensions': [
Expand All @@ -622,7 +630,8 @@ def test_invalid_config_option(self):
option.validate, config['markdown_extensions']
)

def test_invalid_config_item(self):
@patch('markdown.Markdown')
def test_invalid_config_item(self, mockMd):
option = config_options.MarkdownExtensions()
config = {
'markdown_extensions': [
Expand All @@ -634,7 +643,8 @@ def test_invalid_config_item(self):
option.validate, config['markdown_extensions']
)

def test_invalid_dict_item(self):
@patch('markdown.Markdown')
def test_invalid_dict_item(self, mockMd):
option = config_options.MarkdownExtensions()
config = {
'markdown_extensions': [
Expand All @@ -645,3 +655,13 @@ def test_invalid_dict_item(self):
config_options.ValidationError,
option.validate, config['markdown_extensions']
)

def test_unknown_extension(self):
option = config_options.MarkdownExtensions()
config = {
'markdown_extensions': ['unknown']
}
self.assertRaises(
config_options.ValidationError,
option.validate, config['markdown_extensions']
)
1 change: 1 addition & 0 deletions requirements/project-min.txt
Expand Up @@ -4,3 +4,4 @@ livereload==2.5.1
Markdown==2.5
PyYAML==3.10
tornado==4.1
mdx_gh_links>=0.2

0 comments on commit d7ad623

Please sign in to comment.