Added errors to config model + updated parser

This commit is contained in:
Maxim Kulkin 2013-09-16 15:03:08 +04:00
parent 4e80964dca
commit ec0b507212
3 changed files with 74 additions and 81 deletions

View File

@ -113,13 +113,7 @@ class IniConfigParser:
sections.append(section) sections.append(section)
parameters = [] parameters = []
if len(errors) > 0: config = ComponentConfig(name, sections, errors)
return ParseResult(False, errors)
if len(sections) > 0: return config
config = ComponentConfig(name, sections)
else:
config = ComponentConfig(name, [])
return ParseResult(True, config)

View File

@ -25,100 +25,97 @@ class IniConfigParserTests(unittest.TestCase):
return self.parser.parse('test.conf', content) return self.parser.parse('test.conf', content)
def test_parsing(self): def test_parsing(self):
result = self.parse("param1 = value1") config = self.parse("param1 = value1")
self.assertTrue(result.success) self.assertEqual(0, len(config.errors))
config = result.value
self.assertParameter('param1', 'value1', config.sections[0].parameters[0]) self.assertParameter('param1', 'value1', config.sections[0].parameters[0])
self.assertEqual(1, len(config.sections[0].parameters)) self.assertEqual(1, len(config.sections[0].parameters))
def test_colon_as_delimiter(self): def test_colon_as_delimiter(self):
r = self.parse('param1 : value1') c = self.parse('param1 : value1')
self.assertTrue(r.success) self.assertEqual(0, len(c.errors))
self.assertParameter('param1', 'value1', r.value.sections[0].parameters[0]) self.assertParameter('param1', 'value1', c.sections[0].parameters[0])
def test_use_colon_delimiter_if_it_comes_before_equals_sign(self): def test_use_colon_delimiter_if_it_comes_before_equals_sign(self):
r = self.parse('param1: value=123') c = self.parse('param1: value=123')
self.assertTrue(r.success) self.assertEqual(0, len(c.errors))
self.assertParameter('param1', 'value=123', r.value.sections[0].parameters[0]) self.assertParameter('param1', 'value=123', c.sections[0].parameters[0])
def test_use_equals_delimiter_if_it_comes_before_colon(self): def test_use_equals_delimiter_if_it_comes_before_colon(self):
r = self.parse('param1=value:123') c = self.parse('param1=value:123')
self.assertTrue(r.success) self.assertEqual(0, len(c.errors))
self.assertParameter('param1', 'value:123', r.value.sections[0].parameters[0]) self.assertParameter('param1', 'value:123', c.sections[0].parameters[0])
def test_wrapping_value_with_single_quotes(self): def test_wrapping_value_with_single_quotes(self):
r = self.parse("param = 'foo bar'") c = self.parse("param = 'foo bar'")
self.assertTrue(r.success) self.assertEqual(0, len(c.errors))
self.assertParameter('param', 'foo bar', r.value.sections[0].parameters[0]) self.assertParameter('param', 'foo bar', c.sections[0].parameters[0])
self.assertEqual("'", r.value.sections[0].parameters[0].value.quotechar) self.assertEqual("'", c.sections[0].parameters[0].value.quotechar)
def test_wrapping_value_with_single_quotes_and_trailing_whitespace(self): def test_wrapping_value_with_single_quotes_and_trailing_whitespace(self):
r = self.parse("param = 'foo bar' ") c = self.parse("param = 'foo bar' ")
self.assertTrue(r.success) self.assertEqual(0, len(c.errors))
self.assertParameter('param', 'foo bar', r.value.sections[0].parameters[0]) self.assertParameter('param', 'foo bar', c.sections[0].parameters[0])
def test_wrapping_value_with_double_quotes(self): def test_wrapping_value_with_double_quotes(self):
r = self.parse("param = \"foo bar\"") c = self.parse("param = \"foo bar\"")
self.assertTrue(r.success) self.assertEqual(0, len(c.errors))
self.assertParameter('param', 'foo bar', r.value.sections[0].parameters[0]) self.assertParameter('param', 'foo bar', c.sections[0].parameters[0])
self.assertEqual('"', r.value.sections[0].parameters[0].value.quotechar) self.assertEqual('"', c.sections[0].parameters[0].value.quotechar)
def test_wrapping_value_with_double_quotes_and_trailing_whitespace(self): def test_wrapping_value_with_double_quotes_and_trailing_whitespace(self):
r = self.parse("param = \"foo bar\" ") c = self.parse("param = \"foo bar\" ")
self.assertTrue(r.success) self.assertEqual(0, len(c.errors))
self.assertParameter('param', 'foo bar', r.value.sections[0].parameters[0]) self.assertParameter('param', 'foo bar', c.sections[0].parameters[0])
def test_parsing_iolike_source(self): def test_parsing_iolike_source(self):
r = self.parse(StringIO("param1 = value1")) c = self.parse(StringIO("param1 = value1"))
self.assertTrue(r.success) self.assertEqual(0, len(c.errors))
c = r.value
self.assertParameter('param1', 'value1', c.sections[0].parameters[0]) self.assertParameter('param1', 'value1', c.sections[0].parameters[0])
self.assertEqual(1, len(c.sections[0].parameters)) self.assertEqual(1, len(c.sections[0].parameters))
def test_default_section_name(self): def test_default_section_name(self):
r = self.parse("param1 = value1") c = self.parse("param1 = value1")
self.assertEqual('', r.value.sections[0].name.text) self.assertEqual('', c.sections[0].name.text)
def test_parsing_with_section(self): def test_parsing_with_section(self):
r = self.parse(""" c = self.parse("""
[section1] [section1]
param1 = value1 param1 = value1
""", margin=True) """, margin=True)
self.assertTrue(r.success) self.assertEqual(0, len(c.errors))
self.assertEqual('section1', r.value.sections[0].name.text) self.assertEqual('section1', c.sections[0].name.text)
self.assertEqual(1, len(r.value.sections[0].parameters)) self.assertEqual(1, len(c.sections[0].parameters))
def test_parsing_with_same_section(self): def test_parsing_with_same_section(self):
r = self.parse(""" c = self.parse("""
[section1] [section1]
param1 = value1 param1 = value1
param2 = value2 param2 = value2
""", margin=True) """, margin=True)
self.assertTrue(r.success) self.assertEqual(0, len(c.errors))
self.assertEqual(2, len(r.value.sections[0].parameters)) self.assertEqual(2, len(c.sections[0].parameters))
def test_parsing_with_different_sections(self): def test_parsing_with_different_sections(self):
r = self.parse(""" c = self.parse("""
[section1] [section1]
param1 = value1 param1 = value1
[section2] [section2]
param2 = value2 param2 = value2
""", margin=True) """, margin=True)
self.assertTrue(r.success) self.assertEqual(0, len(c.errors))
c = r.value
self.assertEqual('section1', c.sections[0].name.text) self.assertEqual('section1', c.sections[0].name.text)
self.assertParameter('param1', 'value1', c.sections[0].parameters[0]) self.assertParameter('param1', 'value1', c.sections[0].parameters[0])
@ -128,69 +125,70 @@ class IniConfigParserTests(unittest.TestCase):
self.assertEqual(1, len(c.sections[1].parameters)) self.assertEqual(1, len(c.sections[1].parameters))
def test_whole_line_comments_starting_with_hash(self): def test_whole_line_comments_starting_with_hash(self):
r = self.parse("#param=value") c = self.parse("#param=value")
self.assertTrue(r.success) self.assertEqual(0, len(c.errors))
self.assertEqual(0, len(r.value.sections)) self.assertEqual(0, len(c.sections))
def test_whole_line_comments_starting_with_semicolon(self): def test_whole_line_comments_starting_with_semicolon(self):
r = self.parse(";param=value") c = self.parse(";param=value")
self.assertTrue(r.success) self.assertEqual(0, len(c.errors))
self.assertEqual(0, len(r.value.sections)) self.assertEqual(0, len(c.sections))
def test_hash_in_value_is_part_of_the_value(self): def test_hash_in_value_is_part_of_the_value(self):
r = self.parse("param=value#123") c = self.parse("param=value#123")
self.assertTrue(r.success) self.assertEqual(0, len(c.errors))
self.assertParameter("param", "value#123", r.value.sections[0].parameters[0]) self.assertParameter("param", "value#123", c.sections[0].parameters[0])
def test_multiline_value(self): def test_multiline_value(self):
r = self.parse(""" c = self.parse("""
param1 = line1 param1 = line1
line2 line2
""", margin=True) """, margin=True)
self.assertTrue(r.success) self.assertEqual(0, len(c.errors))
self.assertParameter('param1', 'line1line2', r.value.sections[0].parameters[0]) self.assertParameter('param1', 'line1line2', c.sections[0].parameters[0])
def test_multiline_value_finished_by_other_parameter(self): def test_multiline_value_finished_by_other_parameter(self):
r = self.parse(""" c = self.parse("""
param1 = foo param1 = foo
bar bar
param2 = baz param2 = baz
""", margin=True) """, margin=True)
self.assertTrue(r.success) self.assertEqual(0, len(c.errors))
self.assertParameter('param1', 'foobar', r.value.sections[0].parameters[0]) self.assertParameter('param1', 'foobar', c.sections[0].parameters[0])
def test_multiline_value_finished_by_empty_line(self): def test_multiline_value_finished_by_empty_line(self):
r = self.parse(""" c = self.parse("""
param1 = foo param1 = foo
bar bar
param2 = baz param2 = baz
""", margin=True) """, margin=True)
self.assertTrue(r.success) self.assertEqual(0, len(c.errors))
self.assertParameter('param1', 'foobar', r.value.sections[0].parameters[0]) self.assertParameter('param1', 'foobar', c.sections[0].parameters[0])
def test_unclosed_section_causes_error(self): def test_unclosed_section_causes_error(self):
r = self.parse("[section1\nparam1=123") c = self.parse("[section1\nparam1=123")
self.assertFalse(r.success) self.assertEqual(1, len(c.errors))
self.assertEqual(1, len(r.value))
def test_missing_equals_sign_causes_error(self): def test_missing_equals_sign_or_colon_causes_error(self):
r = self.parse("param1 value1") c = self.parse("param1 value1")
self.assertFalse(r.success) self.assertEqual(1, len(c.errors))
self.assertEqual(1, len(r.value))
def test_spaces_in_key_causes_error(self): def test_spaces_in_key_causes_error(self):
r = self.parse("param 1 = value1") c = self.parse("param 1 = value1")
self.assertFalse(r.success) self.assertEqual(1, len(c.errors))
self.assertEqual(1, len(r.value))
def test_returning_multiple_errors(self): def test_returning_multiple_errors(self):
r = self.parse("[unclosed section\npararm 1 = value1") c = self.parse("[unclosed section\npararm 1 = value1")
self.assertFalse(r.success) self.assertEqual(2, len(c.errors))
self.assertEqual(2, len(r.value))
def test_errors_doesnt_affect_valid_parameters(self):
c = self.parse('param1 value1\nparam2 = value2')
self.assertEqual(1, len(c.errors))
self.assertParameter('param2', 'value2', c.sections[0].parameters[0])
def _getattr(self, o, name): def _getattr(self, o, name):

View File

@ -11,10 +11,11 @@ class OpenstackComponent(object):
self.version = version self.version = version
class ComponentConfig(object): class ComponentConfig(object):
def __init__(self, name, sections=[]): def __init__(self, name, sections=[], errors=[]):
super(ComponentConfig, self).__init__() super(ComponentConfig, self).__init__()
self.name = name self.name = name
self.sections = sections self.sections = sections
self.errors = errors
class Element(object): class Element(object):
def __init__(self, start_mark, end_mark): def __init__(self, start_mark, end_mark):