summaryrefslogtreecommitdiff
path: root/reconfigure/parsers
diff options
context:
space:
mode:
Diffstat (limited to 'reconfigure/parsers')
-rw-r--r--reconfigure/parsers/__init__.py22
-rw-r--r--reconfigure/parsers/bind9.py3
-rw-r--r--reconfigure/parsers/ini.py9
-rw-r--r--reconfigure/parsers/iniparse/__init__.py28
-rw-r--r--reconfigure/parsers/iniparse/compat.py44
-rw-r--r--reconfigure/parsers/iniparse/ini.py16
-rw-r--r--reconfigure/parsers/iniparse/utils.py4
-rw-r--r--reconfigure/parsers/jsonparser.py3
-rw-r--r--reconfigure/parsers/nginx.py4
9 files changed, 82 insertions, 51 deletions
diff --git a/reconfigure/parsers/__init__.py b/reconfigure/parsers/__init__.py
index 8de7aeb..af88033 100644
--- a/reconfigure/parsers/__init__.py
+++ b/reconfigure/parsers/__init__.py
@@ -1,14 +1,14 @@
-from base import BaseParser
-from bind9 import BIND9Parser
-from exports import ExportsParser
-from ini import IniFileParser
-from iptables import IPTablesParser
-from jsonparser import JsonParser
-from nginx import NginxParser
-from nsd import NSDParser
-from ssv import SSVParser
-from squid import SquidParser
-from crontab import CrontabParser
+from reconfigure.parsers.base import BaseParser
+from reconfigure.parsers.bind9 import BIND9Parser
+from reconfigure.parsers.exports import ExportsParser
+from reconfigure.parsers.ini import IniFileParser
+from reconfigure.parsers.iptables import IPTablesParser
+from reconfigure.parsers.jsonparser import JsonParser
+from reconfigure.parsers.nginx import NginxParser
+from reconfigure.parsers.nsd import NSDParser
+from reconfigure.parsers.ssv import SSVParser
+from reconfigure.parsers.squid import SquidParser
+from reconfigure.parsers.crontab import CrontabParser
__all__ = [
'BaseParser',
diff --git a/reconfigure/parsers/bind9.py b/reconfigure/parsers/bind9.py
index d5c8e01..123a799 100644
--- a/reconfigure/parsers/bind9.py
+++ b/reconfigure/parsers/bind9.py
@@ -9,7 +9,8 @@ class BIND9Parser (NginxParser):
tokens = [
(r"[\w_]+\s*?.*?{", lambda s, t: ('section_start', t)),
- (r"[\w\d_:]+?.*?;", lambda s, t: ('option', t)),
+ (r"[\w\d_:.]+?.*?;", lambda s, t: ('option', t)),
+ (r"\".*?\"\s*;", lambda s, t: ('option', t)),
(r"\s", lambda s, t: 'whitespace'),
(r"$^", lambda s, t: 'newline'),
(r"\#.*?\n", lambda s, t: ('comment', t)),
diff --git a/reconfigure/parsers/ini.py b/reconfigure/parsers/ini.py
index dbd0c7c..2f3b82e 100644
--- a/reconfigure/parsers/ini.py
+++ b/reconfigure/parsers/ini.py
@@ -1,7 +1,11 @@
from reconfigure.nodes import *
from reconfigure.parsers import BaseParser
-from iniparse import INIConfig
-from StringIO import StringIO
+from reconfigure.parsers.iniparse import INIConfig
+
+try:
+ from StringIO import StringIO
+except ImportError:
+ from io import StringIO
class IniFileParser (BaseParser):
@@ -48,7 +52,6 @@ class IniFileParser (BaseParser):
def stringify(self, tree):
cp = INIConfig()
-
for section in tree.children:
if self.sectionless and section.name is None:
sectionname = self.nullsection
diff --git a/reconfigure/parsers/iniparse/__init__.py b/reconfigure/parsers/iniparse/__init__.py
index 618bd20..ca5d579 100644
--- a/reconfigure/parsers/iniparse/__init__.py
+++ b/reconfigure/parsers/iniparse/__init__.py
@@ -3,17 +3,25 @@
# Copyright (c) 2007 Tim Lauridsen <tla@rasmil.dk>
# All Rights Reserved. See LICENSE-PSF & LICENSE for details.
-from ini import INIConfig, change_comment_syntax
-from config import BasicConfig, ConfigNamespace
-from compat import RawConfigParser, ConfigParser, SafeConfigParser
-from utils import tidy
+from reconfigure.parsers.iniparse.ini import INIConfig, change_comment_syntax
+from reconfigure.parsers.iniparse.config import BasicConfig, ConfigNamespace
+from reconfigure.parsers.iniparse.compat import RawConfigParser, ConfigParser, SafeConfigParser
+from reconfigure.parsers.iniparse.utils import tidy
-from ConfigParser import DuplicateSectionError, \
- NoSectionError, NoOptionError, \
- InterpolationMissingOptionError, \
- InterpolationDepthError, \
- InterpolationSyntaxError, \
- DEFAULTSECT, MAX_INTERPOLATION_DEPTH
+try:
+ from ConfigParser import DuplicateSectionError, \
+ NoSectionError, NoOptionError, \
+ InterpolationMissingOptionError, \
+ InterpolationDepthError, \
+ InterpolationSyntaxError, \
+ DEFAULTSECT, MAX_INTERPOLATION_DEPTH
+except ImportError:
+ from configparser import DuplicateSectionError, \
+ NoSectionError, NoOptionError, \
+ InterpolationMissingOptionError, \
+ InterpolationDepthError, \
+ InterpolationSyntaxError, \
+ DEFAULTSECT, MAX_INTERPOLATION_DEPTH
__all__ = [
'BasicConfig', 'ConfigNamespace',
diff --git a/reconfigure/parsers/iniparse/compat.py b/reconfigure/parsers/iniparse/compat.py
index 17c4f67..01df27c 100644
--- a/reconfigure/parsers/iniparse/compat.py
+++ b/reconfigure/parsers/iniparse/compat.py
@@ -12,19 +12,33 @@ The underlying INIConfig object can be accessed as cfg.data
"""
import re
-from ConfigParser import DuplicateSectionError, \
- NoSectionError, NoOptionError, \
- InterpolationMissingOptionError, \
- InterpolationDepthError, \
- InterpolationSyntaxError, \
- DEFAULTSECT, MAX_INTERPOLATION_DEPTH
+try:
+ from ConfigParser import DuplicateSectionError, \
+ NoSectionError, NoOptionError, \
+ InterpolationMissingOptionError, \
+ InterpolationDepthError, \
+ InterpolationSyntaxError, \
+ DEFAULTSECT, MAX_INTERPOLATION_DEPTH
+
+ # These are imported only for compatiability.
+ # The code below does not reference them directly.
+ from ConfigParser import Error, InterpolationError, \
+ MissingSectionHeaderError, ParsingError
+except ImportError:
+ from configparser import DuplicateSectionError, \
+ NoSectionError, NoOptionError, \
+ InterpolationMissingOptionError, \
+ InterpolationDepthError, \
+ InterpolationSyntaxError, \
+ DEFAULTSECT, MAX_INTERPOLATION_DEPTH
+
+ # These are imported only for compatiability.
+ # The code below does not reference them directly.
+ from configparser import Error, InterpolationError, \
+ MissingSectionHeaderError, ParsingError
+
+import reconfigure.parsers.iniparse.ini
-# These are imported only for compatiability.
-# The code below does not reference them directly.
-from ConfigParser import Error, InterpolationError, \
- MissingSectionHeaderError, ParsingError
-
-import ini
class RawConfigParser(object):
def __init__(self, defaults=None, dict_type=dict):
@@ -56,7 +70,7 @@ class RawConfigParser(object):
# The default section is the only one that gets the case-insensitive
# treatment - so it is special-cased here.
if section.lower() == "default":
- raise ValueError, 'Invalid section name: %s' % section
+ raise ValueError('Invalid section name: %s' % section)
if self.has_section(section):
raise DuplicateSectionError(section)
@@ -143,7 +157,7 @@ class RawConfigParser(object):
def getboolean(self, section, option):
v = self.get(section, option)
if v.lower() not in self._boolean_states:
- raise ValueError, 'Not a boolean: %s' % v
+ raise ValueError('Not a boolean: %s' % v)
return self._boolean_states[v.lower()]
def has_option(self, section, option):
@@ -234,7 +248,7 @@ class ConfigParser(RawConfigParser):
if "%(" in value:
try:
value = value % vars
- except KeyError, e:
+ except KeyError as e:
raise InterpolationMissingOptionError(
option, section, rawval, e.args[0])
else:
diff --git a/reconfigure/parsers/iniparse/ini.py b/reconfigure/parsers/iniparse/ini.py
index 7881fd2..84611ba 100644
--- a/reconfigure/parsers/iniparse/ini.py
+++ b/reconfigure/parsers/iniparse/ini.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
"""Access and/or modify INI files
* Compatiable with ConfigParser
@@ -42,9 +43,12 @@ Example:
# Backward-compatiable with ConfigParser
import re
-from ConfigParser import DEFAULTSECT, ParsingError, MissingSectionHeaderError
+try:
+ from ConfigParser import DEFAULTSECT, ParsingError, MissingSectionHeaderError
+except ImportError:
+ from configparser import DEFAULTSECT, ParsingError, MissingSectionHeaderError
-import config
+from reconfigure.parsers.iniparse import config
class LineType(object):
line = None
@@ -465,7 +469,7 @@ class INIConfig(config.ConfigNamespace):
self._sections = {}
if defaults is None: defaults = {}
self._defaults = INISection(LineContainer(), optionxformsource=self)
- for name, value in defaults.iteritems():
+ for name, value in defaults.items():
self._defaults[name] = value
if fp is not None:
self._readfp(fp)
@@ -514,7 +518,7 @@ class INIConfig(config.ConfigNamespace):
def __str__(self):
if self._bom:
- fmt = u'\ufeff%s'
+ fmt = '\ufeff%s'
else:
fmt = '%s'
return fmt % self._data.__str__()
@@ -551,8 +555,8 @@ class INIConfig(config.ConfigNamespace):
for line in readline_iterator(fp):
# Check for BOM on first line
- if linecount == 0 and isinstance(line, unicode):
- if line[0] == u'\ufeff':
+ if linecount == 0:
+ if line[0] == '\ufeff':
line = line[1:]
self._bom = True
diff --git a/reconfigure/parsers/iniparse/utils.py b/reconfigure/parsers/iniparse/utils.py
index 9cb7488..bfd4fd7 100644
--- a/reconfigure/parsers/iniparse/utils.py
+++ b/reconfigure/parsers/iniparse/utils.py
@@ -1,5 +1,5 @@
-import compat
-from ini import LineContainer, EmptyLine
+from reconfigure.parsers.iniparse import compat
+from reconfigure.parsers.iniparse.ini import LineContainer, EmptyLine
def tidy(cfg):
"""Clean up blank lines.
diff --git a/reconfigure/parsers/jsonparser.py b/reconfigure/parsers/jsonparser.py
index c1eaee6..1c55e97 100644
--- a/reconfigure/parsers/jsonparser.py
+++ b/reconfigure/parsers/jsonparser.py
@@ -14,7 +14,8 @@ class JsonParser (BaseParser):
return node
def load_node_rec(self, node, json):
- for k, v in json.iteritems():
+ for k in sorted(json.keys()):
+ v = json[k]
if isinstance(v, dict):
child = Node(k)
node.children.append(child)
diff --git a/reconfigure/parsers/nginx.py b/reconfigure/parsers/nginx.py
index 661cfcd..f0fe202 100644
--- a/reconfigure/parsers/nginx.py
+++ b/reconfigure/parsers/nginx.py
@@ -9,11 +9,11 @@ class NginxParser (BaseParser):
"""
tokens = [
+ (r"[\w_]+\s*?.*?{", lambda s, t: ('section_start', t)),
(r"[\w_]+?.+?;", lambda s, t: ('option', t)),
(r"\s", lambda s, t: 'whitespace'),
(r"$^", lambda s, t: 'newline'),
(r"\#.*?\n", lambda s, t: ('comment', t)),
- (r"[\w_]+\s*?.*?{", lambda s, t: ('section_start', t)),
(r"\}", lambda s, t: 'section_end'),
]
token_comment = '#'
@@ -44,7 +44,7 @@ class NginxParser (BaseParser):
next_comment += '\n'
next_comment += token[1].strip('#/*').strip()
if token[0] == 'option':
- if ' ' in token[1]:
+ if ' ' in token[1] and not token[1][0] in ['"', "'"]:
k, v = token[1].split(None, 1)
else:
v = token[1]