diff --git a/scripts/UnitTests/ProjectParser/test_projectLineParser.py b/scripts/UnitTests/ProjectParser/test_projectLineParser.py deleted file mode 100644 index d26eb9c..0000000 --- a/scripts/UnitTests/ProjectParser/test_projectLineParser.py +++ /dev/null @@ -1,47 +0,0 @@ -# -*- coding: utf-8 -*- -import unittest -from UnitTests.ProjectParser.ValueProvider import ValueProvider -from parser.ProjectParser.ProjectLineParser import ProjectLineParser - - -class TestCsprojParser(unittest.TestCase): - - def setUp(self): - value_provider = ValueProvider() - self.parser = ProjectLineParser(value_provider, 'csproj') - - def test_parseAppStatement(self): - statement = "app:SomeAppName" - app_name = self.parser._ProjectLineParser__parseAppStatement(statement) - - self.assertEqual(app_name, 'SomeAppName') - - def test_parseKeyValueStatement(self): - statement = r"key:myKey 'my value -bla bla'" - setting = self.parser._ProjectLineParser__parseKeyValueStatement(statement) - - self.assertEqual(setting.key, 'myKey') - self.assertEqual(setting.value, 'my value -bla bla') - - def test_parseAttributeStatement(self): - statement = r"rel_path '../some_dir/some_file.txt'" - setting = self.parser._ProjectLineParser__parseAttributeStatement(statement) - - self.assertEqual(setting.attribute_name, 'rel_path') - self.assertEqual(setting.attribute_value, r'../some_dir/some_file.txt') - - def test_parse_keyedCsprojLine(self): - statement = r"csproj app:coolApp key:CodesignKey 'iPhone Developer: Рустам Заитов (CTL85FZX6K)'" - setting = self.parser.parseLine(statement) - - self.assertEqual(setting.projectName, 'coolApp') - self.assertEqual(setting.key, 'CodesignKey') - self.assertEqual(setting.value, 'iPhone Developer: Рустам Заитов (CTL85FZX6K)') - - def test_parse_attributedCsprojLine(self): - statement = r"csproj app:coolApp rel_path '../parent_dir/some_file.extension'" - setting = self.parser.parseLine(statement) - - self.assertEqual(setting.projectName, 'coolApp') - self.assertEqual(setting.attribute_name, 'rel_path') - self.assertEqual(setting.attribute_value, '../parent_dir/some_file.extension') \ No newline at end of file diff --git a/scripts/UnitTests/ProjectParser/test_projectParser.py b/scripts/UnitTests/ProjectParser/test_projectParser.py index 24eadeb..704067a 100644 --- a/scripts/UnitTests/ProjectParser/test_projectParser.py +++ b/scripts/UnitTests/ProjectParser/test_projectParser.py @@ -1,52 +1,47 @@ +# -*- coding: utf-8 -*- import unittest from UnitTests.ProjectParser.ValueProvider import ValueProvider from parser.ProjectParser.ProjectParser import ProjectParser -class TestCase(unittest.TestCase): +class TestCsprojParser(unittest.TestCase): + def setUp(self): - self.__lineCollection = [ - "csproj app:first key:key1 'value1'", - "csproj app:first key:key2 'value2'", - "csproj app:first attr1 'attr_val1'", - "csproj app:first attr2 'attr_val2'", + value_provider = ValueProvider() + self.parser = ProjectParser(value_provider, 'csproj') - "csproj app:second key:key1 'value1'", - "csproj app:second key:key2 'value2'", - "csproj app:second attr1 'attr_val1'", - "csproj app:second attr2 'attr_val2'"] - self.__parser = None - self.__value_provider = ValueProvider() + def test_parseAppStatement(self): + statement = "app:SomeAppName" + app_name = self.parser._ProjectLineParser__parseAppStatement(statement) - def __do_parse(self): - self.__parser = ProjectParser(self.__lineCollection, self.__value_provider) - self.__parser.parse() + self.assertEqual(app_name, 'SomeAppName') - def test_projectCount(self): - self.__do_parse() + def test_parseKeyValueStatement(self): + statement = r"key:myKey 'my value -bla bla'" + setting = self.parser._ProjectLineParser__parseKeyValueStatement(statement) - self.assertEqual(2, len(self.__parser.projects_dict)) - self.assertTrue('first' in self.__parser.projects_dict) - self.assertTrue('second' in self.__parser.projects_dict) + self.assertEqual(setting.key, 'myKey') + self.assertEqual(setting.value, 'my value -bla bla') - def test_projectSettings(self): - self.__do_parse() + def test_parseAttributeStatement(self): + statement = r"rel_path '../some_dir/some_file.txt'" + setting = self.parser._ProjectLineParser__parseAttributeStatement(statement) - first = self.__parser.projects_dict['first'] - second = self.__parser.projects_dict['second'] + self.assertEqual(setting.attribute_name, 'rel_path') + self.assertEqual(setting.attribute_value, r'../some_dir/some_file.txt') - self.assertEqual(first.projectName, 'first') - self.assertEqual(second.projectName, 'second') + def test_parse_keyedCsprojLine(self): + statement = r"csproj app:coolApp key:CodesignKey 'iPhone Developer: Рустам Заитов (CTL85FZX6K)'" + setting = self.parser.parseLine(statement) - setting_dict = { - 'key1': 'value1', - 'key2': 'value2' - } - self.assertDictEqual(first.settings, setting_dict) - self.assertDictEqual(second.settings, setting_dict) + self.assertEqual(setting.projectName, 'coolApp') + self.assertEqual(setting.key, 'CodesignKey') + self.assertEqual(setting.value, 'iPhone Developer: Рустам Заитов (CTL85FZX6K)') - self.assertEqual(first.attr1, 'attr_val1') - self.assertEqual(first.attr2, 'attr_val2') + def test_parse_attributedCsprojLine(self): + statement = r"csproj app:coolApp rel_path '../parent_dir/some_file.extension'" + setting = self.parser.parseLine(statement) - self.assertEqual(second.attr1, 'attr_val1') - self.assertEqual(second.attr2, 'attr_val2') \ No newline at end of file + self.assertEqual(setting.projectName, 'coolApp') + self.assertEqual(setting.attribute_name, 'rel_path') + self.assertEqual(setting.attribute_value, '../parent_dir/some_file.extension') \ No newline at end of file diff --git a/scripts/parser/ProjectParser/ProjectLineParser.py b/scripts/parser/ProjectParser/ProjectLineParser.py deleted file mode 100644 index 3b822ba..0000000 --- a/scripts/parser/ProjectParser/ProjectLineParser.py +++ /dev/null @@ -1,88 +0,0 @@ -from parser.LineParser import LineParser -from parser.ProjectParser.ProjectSetting.AttribureSetting import AttributeSetting -from parser.ProjectParser.ProjectSetting.KeyValueSetting import KeyValueSetting -import re - -class ProjectLineParser(LineParser): - def __init__(self, value_provider, command_token): - assert value_provider is not None - - self._value_provider = value_provider - self._command_token = command_token - - def parseLine(self, line): - LineParser.parseLine(line) - ws = ' ' - cmd_name_regexp = "^(?P{0})".format(self._command_token) - app_regexp = r"(?Papp:\S+)" - setting_regexp = r"(?P\S+ '[^']+')$" - - source = cmd_name_regexp + ws + app_regexp + ws + setting_regexp - regexp = re.compile(source, re.UNICODE) - - match = regexp.search(line) - self._guardMatch(match, line) - - cmd_name = match.group('cmd_name') - self.__parseProjectStatement(cmd_name) - - app_statement = match.group('app') - project_name = self.__parseAppStatement(app_statement) - - setting_statement = match.group('setting') - setting = self.__parseSettingStatement(setting_statement) - - setting.projectName = project_name - return setting - - def __parseProjectStatement(self, statement): - pass - - def __parseAppStatement(self, statement): - patt = r'app:(?P\w+)' - - match = re.match(patt, statement) - self._guardMatch(match, statement) - - return match.group('app_name') - - def __parseSettingStatement(self, statement): - self.__guardSource(statement) - - if statement.startswith('key:'): - result = self.__parseKeyValueStatement(statement) - else: - result = self.__parseAttributeStatement(statement) - - return result - - def __parseKeyValueStatement(self, statement): - self.__guardSource(statement) - patt = r"key:(?P\w+) '(?P[^']+)'" - - match = re.search(patt, statement) - self._guardMatch(match, statement) - - key = match.group('key') - value_link = match.group('value') - value = self._value_provider.getValueFor(value_link) - setting = KeyValueSetting(key, value) - - return setting - - def __parseAttributeStatement(self, statement): - self.__guardSource(statement) - patt = r"(?P\w+) '(?P[^']+)'" - - match = re.search(patt, statement) - self._guardMatch(match, statement) - - attribute_name = match.group('attribute_name') - value_link = match.group('attribute_value') - attribute_value = self._value_provider.getValueFor(value_link) - - setting = AttributeSetting(attribute_name, attribute_value) - return setting - - def __guardSource(self, source_text): - assert source_text is not None and len(source_text) > 0 \ No newline at end of file diff --git a/scripts/parser/ProjectParser/ProjectParser.py b/scripts/parser/ProjectParser/ProjectParser.py index fd26482..1bd8912 100644 --- a/scripts/parser/ProjectParser/ProjectParser.py +++ b/scripts/parser/ProjectParser/ProjectParser.py @@ -1,38 +1,39 @@ -from parser.ProjectParser.Project import Project -from parser.ProjectParser.ProjectLineParser import ProjectLineParser +from parser.LineParser import LineParser +from parser.ProjectParser.ProjectSetting.KeyValueSetting import KeyValueSetting +import re - -class ProjectParser: - def __init__(self, line_collection, value_provider, command_token): - assert line_collection is not None +class ProjectParser(LineParser): + def __init__(self, value_provider, command_token): assert value_provider is not None - assert command_token is not None - self._line_collection = line_collection self._value_provider = value_provider self._command_token = command_token - self.projects_dict = {} - def parse(self): + def parseLine(self, line): + assert line is not None - settings = [] - for line in self._line_collection: - settings.append(self.__parse_line(line)) + projectNameRegexp = r"(?P[a-Z0-9.]+)" + keyRegexp = r'(?P[a-Z]+)' + valueRegexp = r"'(?P[^']+)'" - for s in settings: - project = self.__fetchProject(s.projectName) - s.apply(project) + regexpSource = self.startsWithKeywordToken('for') + projectNameRegexp + self.keywordToken(r'project\s+set') + keyRegexp + self.keywordToken('to') + valueRegexp + regexp = re.compile(regexpSource, re.UNICODE) - def __fetchProject(self, project_name): - assert project_name is not None + match = regexp.match(line) + self._guardMatch(match, line) - project = self.projects_dict.get(project_name, Project(project_name)) - self.projects_dict[project_name] = project + projectName = match.group('name') + key = match.group('key') + value = match.group('value') - return project + settings = KeyValueSetting(key, value) + settings.projectName = projectName - def __parse_line(self, line): - line_parser = ProjectLineParser(self._value_provider, self._command_token) - setting = line_parser.parseLine(line) + return settings - return setting \ No newline at end of file + def isValidLine(self, line): + regexpSrc = r'for\s+.*project\s+set' + regexp = re.compile(regexpSrc, re.UNICODE) + + match = regexp.match(line) + return match is not None \ No newline at end of file