# -*- coding: utf-8 -*- """ EarwigBot's Wiki Toolset: Misc Functions This module, a component of the wiki.tools package, contains miscellaneous functions that are not methods of any class, like get_site(). There's no need to import this module explicitly. All functions here are automatically available from wiki.tools. """ from core import config from wiki.tools.exceptions import ConfigError, SiteNotFoundError from wiki.tools.site import Site __all__ = ["get_site"] def get_site(name=None, project=None, lang=None): """Returns a Site instance based on information from our config file. With no arguments, returns the default site as specified by our config file. This is default = config.wiki["defaultSite"]; config.wiki["sites"][default]. With `name` specified, returns the site specified by config.wiki["sites"][name]. With `project` and `lang` specified, returns the site specified by the member of config.wiki["sites"], `s`, for which s["project"] == project and s["lang"] == lang. Specifying a project without a lang or a lang without a project will raise TypeError. If all three args are specified, `name` will be first tried, then `project` and `lang`. If, with any number of args, a site cannot be found in the config, SiteNotFoundError is raised. """ if config._config is None: e = "Config file has not been loaded: use config.verify_config() and then config.parse_config() to do so." raise ConfigError(e) if (project is None and lang is not None) or (project is not None and lang is None): e = "Keyword arguments 'lang' and 'project' must be specified together." raise TypeError(e) if name is None and project is None: # no args given (project is None implies lang is None) try: # ...so use the default site default = config.wiki["defaultSite"] except KeyError: e = "Default site is not specified in config." raise SiteNotFoundError(e) try: return config.wiki["sites"][default] except KeyError: e = "Default site specified by config is not in the config's sites list." raise SiteNotFoundError(e) if name is not None: # name arg given, but don't look at others yet try: return config.wiki["sites"][name] except KeyError: if project is None: # implies lang is None, i.e., only name was given e = "Site '{0}' not found in config.".format(name) raise SiteNotFoundError(e) for site in config.wiki["sites"].values(): if site["project"] == project and site["lang"] == lang: return site e = "Neither site '{0}' nor site '{1}:{2}' found in config.".format(name, project, lang) raise SiteNotFoundError(e) for site in config.wiki["sites"].values(): # implied lang and proj are not None if site["project"] == project and site["lang"] == lang: return site e = "Site '{0}:{1}' not found in config.".format(project, lang) raise SiteNotFoundError(e)