From 4cae97d2847083456a3e6264a089f82c1778dd0f Mon Sep 17 00:00:00 2001 From: Rustam Zaitov Date: Sun, 6 Oct 2013 19:09:56 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BB=20?= =?UTF-8?q?=D1=8E=D0=BD=D0=B8=D1=82=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=B0=D1=80=D1=81=D0=B5=D1=80=D0=B0?= =?UTF-8?q?=20csproj?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CsprojParser/test_csproj_parser.py | 43 +++++- scripts/parser/CsprojParser.py | 134 +++++++++++------- scripts/parser/token.py | 4 + 3 files changed, 127 insertions(+), 54 deletions(-) create mode 100644 scripts/parser/token.py diff --git a/scripts/UnitTests/CsprojParser/test_csproj_parser.py b/scripts/UnitTests/CsprojParser/test_csproj_parser.py index 14a06a4..3804784 100644 --- a/scripts/UnitTests/CsprojParser/test_csproj_parser.py +++ b/scripts/UnitTests/CsprojParser/test_csproj_parser.py @@ -1,11 +1,12 @@ import unittest from parser.CsprojParser import CsprojParser +from parser.token import Token class TestCsprojParser(unittest.TestCase): def setUp(self): - self.config = {} + self.config = {'link': 'qwerty'} self.parser = CsprojParser(self.config) @@ -16,5 +17,45 @@ class TestCsprojParser(unittest.TestCase): self.assertEqual(expect_true, True) self.assertEqual(expect_false, False) + def test_isAppToken(self): + expect_true = self.parser.isAppStatement('app:TheCoolApp') + expect_false = self.parser.isAppStatement('not_app:SomeIdentifier') + + self.assertEqual(expect_true, True) + self.assertEqual(expect_false, False) + + def test_isKeyToken(self): + expect_true = self.parser.isKeyStatement('key:MyKey') + expect_false = self.parser.isKeyStatement('not_key:SomeIdentifier') + + self.assertEqual(expect_true, True) + self.assertEqual(expect_false, False) + + def test_isAttributeToken(self): + expect_true = self.parser.isAttributeToken('my_attrib_name') + expect_false = self.parser.isKeyStatement('not_attrib:SomeIdentifier') + + self.assertEqual(expect_true, True) + self.assertEqual(expect_false, False) + + def test_parseAppToken(self): + token = self.parser.parseAppToken('app:MyCoolApp') + self.assertEqual(token.content, 'MyCoolApp') + + def test_parseKeyToken(self): + token = self.parser.parseKeyToken('key:someValue') + self.assertEqual(token.content, 'someValue') + + def test_fetchValueFromValueToken(self): + token = Token('@link', 'valueToken') + value = self.parser.fetchValueFromValueToken(token) + + self.assertEqual(value, 'qwerty') + + def test_procCspojStatement(self): + self.assertEqual(self.parser._token_index, 0) + self.parser.procCspojStatement('csproj') + self.assertEqual(self.parser._token_index, 1) + diff --git a/scripts/parser/CsprojParser.py b/scripts/parser/CsprojParser.py index 6e3fc29..81ecca2 100644 --- a/scripts/parser/CsprojParser.py +++ b/scripts/parser/CsprojParser.py @@ -1,10 +1,12 @@ from parser.StringValueParser import * from parser.AttributeNameParser import * +from parser.token import Token + class CsprojParser: def __init__(self, config): self._config = config - self._token_buffer = None + self._statement_buffer = None self._token_index = 0 self._current_project = None self._projects = {} @@ -12,61 +14,85 @@ class CsprojParser: def getProjects(self): return self._projects.values() - def initTokenBuffer(self, string_to_parse, value_token): - self._token_buffer = string_to_parse.split(' ') - self._token_buffer.append(value_token) + def initStatementBuffer(self, string_to_parse, value_statement): + self._statement_buffer = string_to_parse.split(' ') + self._statement_buffer.append(value_statement) self._token_index = 0 - def parse(self, string_to_parse, value_token): - self.initTokenBuffer(string_to_parse, value_token) + self.initStatementBuffer(string_to_parse, value_token) - while self._token_index < len(self._token_buffer): - self.ProcessToken() + while self._token_index < len(self._statement_buffer): + self.ProcessStatement() - def ProcessToken(self): - token = self.getCurrentToken() - print token + def ProcessStatement(self): + text = self.getCurrentStatement() + + if self.isCsprojStatement(text): + self.procCspojStatement(text) + + elif self.isAppStatement(text): + self.procAppStatement(text) + + elif self.isKeyStatement(text): + self.procKeyStatement(text) + + elif self.isAttributeToken(text): + self.procAttributeToken(text) - if self.isCsprojStatement(token): - self._token_index += 1 - elif self.isAppToken(token): - self.processAppToken(token) - self._token_index += 1 - elif self.isKeyToken(token): - key_name = self.processKeyToken(token) - self._token_index += 1 - token = self.getCurrentToken() - value = self.processValueToken(token) - self._token_index += 1 - self._current_project.settings[key_name] = value - elif self.isAttributeToken(token): - attribute_name = self.processAttributeNameToken(token) - self._token_index += 1 - token = self.getCurrentToken() - attribute_value = self.processValueToken(token) - self._token_index += 1 - setattr(self._current_project, attribute_name, attribute_value) else: - raise Exception('unrecognized token', token) + raise Exception('unrecognized token', text) - def isCsprojStatement(self, token): - return token == 'csproj' + def isCsprojStatement(self, text): + return text == 'csproj' - def isAppToken(self, token): + def procCspojStatement(self, text): + self._token_index += 1 + + def isAppStatement(self, token): return token.startswith('app:') - def isKeyToken(self, token): - return token.startswith('key:') + def procAppStatement(self, text): + self.processAppToken(text) + self._token_index += 1 + + def isKeyStatement(self, text): + return text.startswith('key:') + + def procKeyStatement(self, text): + key_token = self.parseKeyToken(text) + + self._token_index += 1 + text = self.getCurrentStatement() + value_token = self.parseValueToken(text) + value = self.fetchValueFromValueToken(value_token) + + self._current_project.settings[key_token.content] = value + self._token_index += 1 def isAttributeToken(self, token): return ':' not in token - def processAppToken(self, appToken): - appName = appToken[len('app:'):] - print appName - self.setCurrentProject(appName) + def procAttributeToken(self, text): + attribute_token = self.parseValueToken(text) + + self._token_index += 1 + text = self.getCurrentStatement() + value_token = self.parseValueToken(text) + setattr(self._current_project, attribute_token.content, value_token.content) + + self._token_index += 1 + + def parseAppToken(self, text): + appName = text[len('app:'):] + token = Token(appName, 'appToken') + + return token + + def processAppToken(self, text): + appToken = self.parseAppToken(text) + self.setCurrentProject(appToken.content) def setCurrentProject(self, appName): exists = appName in self._projects @@ -74,26 +100,28 @@ class CsprojParser: self._current_project = self._projects[appName] if exists else Csproj(appName) self._projects[appName] = self._current_project - def processKeyToken(self, token): - key_name = token[len('key:'):] - print key_name - return key_name + def parseKeyToken(self, text): + key_name = text[len('key:'):] + token = Token(key_name, 'keyToken') - def processAttributeNameToken(self, token): - attribute_name = token - return attribute_name + return token - def processValueToken(self, token): - value = token + def parseValueToken(self, text): + token = Token(text, 'valueToken') - if token.startswith('@'): - key = token[1:] + return token + + def fetchValueFromValueToken(self, token): + value = token.content + + if value.startswith('@'): + key = value[1:] value = self._config[key] return value - def getCurrentToken(self): - token = self._token_buffer[self._token_index] + def getCurrentStatement(self): + token = self._statement_buffer[self._token_index] return token diff --git a/scripts/parser/token.py b/scripts/parser/token.py new file mode 100644 index 0000000..6d9eacd --- /dev/null +++ b/scripts/parser/token.py @@ -0,0 +1,4 @@ +class Token(): + def __init__(self, content, type): + self.content = content + self.type = type