def load_config(self, options, config_file_path=None): """ Load config from a dict of options. Returns a tuple of (errors, warnings).""" self.config = Config(schema=self.config_scheme, config_file_path=config_file_path) self.config.load_dict(options) return self.config.validate()
def test_paths_localized_to_config(self): base_path = os.path.abspath('.') cfg = Config( [('watch', config_options.ListOfPaths())], config_file_path=os.path.join(base_path, 'mkdocs.yml'), ) test_config = {'watch': ['foo']} cfg.load_dict(test_config) fails, warns = cfg.validate() self.assertEqual(len(fails), 0) self.assertEqual(len(warns), 0) self.assertIsInstance(cfg['watch'], list) self.assertEqual(cfg['watch'], [os.path.join(base_path, 'foo')])
def test_dir_is_config_dir_fails(self): cfg = Config( [('dir', config_options.Dir())], config_file_path=os.path.join(os.path.abspath('.'), 'mkdocs.yml'), ) test_config = {'dir': '.'} cfg.load_dict(test_config) fails, warns = cfg.validate() self.assertEqual(len(fails), 1) self.assertEqual(len(warns), 0)
def test_dir_bad_encoding_fails(self): cfg = Config( [('dir', config_options.Dir())], config_file_path=os.path.join(os.path.abspath('.'), 'mkdocs.yml'), ) test_config = {'dir': 'юникод'.encode(encoding='ISO 8859-5')} cfg.load_dict(test_config) fails, warns = cfg.validate() self.assertEqual(len(fails), 1) self.assertEqual(len(warns), 0)
def test_dir_unicode(self): cfg = Config( [('dir', config_options.Dir())], config_file_path=os.path.join(os.path.abspath('.'), 'mkdocs.yml'), ) test_config = {'dir': 'юникод'} cfg.load_dict(test_config) fails, warns = cfg.validate() self.assertEqual(len(fails), 0) self.assertEqual(len(warns), 0) self.assertIsInstance(cfg['dir'], utils.text_type)
def test_doc_dir_is_config_dir(self): cfg = Config( [('docs_dir', config_options.Dir())], config_file_path=os.path.join(os.path.abspath('.'), 'mkdocs.yml'), ) test_config = { 'docs_dir': '.' } cfg.load_dict(test_config) fails, warns = cfg.validate() self.assertEqual(len(fails), 1) self.assertEqual(len(warns), 0)
def load_config(self, options): """ Load config from a dict of options. Returns a tuple of (errors, warnings).""" self.config = Config(schema=self.config_scheme) self.config.load_dict(options) return self.config.validate()
class BasePlugin(object): """ Plugin base class. All plugins should subclass this class. """ config_scheme = () config = {} def load_config(self, options): """ Load config from a dict of options. Returns a tuple of (errors, warnings).""" self.config = Config(schema=self.config_scheme) self.config.load_dict(options) return self.config.validate()
class BasePlugin: """ Plugin base class. All plugins should subclass this class. """ config_scheme = () config = {} def load_config(self, options, config_file_path=None): """ Load config from a dict of options. Returns a tuple of (errors, warnings).""" self.config = Config(schema=self.config_scheme, config_file_path=config_file_path) self.config.load_dict(options) return self.config.validate()
def test_dir_filesystemencoding(self): cfg = Config( [('dir', config_options.Dir())], config_file_path=os.path.join(os.path.abspath('.'), 'mkdocs.yml'), ) test_config = { 'dir': 'Übersicht'.encode(encoding=sys.getfilesystemencoding()) } cfg.load_dict(test_config) fails, warns = cfg.validate() # str does not include byte strings so validation fails self.assertEqual(len(fails), 1) self.assertEqual(len(warns), 0)
def test_config_dir_prepended(self): base_path = os.path.abspath('.') cfg = Config( [('dir', config_options.Dir())], config_file_path=os.path.join(base_path, 'mkdocs.yml'), ) test_config = {'dir': 'foo'} cfg.load_dict(test_config) fails, warns = cfg.validate() self.assertEqual(len(fails), 0) self.assertEqual(len(warns), 0) self.assertIsInstance(cfg['dir'], utils.text_type) self.assertEqual(cfg['dir'], os.path.join(base_path, 'foo'))
def test_dir_bad_encoding_fails(self): cfg = Config( [('dir', config_options.Dir())], config_file_path=os.path.join(os.path.abspath('.'), 'mkdocs.yml'), ) test_config = {'dir': 'юникод'.encode(encoding='ISO 8859-5')} cfg.load_dict(test_config) fails, warns = cfg.validate() if sys.platform.startswith('win') and not utils.PY3: # PY2 on Windows seems to be able to decode anything we give it. # But that just means less possable errors for those users so we allow it. self.assertEqual(len(fails), 0) else: self.assertEqual(len(fails), 1) self.assertEqual(len(warns), 0)
def validate_config(self, config): """ Given a config with values for site_dir and doc_dir, run site_dir post_validation. """ site_dir = config_options.SiteDir() docs_dir = config_options.Dir() fname = os.path.join(os.path.abspath('..'), 'mkdocs.yml') config['docs_dir'] = docs_dir.validate(config['docs_dir']) config['site_dir'] = site_dir.validate(config['site_dir']) schema = [ ('site_dir', site_dir), ('docs_dir', docs_dir), ] cfg = Config(schema, fname) cfg.load_dict(config) failed, warned = cfg.validate() if failed: raise config_options.ValidationError(failed) return True
def build_rss_feed(config: Config, working_dir: str, type_: str) -> Feed: """Create the RSS feed data from the content. Args: config: MkDocs config object. type_: type of feed, one of: daily, weekly, monthly or yearly. Returns: Feed object with the data """ site_url = re.sub("/$", "", config["site_url"]) try: logo_url: Optional[str] = f"{site_url}/{config['theme']['logo']}" except KeyError: logo_url = None author = config.get("site_author", None) entries = _build_rss_entries(config, working_dir, type_, author) try: published = max(entries).published except ValueError: published = datetime.datetime.now() return Feed( ttl=TTL[type_], generator=f"mkdocs-newsletter - v{__version__}", title=config.get("site_name", None), link=site_url, rss_link=f"{site_url}/{type_}.xml", logo=logo_url, description=config.get("site_description", None), author=author, published=published, entries=entries, )
def test_dir_filesystemencoding(self): cfg = Config( [('dir', config_options.Dir())], config_file_path=os.path.join(os.path.abspath('.'), 'mkdocs.yml'), ) test_config = { 'dir': 'Übersicht'.encode(encoding=sys.getfilesystemencoding()) } cfg.load_dict(test_config) fails, warns = cfg.validate() if utils.PY3: # In PY3 string_types does not include byte strings so validation fails self.assertEqual(len(fails), 1) self.assertEqual(len(warns), 0) else: # In PY2 string_types includes byte strings so validation passes # This test confirms that the byte string is properly decoded self.assertEqual(len(fails), 0) self.assertEqual(len(warns), 0) self.assertIsInstance(cfg['dir'], utils.text_type)
def run_validation(self, value): Config.validate(self) return self
def __init__(self, *config_options): BaseConfigOption.__init__(self) Config.__init__(self, config_options) self.default = {}