From ee6442ecd07fbc0a2d77f2e4ee049b4ebe0b201c Mon Sep 17 00:00:00 2001 From: rzaitov Date: Wed, 13 Nov 2013 16:26:37 +0400 Subject: [PATCH 1/6] =?UTF-8?q?=D0=BF=D1=80=D0=B5=D0=B4=D0=B2=D0=B0=D1=80?= =?UTF-8?q?=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=B0=D1=8F=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B0=20=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=BA=20=D0=B2=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B5=20=D0=BD?= =?UTF-8?q?=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BA=20=D1=82=D0=B0=D0=BA?= =?UTF-8?q?=D0=B0=D1=8F=20=D0=B6=D0=B5=20=D0=BA=D0=B0=D0=BA=20=D0=B2=20?= =?UTF-8?q?=D1=84=D0=B0=D0=B9=D0=BB=D0=B5=20=D1=88=D0=B0=D0=B3=D0=BE=D0=B2?= =?UTF-8?q?=20=E2=80=93=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80?= =?UTF-8?q?=D0=B8=D0=B5=D0=B2=20=D0=B8=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B2=D0=B5=D0=B4=D1=83=D1=89=D0=B8=D1=85?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D0=B1=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D1=85?= =?UTF-8?q?=20=D1=81=D0=B8=D0=BC=D0=B2=D0=BE=D0=BB=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LineConveyor/test_commentRemover.py | 4 ++-- .../parsers/SettingsParser/SettingsParser.py | 15 +++++++------ scripts/TouchinBuild/taskRunner.py | 21 ++++++++++++------- .../FromFileSettingsProvider.py | 12 ++++++++--- 4 files changed, 33 insertions(+), 19 deletions(-) diff --git a/scripts/TouchinBuild/Tests/UnitTests/LineConveyor/test_commentRemover.py b/scripts/TouchinBuild/Tests/UnitTests/LineConveyor/test_commentRemover.py index 028d416..8cff836 100644 --- a/scripts/TouchinBuild/Tests/UnitTests/LineConveyor/test_commentRemover.py +++ b/scripts/TouchinBuild/Tests/UnitTests/LineConveyor/test_commentRemover.py @@ -8,12 +8,12 @@ class TestCommentRemover(unittest.TestCase): def test_startsWithComment(self): line = '# this line is comment' - newLine = self.commentRemover.processText(line, self.commentRemover) + newLine = self.commentRemover.processText(line, None) self.assertEqual('', newLine) def test_containsComment(self): line = 'this line contains # a comment' - newLine = self.commentRemover.processText(line, self.commentRemover) + newLine = self.commentRemover.processText(line, None) self.assertEqual('this line contains ', newLine) \ No newline at end of file diff --git a/scripts/TouchinBuild/parsers/SettingsParser/SettingsParser.py b/scripts/TouchinBuild/parsers/SettingsParser/SettingsParser.py index 268d8d3..10c2ba4 100644 --- a/scripts/TouchinBuild/parsers/SettingsParser/SettingsParser.py +++ b/scripts/TouchinBuild/parsers/SettingsParser/SettingsParser.py @@ -3,7 +3,10 @@ from parsers.SettingsParser.SettingsMerger import SettingsMerger class SettingsParser: - def __init__(self, settings=None): + def __init__(self, compositeLineProcessor, settings=None): + assert compositeLineProcessor is not None + + self.compositeLineProcessor = compositeLineProcessor self.settings = settings if not self.settings: @@ -14,14 +17,14 @@ class SettingsParser: lines = content.splitlines() for line in lines: - stripped = line.strip(' \t\n\r') + processedLine = self.compositeLineProcessor.processText(line, None) - if len(stripped) == 0: - continue - if stripped.startswith("#"): + if len(processedLine) == 0: continue + else: + self.processLine(processedLine) - self.processLine(stripped) + self.processLine(processedLine) def processLine(self, line): assert line is not None diff --git a/scripts/TouchinBuild/taskRunner.py b/scripts/TouchinBuild/taskRunner.py index 0985a88..bb258fc 100755 --- a/scripts/TouchinBuild/taskRunner.py +++ b/scripts/TouchinBuild/taskRunner.py @@ -26,17 +26,17 @@ scriptDir = os.path.dirname(scriptFilePath) class TaskRunner: - def __init__(self, settingsProvider, fileContentProvider, buildConfigProvider): + def __init__(self, settingsProvider, fileContentProvider, buildConfigProvider, linePreprocessor): assert settingsProvider is not None assert fileContentProvider is not None assert buildConfigProvider is not None + assert linePreprocessor is not None self.settingsProvider = settingsProvider self.fileContentProvider = fileContentProvider self.configsProvider = buildConfigProvider + self.linePreprocessor = linePreprocessor - lineStripper = Stripper() - commentRemover = CommentRemover() macroProcessor = MacroProcessor() self.valueProvider = ValueProvider() @@ -52,9 +52,6 @@ class TaskRunner: self.textPreprocessor.addProcessor(macroResolver) self.textPreprocessor.addProcessor(textInclude) - self.linePreprocessor = TextConveyorPreprocessor() - self.linePreprocessor.addProcessor(commentRemover) - self.linePreprocessor.addProcessor(lineStripper) def run(self): rawSettings = self.settingsProvider.fetchSettings() @@ -83,8 +80,16 @@ if __name__ == "__main__": parser = argparse.ArgumentParser() overrideArgs = parser.parse_known_args()[1] + # компоную препроцессор для индивидуальной обработки строк (удаление комментариев и ведущих пробельных символов) + lineStripper = Stripper() + commentRemover = CommentRemover() + linePreprocessor = TextConveyorPreprocessor() + linePreprocessor.addProcessor(commentRemover) + linePreprocessor.addProcessor(lineStripper) + # TODO: перенести в корень комапановки - fromFileSettingsProvider = FromFileSettingsProvider() + settingsPath = 'scripts/settings.txt' + fromFileSettingsProvider = FromFileSettingsProvider(settingsPath, linePreprocessor) overrideWithCmdSetProvider = CmdArgsOverriderSettingsProvider(fromFileSettingsProvider, overrideArgs) fContentProvider = FileContentProvider() @@ -96,5 +101,5 @@ if __name__ == "__main__": resolvedBuildConfigProvider = ResolvedBuildConfigProvider(predefineBuildConfigProvider) - runner = TaskRunner(overrideWithCmdSetProvider, fContentProvider, resolvedBuildConfigProvider) + runner = TaskRunner(overrideWithCmdSetProvider, fContentProvider, resolvedBuildConfigProvider, linePreprocessor) runner.run() \ No newline at end of file diff --git a/scripts/TouchinBuild/utils/SettingsProvider/FromFileSettingsProvider.py b/scripts/TouchinBuild/utils/SettingsProvider/FromFileSettingsProvider.py index 6e9e614..19da67d 100644 --- a/scripts/TouchinBuild/utils/SettingsProvider/FromFileSettingsProvider.py +++ b/scripts/TouchinBuild/utils/SettingsProvider/FromFileSettingsProvider.py @@ -3,14 +3,20 @@ from parsers.SettingsParser.SettingsParser import SettingsParser class FromFileSettingsProvider(SettingsProviderBase): - def __init__(self): + def __init__(self, pathToSettings, compositeLineProcessor): SettingsProviderBase.__init__(self) + assert pathToSettings is not None + assert compositeLineProcessor is not None + + self.pathToSettings = pathToSettings + self.compositeLineProcessor = compositeLineProcessor + def fetchSettings(self): - settingsFile = open('scripts/settings.txt') + settingsFile = open(self.pathToSettings) content = settingsFile.read() - parser = SettingsParser() + parser = SettingsParser(self.compositeLineProcessor) parser.parse(content) return parser.settings From 94aea27f507f7bc35b2a185a62ad6134bf77aef2 Mon Sep 17 00:00:00 2001 From: rzaitov Date: Wed, 13 Nov 2013 16:52:31 +0400 Subject: [PATCH 2/6] =?UTF-8?q?=D0=9D=D0=BE=D1=80=D0=BC=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D0=BB=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=BA=D1=83=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B0=D1=80=D0=B8=D0=B5=D0=B2=20=D0=B2=20=D1=84=D0=B0?= =?UTF-8?q?=D0=B9=D0=BB=D0=B5=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5?= =?UTF-8?q?=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/IosSteps.txt | 16 ++++++++-------- .../Core/LineConveyor/CommentRemover.py | 7 +++++-- .../Core/LineConveyor/MacroResolver.py | 7 ++++++- .../Core/LineConveyor/NullPreprocessor.py | 9 +++++++++ .../Core/LineConveyor/PreprocessorBase.py | 12 ++++++++++++ .../TouchinBuild/Core/LineConveyor/Stripper.py | 7 +++++-- .../LineConveyor/TextConveyorPreprocessor.py | 6 +++++- .../Core/LineConveyor/TextInclude.py | 7 ++++++- .../SettingsParser/test_SettingsParser.py | 14 ++++++++++---- .../parsers/SettingsParser/SettingsParser.py | 2 -- scripts/settings.txt | 2 +- 11 files changed, 67 insertions(+), 22 deletions(-) create mode 100644 scripts/TouchinBuild/Core/LineConveyor/NullPreprocessor.py create mode 100644 scripts/TouchinBuild/Core/LineConveyor/PreprocessorBase.py diff --git a/scripts/IosSteps.txt b/scripts/IosSteps.txt index 16383c3..2305d41 100644 --- a/scripts/IosSteps.txt +++ b/scripts/IosSteps.txt @@ -5,14 +5,14 @@ sh echo '{@builder_path}' sh echo hello from '{@author}' sh echo version: '{@version}' -clean 'BuildSample/BuildSample.sln' for '{@sln_config}' -build 'BuildSample/BuildSample.sln' for '{@sln_config}' +#clean 'BuildSample/BuildSample.sln' for '{@sln_config}' +#build 'BuildSample/BuildSample.sln' for '{@sln_config}' -create dirs 'Output/Appstore/Artifacts' -copy 'BuildSample/BuildSample/Output/BuildSample-{@version}.ipa' to 'Output/Appstore/Artifacts' -sh cp -a BuildSample/BuildSample/Output/ Output/Appstore/ +#create dirs 'Output/Appstore/Artifacts' +#copy 'BuildSample/BuildSample/Output/BuildSample-{@version}.ipa' to 'Output/Appstore/Artifacts' +#sh cp -a BuildSample/BuildSample/Output/ Output/Appstore/ -publish 'Output/Appstore/Artifacts/BuildSample-{@version}.ipa' to testflight notes = 'Hello' api_token = '{@tf_api_token}' team_token = '{@tf_team_token}' +#publish 'Output/Appstore/Artifacts/BuildSample-{@version}.ipa' to testflight notes = 'Hello' api_token = '{@tf_api_token}' team_token = '{@tf_team_token}' -restore from backup -delete backup \ No newline at end of file +#restore from backup +#delete backup \ No newline at end of file diff --git a/scripts/TouchinBuild/Core/LineConveyor/CommentRemover.py b/scripts/TouchinBuild/Core/LineConveyor/CommentRemover.py index 7dcb8c1..0628456 100644 --- a/scripts/TouchinBuild/Core/LineConveyor/CommentRemover.py +++ b/scripts/TouchinBuild/Core/LineConveyor/CommentRemover.py @@ -1,6 +1,9 @@ -class CommentRemover: +from Core.LineConveyor.PreprocessorBase import PreprocessorBase + + +class CommentRemover(PreprocessorBase): def __init__(self): - pass + PreprocessorBase.__init__(self) def processText(self, line, conveyorProcessor): assert line is not None diff --git a/scripts/TouchinBuild/Core/LineConveyor/MacroResolver.py b/scripts/TouchinBuild/Core/LineConveyor/MacroResolver.py index 0012c09..e42dba2 100644 --- a/scripts/TouchinBuild/Core/LineConveyor/MacroResolver.py +++ b/scripts/TouchinBuild/Core/LineConveyor/MacroResolver.py @@ -1,5 +1,10 @@ -class MacroResolver: +from Core.LineConveyor.PreprocessorBase import PreprocessorBase + + +class MacroResolver(PreprocessorBase): def __init__(self, macroProcessor, valueProvider): + PreprocessorBase.__init__(self) + assert macroProcessor is not None assert valueProvider is not None diff --git a/scripts/TouchinBuild/Core/LineConveyor/NullPreprocessor.py b/scripts/TouchinBuild/Core/LineConveyor/NullPreprocessor.py new file mode 100644 index 0000000..67824da --- /dev/null +++ b/scripts/TouchinBuild/Core/LineConveyor/NullPreprocessor.py @@ -0,0 +1,9 @@ +from Core.LineConveyor.PreprocessorBase import PreprocessorBase + + +class NullPreprocessor(PreprocessorBase): + def __init__(self): + PreprocessorBase.__init__(self) + + def processText(self, text, conveyorProcessor): + return text diff --git a/scripts/TouchinBuild/Core/LineConveyor/PreprocessorBase.py b/scripts/TouchinBuild/Core/LineConveyor/PreprocessorBase.py new file mode 100644 index 0000000..2a18eda --- /dev/null +++ b/scripts/TouchinBuild/Core/LineConveyor/PreprocessorBase.py @@ -0,0 +1,12 @@ +import abc + + +class PreprocessorBase: + __metaclass__ = abc.ABCMeta + + def __init__(self): + pass + + @abc.abstractmethod + def processText(self, line, conveyorProcessor): + pass \ No newline at end of file diff --git a/scripts/TouchinBuild/Core/LineConveyor/Stripper.py b/scripts/TouchinBuild/Core/LineConveyor/Stripper.py index 8aff211..4c21c3a 100644 --- a/scripts/TouchinBuild/Core/LineConveyor/Stripper.py +++ b/scripts/TouchinBuild/Core/LineConveyor/Stripper.py @@ -1,6 +1,9 @@ -class Stripper: +from Core.LineConveyor.PreprocessorBase import PreprocessorBase + + +class Stripper(PreprocessorBase): def __init__(self): - pass + PreprocessorBase.__init__(self) def processText(self, line, conveyorProcessor): assert line is not None diff --git a/scripts/TouchinBuild/Core/LineConveyor/TextConveyorPreprocessor.py b/scripts/TouchinBuild/Core/LineConveyor/TextConveyorPreprocessor.py index 9f789b4..cf43e00 100644 --- a/scripts/TouchinBuild/Core/LineConveyor/TextConveyorPreprocessor.py +++ b/scripts/TouchinBuild/Core/LineConveyor/TextConveyorPreprocessor.py @@ -1,5 +1,9 @@ -class TextConveyorPreprocessor: +from Core.LineConveyor.PreprocessorBase import PreprocessorBase + + +class TextConveyorPreprocessor(PreprocessorBase): def __init__(self): + PreprocessorBase.__init__(self) self.processors = [] def addProcessor(self, processor): diff --git a/scripts/TouchinBuild/Core/LineConveyor/TextInclude.py b/scripts/TouchinBuild/Core/LineConveyor/TextInclude.py index 144eea8..6c272e2 100644 --- a/scripts/TouchinBuild/Core/LineConveyor/TextInclude.py +++ b/scripts/TouchinBuild/Core/LineConveyor/TextInclude.py @@ -1,5 +1,10 @@ -class TextInclude: +from Core.LineConveyor.PreprocessorBase import PreprocessorBase + + +class TextInclude(PreprocessorBase): def __init__(self, includeProcessor, contentProvider): + PreprocessorBase.__init__(self) + assert includeProcessor is not None assert contentProvider is not None diff --git a/scripts/TouchinBuild/Tests/UnitTests/SettingsParser/test_SettingsParser.py b/scripts/TouchinBuild/Tests/UnitTests/SettingsParser/test_SettingsParser.py index c8081f5..8da6dd4 100644 --- a/scripts/TouchinBuild/Tests/UnitTests/SettingsParser/test_SettingsParser.py +++ b/scripts/TouchinBuild/Tests/UnitTests/SettingsParser/test_SettingsParser.py @@ -1,11 +1,13 @@ import unittest +from Core.LineConveyor.NullPreprocessor import NullPreprocessor from parsers.SettingsParser.SettingsParser import SettingsParser class TestSettingsParser(unittest.TestCase): def setUp(self): - self.parser = SettingsParser() + self.preprocessor = NullPreprocessor() + self.parser = SettingsParser(self.preprocessor) def test_processLine(self): line1 = "x.y.name1 = 'value1'" @@ -38,15 +40,17 @@ class TestSettingsParser(unittest.TestCase): self.assertEqual('value8', self.parser.settings['a']['z']['name2']) def test_emptyLinesAndComments(self): + class PartialSettingsParser(SettingsParser): - def __init__(self): - SettingsParser.__init__(self) + def __init__(self, textPreprocessor): + SettingsParser.__init__(self, textPreprocessor) self.processLineCall = 0 def processLine(self, line): self.processLineCall += 1 + print '{0} {1}'.format(self.processLineCall, line) - self.parser = PartialSettingsParser() + self.parser = PartialSettingsParser(self.preprocessor) content = """ valid.line.with.setting = 'some value' # this is comment @@ -56,6 +60,8 @@ valid.line.with.setting = 'some value' self.parser.parse(content) + # всего 6 строк, 2 из которых пустые + # NullPreprocessor не уберет комментарии, поэтому будет 4 вызова processLine self.assertEqual(2, self.parser.processLineCall) diff --git a/scripts/TouchinBuild/parsers/SettingsParser/SettingsParser.py b/scripts/TouchinBuild/parsers/SettingsParser/SettingsParser.py index 10c2ba4..92454f2 100644 --- a/scripts/TouchinBuild/parsers/SettingsParser/SettingsParser.py +++ b/scripts/TouchinBuild/parsers/SettingsParser/SettingsParser.py @@ -24,8 +24,6 @@ class SettingsParser: else: self.processLine(processedLine) - self.processLine(processedLine) - def processLine(self, line): assert line is not None diff --git a/scripts/settings.txt b/scripts/settings.txt index 17963b1..cd028a0 100644 --- a/scripts/settings.txt +++ b/scripts/settings.txt @@ -1,6 +1,6 @@ # global settings build_tool = '/Applications/Xamarin\ Studio.app/Contents/MacOS/mdtool' -version = '0.0.0' +version = '0.0.0' # комментарий в тойже строке configs = 'appstore, staging' # ios platform settings From 2e1ec00ec7f21fdb8e23dd75bdd641038aa17c8c Mon Sep 17 00:00:00 2001 From: rzaitov Date: Wed, 13 Nov 2013 17:28:29 +0400 Subject: [PATCH 3/6] =?UTF-8?q?=D0=9F=D0=BE=D1=84=D0=B8=D0=BA=D1=81=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=82=D0=B5=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/IosSetupSteps.txt | 18 +++++---- scripts/IosSteps.txt | 7 ++-- .../UnitTests/SettingsMerger/__init__.py | 1 + .../SettingsMerger/test_SettingsMerger.py | 37 +++++++++++++++++++ .../SettingsParser/test_SettingsParser.py | 4 +- .../parsers/SettingsParser/SettingsMerger.py | 12 +----- .../parsers/SettingsParser/SettingsParser.py | 4 +- 7 files changed, 57 insertions(+), 26 deletions(-) create mode 100644 scripts/TouchinBuild/Tests/UnitTests/SettingsMerger/__init__.py create mode 100644 scripts/TouchinBuild/Tests/UnitTests/SettingsMerger/test_SettingsMerger.py diff --git a/scripts/IosSetupSteps.txt b/scripts/IosSetupSteps.txt index 58c1abf..56f0d85 100644 --- a/scripts/IosSetupSteps.txt +++ b/scripts/IosSetupSteps.txt @@ -1,16 +1,18 @@ +sh echo 'IosSetupSteps.txt' + # restore from backup # восстанавливаем из бэкапа (исходники от сборки предыдущей конфигурации могут быть модифицированными) # create backup -sh echo '{@sln_config}' +#sh echo '{@sln_config}' -inside 'BuildSample/BuildSample.sln' remove NotCompileApp project +#inside 'BuildSample/BuildSample.sln' remove NotCompileApp project -inside 'BuildSample/BuildSample/CoolApp.csproj' set OutputPath to 'Output' for '{@sln_config}' -inside 'BuildSample/BuildSample/CoolApp.csproj' set AssemblyName to 'CoolApp' for '' +#inside 'BuildSample/BuildSample/CoolApp.csproj' set OutputPath to 'Output' for '{@sln_config}' +#inside 'BuildSample/BuildSample/CoolApp.csproj' set AssemblyName to 'CoolApp' for '' -inside 'BuildSample/BuildSample/Info.plist' set CFBundleVersion to '{@version}' -inside 'BuildSample/BuildSample/Info.plist' set CFBundleDisplayName to 'CoolApp' +#inside 'BuildSample/BuildSample/Info.plist' set CFBundleVersion to '{@version}' +#inside 'BuildSample/BuildSample/Info.plist' set CFBundleDisplayName to 'CoolApp' -inside 'BuildSample/BuildSample/Info.plist' set CFBundleIconFiles with values '{@icons}' +#inside 'BuildSample/BuildSample/Info.plist' set CFBundleIconFiles with values '{@icons}' -install profile 'BuildSample/BuildSample/Profiles/8F606DAE-F9C9-4A19-8EFF-34B990D76C28.mobileprovision' \ No newline at end of file +#install profile 'BuildSample/BuildSample/Profiles/8F606DAE-F9C9-4A19-8EFF-34B990D76C28.mobileprovision' \ No newline at end of file diff --git a/scripts/IosSteps.txt b/scripts/IosSteps.txt index 2305d41..1b56a67 100644 --- a/scripts/IosSteps.txt +++ b/scripts/IosSteps.txt @@ -1,9 +1,10 @@ -sh echo '{@builder_path}' +sh echo 'IosSteps.txt' +#sh echo '{@builder_path}' -sh echo hello from '{@author}' -sh echo version: '{@version}' +#sh echo hello from '{@author}' +#sh echo version: '{@version}' #clean 'BuildSample/BuildSample.sln' for '{@sln_config}' #build 'BuildSample/BuildSample.sln' for '{@sln_config}' diff --git a/scripts/TouchinBuild/Tests/UnitTests/SettingsMerger/__init__.py b/scripts/TouchinBuild/Tests/UnitTests/SettingsMerger/__init__.py new file mode 100644 index 0000000..cc31abc --- /dev/null +++ b/scripts/TouchinBuild/Tests/UnitTests/SettingsMerger/__init__.py @@ -0,0 +1 @@ +__author__ = 'rzaitov' diff --git a/scripts/TouchinBuild/Tests/UnitTests/SettingsMerger/test_SettingsMerger.py b/scripts/TouchinBuild/Tests/UnitTests/SettingsMerger/test_SettingsMerger.py new file mode 100644 index 0000000..326a6dd --- /dev/null +++ b/scripts/TouchinBuild/Tests/UnitTests/SettingsMerger/test_SettingsMerger.py @@ -0,0 +1,37 @@ +import unittest +from parsers.SettingsParser.SettingsMerger import SettingsMerger + + +class TestSettingsMerger(unittest.TestCase): + def setUp(self): + self.merger = SettingsMerger() + self.globalSettings = { + 'top_level_key1': 'value1', + 'top_level_key2': 'value2', + + 'child1': { + 'sub_key1': 'value3', + 'sub_key2': 'value4', + }, + + 'child2': { + 'sub_key3': 'value5', + 'sub_key4': 'value6', + } + } + + settingDescr2 = { + 'segments': ['child1', 'sub_key1'], + 'value': 'new_value3' + } + + def test_mergeTopLevelSettings(self): + description = { + 'segments': ['top_level_key1'], + 'value': 'new_value1' + } + + self.merger.merge(self.globalSettings, description) + + self.assertEqual('new_value1', self.globalSettings['top_level_key1']) + self.assertEqual('value2', self.globalSettings['top_level_key2']) \ No newline at end of file diff --git a/scripts/TouchinBuild/Tests/UnitTests/SettingsParser/test_SettingsParser.py b/scripts/TouchinBuild/Tests/UnitTests/SettingsParser/test_SettingsParser.py index 8da6dd4..6888f29 100644 --- a/scripts/TouchinBuild/Tests/UnitTests/SettingsParser/test_SettingsParser.py +++ b/scripts/TouchinBuild/Tests/UnitTests/SettingsParser/test_SettingsParser.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- import unittest from Core.LineConveyor.NullPreprocessor import NullPreprocessor from parsers.SettingsParser.SettingsParser import SettingsParser @@ -48,7 +49,6 @@ class TestSettingsParser(unittest.TestCase): def processLine(self, line): self.processLineCall += 1 - print '{0} {1}'.format(self.processLineCall, line) self.parser = PartialSettingsParser(self.preprocessor) content = """ @@ -62,7 +62,7 @@ valid.line.with.setting = 'some value' # всего 6 строк, 2 из которых пустые # NullPreprocessor не уберет комментарии, поэтому будет 4 вызова processLine - self.assertEqual(2, self.parser.processLineCall) + self.assertEqual(4, self.parser.processLineCall) diff --git a/scripts/TouchinBuild/parsers/SettingsParser/SettingsMerger.py b/scripts/TouchinBuild/parsers/SettingsParser/SettingsMerger.py index 73af7dc..9bb5684 100644 --- a/scripts/TouchinBuild/parsers/SettingsParser/SettingsMerger.py +++ b/scripts/TouchinBuild/parsers/SettingsParser/SettingsMerger.py @@ -10,8 +10,6 @@ class SettingsMerger: propName = segments[-1] settingsDict = self.getSettingsDictByPath(globalSettings, propPath) - #self.overrideGuard(settingsDict, propName, propPath) - settingsDict[propName] = value def getSettingsDictByPath(self, globalSettings, pathToSettingsDict): @@ -24,12 +22,4 @@ class SettingsMerger: settingsDict = settingsDict[segment] - return settingsDict - - #def overrideGuard(self, dictionary, key, path): - # if key in dictionary: - # pathStr = '.'.join(path) - # msg = 'settings with name {0} by path {1} already exists with value {3}'.format(key, dictionary[key], pathStr) - # raise Exception(msg) - - + return settingsDict \ No newline at end of file diff --git a/scripts/TouchinBuild/parsers/SettingsParser/SettingsParser.py b/scripts/TouchinBuild/parsers/SettingsParser/SettingsParser.py index 92454f2..dbec9c0 100644 --- a/scripts/TouchinBuild/parsers/SettingsParser/SettingsParser.py +++ b/scripts/TouchinBuild/parsers/SettingsParser/SettingsParser.py @@ -7,9 +7,9 @@ class SettingsParser: assert compositeLineProcessor is not None self.compositeLineProcessor = compositeLineProcessor - self.settings = settings - if not self.settings: + self.settings = settings + if self.settings is None: self.settings = {} def parse(self, content): From 890a51af8abc3cb92a502c5b9e4a36980bdf9032 Mon Sep 17 00:00:00 2001 From: rzaitov Date: Wed, 13 Nov 2013 17:31:48 +0400 Subject: [PATCH 4/6] =?UTF-8?q?=D0=95=D1=89=D0=B5=20=D1=82=D0=B5=D1=81?= =?UTF-8?q?=D1=82=20=D0=BD=D0=B0=20=D0=BC=D0=B5=D1=80=D0=B4=D0=B6=D0=B8?= =?UTF-8?q?=D0=BD=D0=B3=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SettingsMerger/test_SettingsMerger.py | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/scripts/TouchinBuild/Tests/UnitTests/SettingsMerger/test_SettingsMerger.py b/scripts/TouchinBuild/Tests/UnitTests/SettingsMerger/test_SettingsMerger.py index 326a6dd..6936e13 100644 --- a/scripts/TouchinBuild/Tests/UnitTests/SettingsMerger/test_SettingsMerger.py +++ b/scripts/TouchinBuild/Tests/UnitTests/SettingsMerger/test_SettingsMerger.py @@ -20,11 +20,6 @@ class TestSettingsMerger(unittest.TestCase): } } - settingDescr2 = { - 'segments': ['child1', 'sub_key1'], - 'value': 'new_value3' - } - def test_mergeTopLevelSettings(self): description = { 'segments': ['top_level_key1'], @@ -34,4 +29,19 @@ class TestSettingsMerger(unittest.TestCase): self.merger.merge(self.globalSettings, description) self.assertEqual('new_value1', self.globalSettings['top_level_key1']) - self.assertEqual('value2', self.globalSettings['top_level_key2']) \ No newline at end of file + self.assertEqual('value2', self.globalSettings['top_level_key2']) + + def test_mergeSubElement(self): + description = { + 'segments': ['child1', 'sub_key1'], + 'value': 'new_value3' + } + + self.merger.merge(self.globalSettings, description) + + self.assertEqual('value1', self.globalSettings['top_level_key1']) + self.assertEqual('value2', self.globalSettings['top_level_key2']) + + self.assertEqual('new_value3', self.globalSettings['child1']['sub_key1']) + self.assertEqual('value4', self.globalSettings['child1']['sub_key2']) + From d7e11e39f5bfbbe8134efa9e8f4b7cf795ae7791 Mon Sep 17 00:00:00 2001 From: rzaitov Date: Wed, 13 Nov 2013 18:08:19 +0400 Subject: [PATCH 5/6] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=BD=D0=B0=20settingsMerg?= =?UTF-8?q?er?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SettingsMerger/test_SettingsMerger.py | 29 +++++++++++++++++++ .../parsers/SettingsParser/SettingsMerger.py | 14 +++++++-- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/scripts/TouchinBuild/Tests/UnitTests/SettingsMerger/test_SettingsMerger.py b/scripts/TouchinBuild/Tests/UnitTests/SettingsMerger/test_SettingsMerger.py index 6936e13..a97056c 100644 --- a/scripts/TouchinBuild/Tests/UnitTests/SettingsMerger/test_SettingsMerger.py +++ b/scripts/TouchinBuild/Tests/UnitTests/SettingsMerger/test_SettingsMerger.py @@ -45,3 +45,32 @@ class TestSettingsMerger(unittest.TestCase): self.assertEqual('new_value3', self.globalSettings['child1']['sub_key1']) self.assertEqual('value4', self.globalSettings['child1']['sub_key2']) + def test_getPropertyName(self): + self.checkName(['one', 'two', 'three'], 'three') + self.checkName(['one', 'two'], 'two') + self.checkName(['one'], 'one') + + def checkName(self, segments, expectedName): + name = self.merger.getPropertyName(segments) + self.assertEqual(name, expectedName) + + def test_checkPath(self): + self.checkPath(['one', 'two', 'three'], ['one', 'two']) + self.checkPath(['one', 'two'], ['one']) + self.checkPath(['one'], []) + + def checkPath(self, segments, expectedPath): + path = self.merger.getPath(segments) + + self.assertListEqual(expectedPath, path) + + def test_mergeNotExistSetting(self): + description = { + 'segments': ['new_key'], + 'value': 'new_value' + } + + print self.globalSettings + self.assertEqual('new_value', self.globalSettings['new_key']) + + diff --git a/scripts/TouchinBuild/parsers/SettingsParser/SettingsMerger.py b/scripts/TouchinBuild/parsers/SettingsParser/SettingsMerger.py index 9bb5684..b45b829 100644 --- a/scripts/TouchinBuild/parsers/SettingsParser/SettingsMerger.py +++ b/scripts/TouchinBuild/parsers/SettingsParser/SettingsMerger.py @@ -6,8 +6,8 @@ class SettingsMerger: value = settingDescription['value'] segments = settingDescription['segments'] - propPath = segments[0:-1] - propName = segments[-1] + propPath = self.getPath(segments) + propName = self.getPropertyName(segments) settingsDict = self.getSettingsDictByPath(globalSettings, propPath) settingsDict[propName] = value @@ -22,4 +22,12 @@ class SettingsMerger: settingsDict = settingsDict[segment] - return settingsDict \ No newline at end of file + return settingsDict + + def getPath(self, segments): + assert segments is not None + return segments[0:-1] + + def getPropertyName(self, segments): + assert segments is not None + return segments[-1] \ No newline at end of file From 8aa91598b59b6cc468acf64df28f0dd444489254 Mon Sep 17 00:00:00 2001 From: rzaitov Date: Wed, 13 Nov 2013 18:32:25 +0400 Subject: [PATCH 6/6] =?UTF-8?q?=D0=9F=D0=BE=D1=84=D0=B8=D0=BA=D1=81=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B1=D0=B0=D0=B3=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BE?= =?UTF-8?q?=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BA=20=D0=B8=D0=B7?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B0=D0=BD=D0=B4=D0=BD=D0=BE=D0=B9?= =?UTF-8?q?=20=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/IosSetupSteps.txt | 16 +++--- scripts/IosSteps.txt | 18 +++--- .../SettingsMerger/test_SettingsMerger.py | 57 +++++++++++++++---- .../parsers/SettingsParser/SettingsParser.py | 3 +- scripts/TouchinBuild/taskRunner.py | 2 +- .../CmdArgsOverriderSettingsProvider.py | 6 +- .../FromFileSettingsProvider.py | 2 +- scripts/settings.txt | 1 + 8 files changed, 72 insertions(+), 33 deletions(-) diff --git a/scripts/IosSetupSteps.txt b/scripts/IosSetupSteps.txt index 56f0d85..262d6c6 100644 --- a/scripts/IosSetupSteps.txt +++ b/scripts/IosSetupSteps.txt @@ -3,16 +3,16 @@ sh echo 'IosSetupSteps.txt' # restore from backup # восстанавливаем из бэкапа (исходники от сборки предыдущей конфигурации могут быть модифицированными) # create backup -#sh echo '{@sln_config}' +sh echo '{@sln_config}' -#inside 'BuildSample/BuildSample.sln' remove NotCompileApp project +inside 'BuildSample/BuildSample.sln' remove NotCompileApp project -#inside 'BuildSample/BuildSample/CoolApp.csproj' set OutputPath to 'Output' for '{@sln_config}' -#inside 'BuildSample/BuildSample/CoolApp.csproj' set AssemblyName to 'CoolApp' for '' +inside 'BuildSample/BuildSample/CoolApp.csproj' set OutputPath to 'Output' for '{@sln_config}' +inside 'BuildSample/BuildSample/CoolApp.csproj' set AssemblyName to '{@assembly_name}' for '' -#inside 'BuildSample/BuildSample/Info.plist' set CFBundleVersion to '{@version}' -#inside 'BuildSample/BuildSample/Info.plist' set CFBundleDisplayName to 'CoolApp' +inside 'BuildSample/BuildSample/Info.plist' set CFBundleVersion to '{@version}' +inside 'BuildSample/BuildSample/Info.plist' set CFBundleDisplayName to 'CoolApp' -#inside 'BuildSample/BuildSample/Info.plist' set CFBundleIconFiles with values '{@icons}' +inside 'BuildSample/BuildSample/Info.plist' set CFBundleIconFiles with values '{@icons}' -#install profile 'BuildSample/BuildSample/Profiles/8F606DAE-F9C9-4A19-8EFF-34B990D76C28.mobileprovision' \ No newline at end of file +install profile 'BuildSample/BuildSample/Profiles/8F606DAE-F9C9-4A19-8EFF-34B990D76C28.mobileprovision' \ No newline at end of file diff --git a/scripts/IosSteps.txt b/scripts/IosSteps.txt index 1b56a67..e748de9 100644 --- a/scripts/IosSteps.txt +++ b/scripts/IosSteps.txt @@ -1,19 +1,19 @@ sh echo 'IosSteps.txt' -#sh echo '{@builder_path}' +sh echo '{@builder_path}' -#sh echo hello from '{@author}' -#sh echo version: '{@version}' +sh echo hello from '{@author}' +sh echo version: '{@version}' -#clean 'BuildSample/BuildSample.sln' for '{@sln_config}' -#build 'BuildSample/BuildSample.sln' for '{@sln_config}' +clean 'BuildSample/BuildSample.sln' for '{@sln_config}' +build 'BuildSample/BuildSample.sln' for '{@sln_config}' -#create dirs 'Output/Appstore/Artifacts' -#copy 'BuildSample/BuildSample/Output/BuildSample-{@version}.ipa' to 'Output/Appstore/Artifacts' -#sh cp -a BuildSample/BuildSample/Output/ Output/Appstore/ +create dirs 'Output/Appstore/Artifacts' +copy 'BuildSample/BuildSample/Output/{@assembly_name}-{@version}.ipa' to 'Output/Appstore/Artifacts' +sh cp -a BuildSample/BuildSample/Output/ Output/Appstore/ -#publish 'Output/Appstore/Artifacts/BuildSample-{@version}.ipa' to testflight notes = 'Hello' api_token = '{@tf_api_token}' team_token = '{@tf_team_token}' +publish 'Output/Appstore/Artifacts/{@assembly_name}-{@version}.ipa' to testflight notes = 'Hello' api_token = '{@tf_api_token}' team_token = '{@tf_team_token}' #restore from backup #delete backup \ No newline at end of file diff --git a/scripts/TouchinBuild/Tests/UnitTests/SettingsMerger/test_SettingsMerger.py b/scripts/TouchinBuild/Tests/UnitTests/SettingsMerger/test_SettingsMerger.py index a97056c..88f53fc 100644 --- a/scripts/TouchinBuild/Tests/UnitTests/SettingsMerger/test_SettingsMerger.py +++ b/scripts/TouchinBuild/Tests/UnitTests/SettingsMerger/test_SettingsMerger.py @@ -5,19 +5,23 @@ from parsers.SettingsParser.SettingsMerger import SettingsMerger class TestSettingsMerger(unittest.TestCase): def setUp(self): self.merger = SettingsMerger() + + self.child1 = { + 'sub_key1': 'value3', + 'sub_key2': 'value4', + } + + self.child2 = { + 'sub_key3': 'value5', + 'sub_key4': 'value6', + } + self.globalSettings = { 'top_level_key1': 'value1', 'top_level_key2': 'value2', - 'child1': { - 'sub_key1': 'value3', - 'sub_key2': 'value4', - }, - - 'child2': { - 'sub_key3': 'value5', - 'sub_key4': 'value6', - } + 'child1': self.child1, + 'child2': self.child2 } def test_mergeTopLevelSettings(self): @@ -64,13 +68,44 @@ class TestSettingsMerger(unittest.TestCase): self.assertListEqual(expectedPath, path) - def test_mergeNotExistSetting(self): + def test_mergeNotExistTopLevelSetting(self): description = { 'segments': ['new_key'], 'value': 'new_value' } - print self.globalSettings + self.merger.merge(self.globalSettings, description) self.assertEqual('new_value', self.globalSettings['new_key']) + def test_mergeNotExistSubSetting(self): + description = { + 'segments': ['child1', 'new_key'], + 'value': 'new_value' + } + + self.merger.merge(self.globalSettings, description) + self.assertEqual('new_value', self.globalSettings['child1']['new_key']) + + + def test_mergeNotExistSub(self): + description = { + 'segments': ['child3', 'new_key'], + 'value': 'new_value' + } + + self.merger.merge(self.globalSettings, description) + self.assertEqual('new_value', self.globalSettings['child3']['new_key']) + + + def test_getSettingsDictionaryByPath(self): + dictionary1 = self.merger.getSettingsDictByPath(self.globalSettings, []) + self.assertEqual(self.globalSettings, dictionary1) + self.assertTrue(self.globalSettings == dictionary1) + + dictionary2 = self.merger.getSettingsDictByPath(self.globalSettings, ['child1']) + self.assertTrue(self.child1 == dictionary2) + + dictionary3 = self.merger.getSettingsDictByPath(self.globalSettings, ['child2']) + self.assertTrue(self.child2 == dictionary3) + diff --git a/scripts/TouchinBuild/parsers/SettingsParser/SettingsParser.py b/scripts/TouchinBuild/parsers/SettingsParser/SettingsParser.py index dbec9c0..81cff59 100644 --- a/scripts/TouchinBuild/parsers/SettingsParser/SettingsParser.py +++ b/scripts/TouchinBuild/parsers/SettingsParser/SettingsParser.py @@ -3,8 +3,9 @@ from parsers.SettingsParser.SettingsMerger import SettingsMerger class SettingsParser: - def __init__(self, compositeLineProcessor, settings=None): + def __init__(self, compositeLineProcessor, settings): assert compositeLineProcessor is not None + assert settings is None or type(settings) == dict self.compositeLineProcessor = compositeLineProcessor diff --git a/scripts/TouchinBuild/taskRunner.py b/scripts/TouchinBuild/taskRunner.py index bb258fc..d1f49cb 100755 --- a/scripts/TouchinBuild/taskRunner.py +++ b/scripts/TouchinBuild/taskRunner.py @@ -90,7 +90,7 @@ if __name__ == "__main__": # TODO: перенести в корень комапановки settingsPath = 'scripts/settings.txt' fromFileSettingsProvider = FromFileSettingsProvider(settingsPath, linePreprocessor) - overrideWithCmdSetProvider = CmdArgsOverriderSettingsProvider(fromFileSettingsProvider, overrideArgs) + overrideWithCmdSetProvider = CmdArgsOverriderSettingsProvider(fromFileSettingsProvider, overrideArgs, linePreprocessor) fContentProvider = FileContentProvider() diff --git a/scripts/TouchinBuild/utils/SettingsProvider/CmdArgsOverriderSettingsProvider.py b/scripts/TouchinBuild/utils/SettingsProvider/CmdArgsOverriderSettingsProvider.py index 47ecb6c..2c4572b 100644 --- a/scripts/TouchinBuild/utils/SettingsProvider/CmdArgsOverriderSettingsProvider.py +++ b/scripts/TouchinBuild/utils/SettingsProvider/CmdArgsOverriderSettingsProvider.py @@ -3,12 +3,14 @@ from parsers.SettingsParser.SettingsParser import SettingsParser class CmdArgsOverriderSettingsProvider(SettingsProviderBase): - def __init__(self, settingsProvider, settingLines): + def __init__(self, settingsProvider, settingLines, compositeLineProcessor): SettingsProviderBase.__init__(self) assert settingsProvider is not None + assert compositeLineProcessor is not None self.inner = settingsProvider self.overrideSettings = settingLines + self.compositeLineProcessor = compositeLineProcessor def fetchSettings(self): settings = self.inner.fetchSettings() @@ -16,7 +18,7 @@ class CmdArgsOverriderSettingsProvider(SettingsProviderBase): if self.overrideSettings: for s in self.overrideSettings: line = self.normalizeLine(s) - settingParser = SettingsParser(settings) + settingParser = SettingsParser(self.compositeLineProcessor, settings) settingParser.processLine(line) return settings diff --git a/scripts/TouchinBuild/utils/SettingsProvider/FromFileSettingsProvider.py b/scripts/TouchinBuild/utils/SettingsProvider/FromFileSettingsProvider.py index 19da67d..6df08db 100644 --- a/scripts/TouchinBuild/utils/SettingsProvider/FromFileSettingsProvider.py +++ b/scripts/TouchinBuild/utils/SettingsProvider/FromFileSettingsProvider.py @@ -16,7 +16,7 @@ class FromFileSettingsProvider(SettingsProviderBase): settingsFile = open(self.pathToSettings) content = settingsFile.read() - parser = SettingsParser(self.compositeLineProcessor) + parser = SettingsParser(self.compositeLineProcessor, None) parser.parse(content) return parser.settings diff --git a/scripts/settings.txt b/scripts/settings.txt index cd028a0..277d2b8 100644 --- a/scripts/settings.txt +++ b/scripts/settings.txt @@ -7,6 +7,7 @@ configs = 'appstore, staging' ios.sln_config = 'Release|iPhone' ios.steps = 'scripts/IosSteps.txt' ios.setup_steps = 'IosSetupSteps.txt' +ios.assembly_name = 'CoolApp' ios.tf_api_token = '0e6925075d4fc10fed0e7bbf43fa6894_NjQ0OTI2MjAxMi0wOS0yNSAxMTo0MDozNi40OTY5MjU' ios.tf_team_token = 'c5c3cf7a6dae2bea4382dfbd181a2075_Mjc4ODkwMjAxMy0wOS0yOSAxNDowOTo1OC40Mzg5MTY'