начал реализовывать парсер для выставления ключ/значений

This commit is contained in:
Rustam Zaitov 2013-10-30 02:05:48 +04:00
parent 9dac82532b
commit 7c8627c644
4 changed files with 57 additions and 196 deletions

View File

@ -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')

View File

@ -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')
self.assertEqual(setting.projectName, 'coolApp')
self.assertEqual(setting.attribute_name, 'rel_path')
self.assertEqual(setting.attribute_value, '../parent_dir/some_file.extension')

View File

@ -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<cmd_name>{0})".format(self._command_token)
app_regexp = r"(?P<app>app:\S+)"
setting_regexp = r"(?P<setting>\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<app_name>\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<key>\w+) '(?P<value>[^']+)'"
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<attribute_name>\w+) '(?P<attribute_value>[^']+)'"
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

View File

@ -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<name>[a-Z0-9.]+)"
keyRegexp = r'(?P<key>[a-Z]+)'
valueRegexp = r"'(?P<value>[^']+)'"
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
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