From 970be15c16dd450c7f95d97b464e7f932a884a08 Mon Sep 17 00:00:00 2001 From: Rustam Zaitov Date: Thu, 3 Oct 2013 22:31:55 +0400 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BB=20=D0=BF=D0=B0=D1=80=D1=81=D0=B8=D0=BD=D0=B3?= =?UTF-8?q?=20=D0=BF=D0=B0=D1=82=D1=87=D0=B8=D0=BD=D0=B3=D0=B0=20csproj=20?= =?UTF-8?q?=D1=84=D0=B0=D0=B9=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/ManualTests/csproj_test.py | 16 ++++ scripts/ManualTests/path_provider.py | 10 +++ scripts/commands/build_command.py | 13 ---- scripts/commands/patch_csproj_command.py | 43 ++++------- scripts/parser/CsprojParser.py | 95 ++++++++++++++++++++++++ 5 files changed, 135 insertions(+), 42 deletions(-) create mode 100644 scripts/ManualTests/csproj_test.py create mode 100644 scripts/ManualTests/path_provider.py create mode 100644 scripts/parser/CsprojParser.py diff --git a/scripts/ManualTests/csproj_test.py b/scripts/ManualTests/csproj_test.py new file mode 100644 index 0000000..85fe085 --- /dev/null +++ b/scripts/ManualTests/csproj_test.py @@ -0,0 +1,16 @@ +import path_provider +import commands.patch_csproj_command as csproj +config = { + 'csproj group:CoolApp key:rel_path': 'BuildSample/CoolApp.csproj', + 'csproj group:CoolApp key:CodesignProvision': '@codesign_provision', + 'csproj group:CoolApp key:CodesignKey': '@codesign_key', + + 'codesign_provision': 'MyProvisioningValue', + 'codesign_key': 'MyCodesignValue' +} + +base_dir = '/Users/rzaitov/Documents/Apps/BuildScript', +provider = path_provider.PathProvider(base_dir) + +patcher = csproj.PatchCsproj(config, provider) +patcher.Execute() diff --git a/scripts/ManualTests/path_provider.py b/scripts/ManualTests/path_provider.py new file mode 100644 index 0000000..74e8d2e --- /dev/null +++ b/scripts/ManualTests/path_provider.py @@ -0,0 +1,10 @@ +import os + +class PathProvider: + def __init__(self, base_dir): + self._base_dir = base_dir + + def ResolveAbsPath(self, rel_path): + abs_path = os.path.join(self._base_dir, rel_path) + return abs_path + diff --git a/scripts/commands/build_command.py b/scripts/commands/build_command.py index df0f717..3f8d0b8 100644 --- a/scripts/commands/build_command.py +++ b/scripts/commands/build_command.py @@ -29,19 +29,6 @@ class BuildCommand: return all_keys - def ParseKeyToken(self, key_token): - # csproj-AppName-Key - identifiers = key_token.split(self._separator) - - result = { - self._prefix_name: identifiers[0], - self._app_name: identifiers[1], - self._key_name: identifiers[2] - } - - return result - - def ParseValueFromToken(self, value_token): value = value_token diff --git a/scripts/commands/patch_csproj_command.py b/scripts/commands/patch_csproj_command.py index 867fed8..92dc8b3 100644 --- a/scripts/commands/patch_csproj_command.py +++ b/scripts/commands/patch_csproj_command.py @@ -1,11 +1,12 @@ import commands.build_command as bcmd import utils.csproj.patcher as csproj -import utils.PathConverter.path_converter as path +import parser.CsprojParser as parser class PatchCsproj(bcmd.BuildCommand): - def __init__(self, config): - bcmd.BuildCommand.__init__(self, config, 'csproj-') - self._patch_settings = {} + def __init__(self, config, path_provider): + bcmd.BuildCommand.__init__(self, config, 'csproj') + self._path_provider = path_provider + self._parser = None def ParseConfig(self): csproj_keys = self.FetchAllKeysFromConfig() @@ -13,36 +14,20 @@ class PatchCsproj(bcmd.BuildCommand): def FillPatchSettings(self, key_tokens): + self._parser = parser.CsprojParser(self._config) + for key_token in key_tokens: - key_info = self.ParseKeyToken(key_token) + self._parser.parse(key_token, self._config[key_token]) - project_name = key_info[self._app_name] - key = key_info[self._key_name] - value = self.ParseValueFromToken(self._config[key_token]) - - project_settings = self.FetchSettingForProject(project_name) - project_settings[key] = value - - - def FetchSettingForProject(self, project_name): - project_settings = self._patch_settings.get(project_name, None) - - if project_settings is None: - project_settings = {} - self._patch_settings[project_name] = project_settings - - return project_settings def Execute(self): - converter = path.PathConverter(self._config['sln_path']) + projects_list = self._parser.projects - for project_name in self._patch_settings.keys(): - project_settings = self._patch_settings[project_name] - self.PatchProject(project_settings, converter) + for project in projects_list: + self.PatchProject(project) - def PatchProject(self, project_settings, path_converter): - csproj_rel_path = project_settings['rel_path'] - csproj_abs_path = path_converter.Convert(csproj_rel_path) + def PatchProject(self, project): + csproj_abs_path = self._path_provider.fetchAbsPath(project.rel_path) patcher = csproj.Patcher(csproj_abs_path) - patcher.AddOrReplace(project_settings, self._config['sln_config']) + patcher.AddOrReplace(project.settings, self._config['sln_config']) diff --git a/scripts/parser/CsprojParser.py b/scripts/parser/CsprojParser.py new file mode 100644 index 0000000..7d9dd71 --- /dev/null +++ b/scripts/parser/CsprojParser.py @@ -0,0 +1,95 @@ +from parser.StringValueParser import * +from parser.AttributeNameParser import * + +class CsprojParser: + def __init__(self, config): + self._config = config + self._token_buffer = None + self._token_index = 0 + self._current_project = None + self.projects = {} + + def initTokenBuffer(self, string_to_parse, value_token): + self._token_buffer = string_to_parse.split(' ') + self._token_buffer.append(value_token) + self._token_index = 0 + + + def parse(self, string_to_parse, value_token): + self.initTokenBuffer(string_to_parse, value_token) + + while self._token_index < len(self._token_buffer): + self.ProcessToken() + + + def ProcessToken(self): + token = self.getCurrentToken() + + 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() + 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.project, attribute_name, attribute_value) + + def isCsprojStatement(self, token): + return token == 'csproj' + + def isAppToken(self, token): + return token.startswith('app:') + + def isKeyToken(self, token): + return token.startswith('key:') + + def isAttributeToken(self, token): + return ':' not in token + + def processAppToken(self, appToken): + appName = appToken[len('app:')] + self.setCurrentProject(appName) + + def setCurrentProject(self, appName): + exists = appName in self.projects + + 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:')] + return key_name + + def processAttributeNameToken(self, token): + attribute_name = token + return attribute_name + + def processValueToken(self, token): + value = token + + if token.startswith('@'): + key = token[1:] + value = self._config[key] + + return value + + def getCurrentToken(self): + token = self._token_buffer[self._token_index] + return token + + +class Csproj: + def __init__(self, appName): + self.appName = appName + self.settings = {} \ No newline at end of file