comparison roundup/configuration.py @ 6356:c26b9ce33ae3

issue2551123 - validate indexer_language in configuration.py Was validated in backends/indexer_xapian.py which would throw an error on access rather than on start. Added validator function to CoreConfig class that runs after config.ini is read. At this time we have access to the indexer setting so can determine if xapian is actually going to be used. Moved test into test/test_config.py and pulled validation code from indexer_xapian.py and test/test_indexer.py.
author John Rouillard <rouilj@ieee.org>
date Mon, 29 Mar 2021 22:47:54 -0400
parents ac5a6ffa377b
children 42db48c30d31
comparison
equal deleted inserted replaced
6355:ac5a6ffa377b 6356:c26b9ce33ae3
18 import roundup.date 18 import roundup.date
19 19
20 from roundup.anypy.strings import b2s 20 from roundup.anypy.strings import b2s
21 import roundup.anypy.random_ as random_ 21 import roundup.anypy.random_ as random_
22 import binascii 22 import binascii
23 from roundup.i18n import _
23 24
24 from roundup.backends import list_backends 25 from roundup.backends import list_backends
25 26
26 if sys.version_info[0] > 2: 27 if sys.version_info[0] > 2:
27 import configparser # Python 3 28 import configparser # Python 3
1842 h.close() 1843 h.close()
1843 logger.removeHandler(hdlr) 1844 logger.removeHandler(hdlr)
1844 logger.handlers = [hdlr] 1845 logger.handlers = [hdlr]
1845 logger.setLevel(self["LOGGING_LEVEL"] or "ERROR") 1846 logger.setLevel(self["LOGGING_LEVEL"] or "ERROR")
1846 1847
1848 def validator(self, options):
1849 """ Validate options once all options are loaded.
1850
1851 Used to validate settings when options are dependent
1852 on each other. E.G. indexer_language can only be
1853 validated if xapian indexer is used.
1854 """
1855 if options['INDEXER']._value in ("", "xapian"):
1856 try:
1857 import xapian
1858 except ImportError:
1859 # indexer is probably '' and xapian isn't present
1860 # so just return at end of method
1861 pass
1862 else:
1863 try:
1864 lang = options["INDEXER_LANGUAGE"]._value
1865 xapian.Stem(lang)
1866 except xapian.InvalidArgumentError:
1867 import textwrap
1868 lang_avail = b2s(xapian.Stem.get_available_languages())
1869 languages = textwrap.fill(_("Valid languages: ") +
1870 lang_avail, 75,
1871 subsequent_indent=" ")
1872 raise ValueError(
1873 _("Invalid indexer_language '%(lang)s' in config.ini for xapian indexer\n\n"
1874 "%(valid)s") % {
1875 "lang": lang,
1876 "valid": languages
1877 }
1878 )
1879
1847 def load(self, home_dir): 1880 def load(self, home_dir):
1848 """Load configuration from path designated by home_dir argument""" 1881 """Load configuration from path designated by home_dir argument"""
1849 if os.path.isfile(os.path.join(home_dir, self.INI_FILE)): 1882 if os.path.isfile(os.path.join(home_dir, self.INI_FILE)):
1850 self.load_ini(home_dir) 1883 self.load_ini(home_dir)
1851 else: 1884 else:
1852 raise NoConfigError(home_dir) 1885 raise NoConfigError(home_dir)
1886
1887 # validator does inter-setting validation checks.
1888 # when there are dependencies between options.
1889 self.validator(self.options)
1890
1853 self.init_logging() 1891 self.init_logging()
1854 self.ext = UserConfig(os.path.join(home_dir, "extensions")) 1892 self.ext = UserConfig(os.path.join(home_dir, "extensions"))
1855 self.detectors = UserConfig(os.path.join(home_dir, "detectors")) 1893 self.detectors = UserConfig(os.path.join(home_dir, "detectors"))
1856 1894
1857 def load_ini(self, home_dir, defaults=None): 1895 def load_ini(self, home_dir, defaults=None):

Roundup Issue Tracker: http://roundup-tracker.org/