def testLoadWholeConfig(self): text = """\ # a a = b b = 三 <a block> a = b </a> a b <a a block> c "d d" </a> # a """ ApacheConfigLexer = make_lexer() ApacheConfigParser = make_parser() loader = ApacheConfigLoader( ApacheConfigParser(ApacheConfigLexer())) config = loader.loads(text) self.assertEqual( config, { 'b': '三', 'a': ['b', {'block': {'a': 'b'}}, 'b', {'a block': {'c': 'd d'}}] } )
def testAutoTrue(self): text = """\ a 1 a on a true b 0 b off b false """ options = { 'autotrue': True } ApacheConfigLexer = make_lexer(**options) ApacheConfigParser = make_parser(**options) loader = ApacheConfigLoader( ApacheConfigParser(ApacheConfigLexer()), **options) config = loader.loads(text) self.assertEqual( config, { 'a': ['1', '1', '1'], 'b': ['0', '0', '0'] } )
def testFlagBits(self): text = """\ mode = CLEAR | UNSECURE """ options = { 'flagbits': { 'mode': { 'CLEAR': 1, 'STRONG': 1, 'UNSECURE': '32bit' } } } ApacheConfigLexer = make_lexer(**options) ApacheConfigParser = make_parser(**options) loader = ApacheConfigLoader(ApacheConfigParser(ApacheConfigLexer()), **options) config = loader.loads(text) self.assertEqual( config, {'mode': { 'CLEAR': 1, 'STRONG': None, 'UNSECURE': '32bit' }})
def testDefaultConfig(self): text = """\ a = 1 b = 2 """ options = { 'defaultconfig': { 'b': '4', 'c': '3' }, 'mergeduplicateoptions': False } ApacheConfigLexer = make_lexer(**options) ApacheConfigParser = make_parser(**options) loader = ApacheConfigLoader( ApacheConfigParser(ApacheConfigLexer()), **options) config = loader.loads(text) self.assertEqual( config, { 'a': '1', 'b': ['4', '2'], 'c': '3' } )
def testNamedBlocks(self): text = """\ <a /> c = 1 </a /> <a b c> d = 1 </a b c> """ ApacheConfigLexer = make_lexer() ApacheConfigParser = make_parser() loader = ApacheConfigLoader(ApacheConfigParser(ApacheConfigLexer())) config = loader.loads(text) self.assertEqual(config, {'a': [{ '/': { 'c': '1' } }, { 'b c': { 'd': '1' } }]})
def testQuotedBlockTag(self): text = """\ <"a b"> c = 1 </"a b"> <'d e'> f = 1 </'d e'> <g 'h i'> j = 1 </g 'h i'> """ ApacheConfigLexer = make_lexer() ApacheConfigParser = make_parser() loader = ApacheConfigLoader(ApacheConfigParser(ApacheConfigLexer())) config = loader.loads(text) self.assertEqual(config, { 'a b': { 'c': '1' }, 'd e': { 'f': '1' }, 'g': { 'h i': { 'j': '1' } } })
def testLineContinuationInNestedBlock(self): text = """\ <a> b abc \\ pqr\\ <aa> c value2 </aa> </a> """ ApacheConfigLexer = make_lexer() ApacheConfigParser = make_parser() loader = ApacheConfigLoader(ApacheConfigParser(ApacheConfigLexer())) config = loader.loads(text) self.assertEqual(config, {'a': { 'b': 'abc pqr', 'aa': { 'c': 'value2' } }})
def testDisabledNamedBlocks(self): text = """\ <a /> c = 1 </a /> <a b c> d = 1 </a b c> """ options = { 'namedblocks': False } ApacheConfigLexer = make_lexer(**options) ApacheConfigParser = make_parser(**options) loader = ApacheConfigLoader( ApacheConfigParser(ApacheConfigLexer()), **options) config = loader.loads(text) self.assertEqual( config, { 'a /': {'c': '1'}, 'a b c': {'d': '1'} } )
def testLoadEmptyText(self): text = "" ApacheConfigLexer = make_lexer() ApacheConfigParser = make_parser() loader = ApacheConfigLoader(ApacheConfigParser(ApacheConfigLexer())) config = loader.loads(text) self.assertEqual(config, {})
def testMergeEmptyLists(self): options = {} ApacheConfigLexer = make_lexer(**options) ApacheConfigParser = make_parser(**options) loader = ApacheConfigLoader(ApacheConfigParser(ApacheConfigLexer()), **options) self.assertEqual(loader._merge_lists([], []), [])
def testMergeListsWithSameValues(self): options = {} ApacheConfigLexer = make_lexer(**options) ApacheConfigParser = make_parser(**options) loader = ApacheConfigLoader(ApacheConfigParser(ApacheConfigLexer()), **options) self.assertEqual(loader._merge_lists([1], [1]), [1])
def testEscape(self): text = """\ a = \\$b """ ApacheConfigLexer = make_lexer() ApacheConfigParser = make_parser() loader = ApacheConfigLoader(ApacheConfigParser(ApacheConfigLexer())) config = loader.loads(text) self.assertEqual(config, {'a': '$b'})
def testKeyOnlyOption(self): text = """\ key2 key value """ ApacheConfigLexer = make_lexer() ApacheConfigParser = make_parser() loader = ApacheConfigLoader(ApacheConfigParser(ApacheConfigLexer())) config = loader.loads(text) self.assertEqual(config, {'key2': None, 'key': 'value'})
def testLineContinuation(self): text = """\ a = \\ b """ ApacheConfigLexer = make_lexer() ApacheConfigParser = make_parser() loader = ApacheConfigLoader(ApacheConfigParser(ApacheConfigLexer())) config = loader.loads(text) self.assertEqual(config, {'a': 'b'})
def testForceArray(self): text = """\ b = [1] """ options = {'forcearray': True} ApacheConfigLexer = make_lexer(**options) ApacheConfigParser = make_parser(**options) loader = ApacheConfigLoader(ApacheConfigParser(ApacheConfigLexer()), **options) config = loader.loads(text) self.assertEqual(config, {'b': ['1']})
def testNoEscape(self): text = """\ a = \\$b """ options = {'noescape': True} ApacheConfigLexer = make_lexer(**options) ApacheConfigParser = make_parser(**options) loader = ApacheConfigLoader(ApacheConfigParser(ApacheConfigLexer()), **options) config = loader.loads(text) self.assertEqual(config, {'a': '\\$b'})
def testInterpolateVarsIgnoreUndefined(self): text = """\ b = '${a}' """ options = {'interpolatevars': True, 'strictvars': False} ApacheConfigLexer = make_lexer(**options) ApacheConfigParser = make_parser(**options) loader = ApacheConfigLoader(ApacheConfigParser(ApacheConfigLexer()), **options) config = loader.loads(text) self.assertEqual(config, {'b': '${a}'})
def testInterpolateVarsSingleQuote(self): text = """\ a = 1 b = '${a}' """ options = {'allowsinglequoteinterpolation': True} ApacheConfigLexer = make_lexer(**options) ApacheConfigParser = make_parser(**options) loader = ApacheConfigLoader(ApacheConfigParser(ApacheConfigLexer()), **options) config = loader.loads(text) self.assertEqual(config, {'a': '1', 'b': '1'})
def testDuplicateOptionsOverriden(self): text = """\ a = 1 a = 2 """ options = {'mergeduplicateoptions': True} ApacheConfigLexer = make_lexer(**options) ApacheConfigParser = make_parser(**options) loader = ApacheConfigLoader(ApacheConfigParser(ApacheConfigLexer()), **options) config = loader.loads(text) self.assertEqual(config, {'a': '2'})
def testDuplicateBlocksUnmerged(self): text = """\ <a> b = 1 </a> <a> b = 2 </a> """ ApacheConfigLexer = make_lexer() ApacheConfigParser = make_parser() loader = ApacheConfigLoader(ApacheConfigParser(ApacheConfigLexer())) config = loader.loads(text) self.assertEqual(config, {'a': [{'b': '1'}, {'b': '2'}]})
def testHookPreOpen(self): def pre_open(filename, basedir): return 'blah' in filename, filename, basedir options = {'plug': {'pre_open': pre_open}} ApacheConfigLexer = make_lexer(**options) ApacheConfigParser = make_parser(**options) loader = ApacheConfigLoader(ApacheConfigParser(ApacheConfigLexer()), **options) config = loader.load('halb.conf') self.assertEqual(config, {}) self.assertRaises(ApacheConfigError, loader.load, 'blah.conf')
def testLineContinuationOnEmptyLine(self): text = """\ \\ # comment \\ <a> key value </a> """ ApacheConfigLexer = make_lexer() ApacheConfigParser = make_parser() loader = ApacheConfigLoader(ApacheConfigParser(ApacheConfigLexer())) config = loader.loads(text) self.assertEqual(config, {'a': {'key': 'value'}})
def testDuplicateOptionsAllowed(self): text = """\ a = 1 a = 2 # comment a = 3 """ options = {'allowmultioptions': True} ApacheConfigLexer = make_lexer() ApacheConfigParser = make_parser() loader = ApacheConfigLoader(ApacheConfigParser(ApacheConfigLexer()), **options) config = loader.loads(text) self.assertEqual(config, {'a': ['1', '2', '3']})
def testHookPreRead(self): text = """\ blah 1 """ def pre_read(filepath, text): return 'blah' in text, filepath, 'a 1\n' options = {'plug': {'pre_read': pre_read}} ApacheConfigLexer = make_lexer(**options) ApacheConfigParser = make_parser(**options) loader = ApacheConfigLoader(ApacheConfigParser(ApacheConfigLexer()), **options) config = loader.loads(text) self.assertEqual(config, {'a': '1'})
def testHookPreParse(self): text = """\ a 1 b = 2 """ def pre_parse_value(option, value): return option == 'a', option, value + '1' options = {'plug': {'pre_parse_value': pre_parse_value}} ApacheConfigLexer = make_lexer(**options) ApacheConfigParser = make_parser(**options) loader = ApacheConfigLoader(ApacheConfigParser(ApacheConfigLexer()), **options) config = loader.loads(text) self.assertEqual(config, {'a': '11'})
def testDuplicateBlocksMerged_allowMultiOptions(self): text = """\ <a> b = 1 </a> <a> b = 2 </a> """ options = {'mergeduplicateblocks': True, 'allowmultioptions': True} ApacheConfigLexer = make_lexer(**options) ApacheConfigParser = make_parser(**options) loader = ApacheConfigLoader(ApacheConfigParser(ApacheConfigLexer()), **options) config = loader.loads(text) self.assertEqual(config, {'a': {'b': ['1', '2']}})
def testInterpolateEnv(self): text = """\ b = $a c = ${b} e 1 <aa> d = ${c} e = 2 f "${e} + 2" g = '${e}' </aa> """ options = { 'interpolateenv': True } os.environ['a'] = '1' ApacheConfigLexer = make_lexer(**options) ApacheConfigParser = make_parser(**options) loader = ApacheConfigLoader( ApacheConfigParser(ApacheConfigLexer()), **options) config = loader.loads(text) self.assertEqual( config, { 'b': '1', 'c': '1', 'e': '1', 'aa': { 'd': '1', 'e': '2', 'f': '2 + 2', 'g': '${e}' } } )
def testDumpWholeConfig(self): text = """\ # a a = b <a block> a = b </a> a b <a a block> c "d d" b = 三 </a> # a """ expect_text = """\ a b <a> <block> a b </block> </a> a b <a> <a block> c "d d" b 三 </a block> </a> """ ApacheConfigLexer = make_lexer() ApacheConfigParser = make_parser() loader = ApacheConfigLoader(ApacheConfigParser(ApacheConfigLexer())) config = loader.loads(text) gen_text = loader.dumps(config) try: self.assertEqual(expect_text, gen_text) except AssertionError: # Account for non-deterministic ordering of dict items; # swap lines `b 三` and `c "d d"` lines = expect_text.split('\n') lines[9], lines[10] = lines[10], lines[9] expect_text = "\n".join(lines) self.assertEqual(expect_text, gen_text) # Testing dump(filepath, config) tmpd = tempfile.mkdtemp() filepath = os.path.join(tmpd, "config") loader.dump(filepath, config) with io.open(filepath, mode='r', encoding='utf-8') as f: text = f.read() shutil.rmtree(tmpd) self.assertEqual(expect_text, text)
def testDuplicateOptionsDenied(self): text = """\ a = 1 <b/> a = 2 """ options = {'allowmultioptions': False} ApacheConfigLexer = make_lexer() ApacheConfigParser = make_parser() loader = ApacheConfigLoader(ApacheConfigParser(ApacheConfigLexer()), **options) self.assertRaises(ApacheConfigError, loader.loads, text)
def testInterpolateVarsFailOnUndefined(self): text = """\ b = ${a} """ options = { 'interpolatevars': True, } ApacheConfigLexer = make_lexer(**options) ApacheConfigParser = make_parser(**options) loader = ApacheConfigLoader(ApacheConfigParser(ApacheConfigLexer()), **options) self.assertRaises(ApacheConfigError, loader.loads, text)