From b3f7ff1f7b1032fca59cdf7782e0daf6e392e146 Mon Sep 17 00:00:00 2001 From: Rustam Zaitov Date: Tue, 5 Nov 2013 00:44:54 +0400 Subject: [PATCH 1/6] =?UTF-8?q?=D0=9D=D0=B0=D1=87=D0=B0=D0=BB=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE=D0=B2=D1=8B=D0=B2=D0=B0?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BA=D0=BE=D0=BD=D0=B2=D0=B5=D0=B5=D1=80=20?= =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B8=20=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=BA=D0=B8=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4?= =?UTF-8?q?=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B0=D1=87=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=B5=D0=B5=20=D0=BF=D0=B0=D1=80=D1=81=D0=B5=D1=80=D1=83.=20?= =?UTF-8?q?=D0=A1=20=D0=BF=D0=BE=D0=BC=D0=BE=D1=89=D1=8C=D1=8E=20=D1=8D?= =?UTF-8?q?=D1=82=D0=BE=D0=B3=D0=BE=20=D0=BA=D0=BE=D0=BD=D0=B2=D0=B5=D0=B5?= =?UTF-8?q?=D1=80=D0=B0=20=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE=20=D1=83=D0=B4?= =?UTF-8?q?=D0=B0=D0=BB=D1=8F=D1=82=D1=8C=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B0=D1=80=D0=B8=D0=B8,=20=D1=83=D0=B4=D0=B0?= =?UTF-8?q?=D0=BB=D1=8F=D1=82=D1=8C=20=D0=B2=D0=B5=D0=B4=D1=83=D1=89=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BF=D1=80=D0=BE=D0=B1=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B?= =?UTF-8?q?=D0=B5=20=D1=81=D0=B8=D0=BC=D0=B2=D0=BE=D0=BB=D1=8B=20=D0=B8=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B7=D0=BE=D0=BB=D0=B2=D0=B8=D1=82=D1=8C=20=D0=B7?= =?UTF-8?q?=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D1=8F(=D0=BC=D0=B0=D0=BA?= =?UTF-8?q?=D1=80=D0=BE=D1=81=D1=8B)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/Core/LineConveyor/CommentRemover.py | 6 ++++++ scripts/Core/LineConveyor/Stripper.py | 5 +++++ .../{StepRunner => Core/LineConveyor}/__init__.py | 0 scripts/{StepRunner => Core}/StepsRunner.py | 0 scripts/Core/__init__.py | 1 + scripts/Tests/UnitTests/LineConveyor/__init__.py | 1 + .../Tests/UnitTests/LineConveyor/test_stripper.py | 13 +++++++++++++ scripts/taskRunner.py | 2 +- 8 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 scripts/Core/LineConveyor/CommentRemover.py create mode 100644 scripts/Core/LineConveyor/Stripper.py rename scripts/{StepRunner => Core/LineConveyor}/__init__.py (100%) rename scripts/{StepRunner => Core}/StepsRunner.py (100%) create mode 100644 scripts/Core/__init__.py create mode 100644 scripts/Tests/UnitTests/LineConveyor/__init__.py create mode 100644 scripts/Tests/UnitTests/LineConveyor/test_stripper.py diff --git a/scripts/Core/LineConveyor/CommentRemover.py b/scripts/Core/LineConveyor/CommentRemover.py new file mode 100644 index 0000000..6624671 --- /dev/null +++ b/scripts/Core/LineConveyor/CommentRemover.py @@ -0,0 +1,6 @@ +class CommentRemover: + def processLine(self, line): + assert line is not None + + + diff --git a/scripts/Core/LineConveyor/Stripper.py b/scripts/Core/LineConveyor/Stripper.py new file mode 100644 index 0000000..9b57bee --- /dev/null +++ b/scripts/Core/LineConveyor/Stripper.py @@ -0,0 +1,5 @@ +class Stripper: + def processLine(self, line): + assert line is not None + + return line.strip(' \t\n\r') diff --git a/scripts/StepRunner/__init__.py b/scripts/Core/LineConveyor/__init__.py similarity index 100% rename from scripts/StepRunner/__init__.py rename to scripts/Core/LineConveyor/__init__.py diff --git a/scripts/StepRunner/StepsRunner.py b/scripts/Core/StepsRunner.py similarity index 100% rename from scripts/StepRunner/StepsRunner.py rename to scripts/Core/StepsRunner.py diff --git a/scripts/Core/__init__.py b/scripts/Core/__init__.py new file mode 100644 index 0000000..cc31abc --- /dev/null +++ b/scripts/Core/__init__.py @@ -0,0 +1 @@ +__author__ = 'rzaitov' diff --git a/scripts/Tests/UnitTests/LineConveyor/__init__.py b/scripts/Tests/UnitTests/LineConveyor/__init__.py new file mode 100644 index 0000000..cc31abc --- /dev/null +++ b/scripts/Tests/UnitTests/LineConveyor/__init__.py @@ -0,0 +1 @@ +__author__ = 'rzaitov' diff --git a/scripts/Tests/UnitTests/LineConveyor/test_stripper.py b/scripts/Tests/UnitTests/LineConveyor/test_stripper.py new file mode 100644 index 0000000..75057be --- /dev/null +++ b/scripts/Tests/UnitTests/LineConveyor/test_stripper.py @@ -0,0 +1,13 @@ +import unittest +from Core.LineConveyor.Stripper import Stripper + + +class TestStripper(unittest.TestCase): + def setUp(self): + self.stripper = Stripper() + + def test_stripLine(self): + line = ' \tSome text \t\r\n' + newLine = self.stripper.processLine(line) + + self.assertEqual('Some text', newLine) \ No newline at end of file diff --git a/scripts/taskRunner.py b/scripts/taskRunner.py index f9f73a3..7485576 100644 --- a/scripts/taskRunner.py +++ b/scripts/taskRunner.py @@ -9,7 +9,7 @@ baseDir = os.path.join(scriptDir, os.pardir) os.chdir(baseDir) -from StepRunner.StepsRunner import StepsRunner +from Core.StepsRunner import StepsRunner class TaskRunner: From 5ce8eb0269791293a0c78200bab4d81822de35e4 Mon Sep 17 00:00:00 2001 From: Rustam Zaitov Date: Tue, 5 Nov 2013 01:02:44 +0400 Subject: [PATCH 2/6] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81,=20=D0=BE=D1=82=D0=B2=D0=B5?= =?UTF-8?q?=D1=87=D0=B0=D1=8E=D1=89=D0=B8=D0=B9=20=D0=B7=D0=B0=20=D1=83?= =?UTF-8?q?=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=BC?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80=D0=B8=D0=B5=D0=B2=20=D0=B8?= =?UTF-8?q?=D0=B7=20=D0=B2=D1=85=D0=BE=D0=B4=D0=BD=D0=BE=D0=B9=20=D1=81?= =?UTF-8?q?=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/Core/LineConveyor/CommentRemover.py | 6 +++++- .../LineConveyor/test_commentRemover.py | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 scripts/Tests/UnitTests/LineConveyor/test_commentRemover.py diff --git a/scripts/Core/LineConveyor/CommentRemover.py b/scripts/Core/LineConveyor/CommentRemover.py index 6624671..4567066 100644 --- a/scripts/Core/LineConveyor/CommentRemover.py +++ b/scripts/Core/LineConveyor/CommentRemover.py @@ -2,5 +2,9 @@ class CommentRemover: def processLine(self, line): assert line is not None + newLine = line + index = line.find('#') + if index >= 0: + newLine = line[:index] - + return newLine \ No newline at end of file diff --git a/scripts/Tests/UnitTests/LineConveyor/test_commentRemover.py b/scripts/Tests/UnitTests/LineConveyor/test_commentRemover.py new file mode 100644 index 0000000..5c0baf8 --- /dev/null +++ b/scripts/Tests/UnitTests/LineConveyor/test_commentRemover.py @@ -0,0 +1,19 @@ +import unittest +from Core.LineConveyor.CommentRemover import CommentRemover + + +class TestCommentRemover(unittest.TestCase): + def setUp(self): + self.commentRemover = CommentRemover() + + def test_startsWithComment(self): + line = '# this line is comment' + newLine = self.commentRemover.processLine(line) + + self.assertEqual('', newLine) + + def test_containsComment(self): + line = 'this line contains # a comment' + newLine = self.commentRemover.processLine(line) + + self.assertEqual('this line contains ', newLine) \ No newline at end of file From 41d334d9071f0f27433b0a89306504e8b2e4e9ea Mon Sep 17 00:00:00 2001 From: Rustam Zaitov Date: Tue, 5 Nov 2013 01:20:08 +0400 Subject: [PATCH 3/6] =?UTF-8?q?=D0=B2=D0=BD=D0=B5=D0=B4=D1=80=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=BD=D0=B2=D0=B5=D0=B5=D1=80=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B5=D0=B4=D0=B2=D0=B0=D1=80=D0=B8=D1=82=D0=B5=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D0=BE=D0=B9=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B8=20=D1=81=D1=82=D1=80=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/Core/LineConveyor/LineConveyor.py | 16 ++++++++++++++++ scripts/Core/StepsRunner.py | 13 +++++++------ scripts/taskRunner.py | 21 ++++++++++++++------- 3 files changed, 37 insertions(+), 13 deletions(-) create mode 100644 scripts/Core/LineConveyor/LineConveyor.py diff --git a/scripts/Core/LineConveyor/LineConveyor.py b/scripts/Core/LineConveyor/LineConveyor.py new file mode 100644 index 0000000..3231185 --- /dev/null +++ b/scripts/Core/LineConveyor/LineConveyor.py @@ -0,0 +1,16 @@ +class LineConveyor: + def __init__(self): + self.processors = [] + + def addProcessor(self, processor): + assert processor is not None + + self.processors.append(processor) + + def processLine(self, line): + assert line is not None + + for processor in self.processors: + line = processor.processLine(line) + + return line diff --git a/scripts/Core/StepsRunner.py b/scripts/Core/StepsRunner.py index b805fc7..d106fcc 100644 --- a/scripts/Core/StepsRunner.py +++ b/scripts/Core/StepsRunner.py @@ -12,8 +12,11 @@ from commands.ValueProvider import ValueProvider class StepsRunner: - def __init__(self, config): + def __init__(self, config, compositeLineProcessor): assert config is not None + assert compositeLineProcessor is not None + + self.lineConveyor = compositeLineProcessor self.valueProvider = ValueProvider(config) @@ -36,14 +39,12 @@ class StepsRunner: lines = content.splitlines() for line in lines: - stripped = line.strip(' \t\n\r') + processedLine = self.lineConveyor.processLine(line) - if len(stripped) == 0: - continue - if stripped.startswith("#"): + if len(processedLine) == 0: continue else: - self.processLine(stripped) + self.processLine(processedLine) def processLine(self, line): if self.shCommandBuilder.isShCommand(line): diff --git a/scripts/taskRunner.py b/scripts/taskRunner.py index 7485576..57494de 100644 --- a/scripts/taskRunner.py +++ b/scripts/taskRunner.py @@ -1,4 +1,7 @@ import os +from Core.LineConveyor.CommentRemover import CommentRemover +from Core.LineConveyor.LineConveyor import LineConveyor +from Core.LineConveyor.Stripper import Stripper from utils.BuildConfigProvider import BuildConfigProvider from utils.FromFileSettingsProvider import FromFileSettingsProvider @@ -14,14 +17,18 @@ from Core.StepsRunner import StepsRunner class TaskRunner: def __init__(self): - pass + self.configsProvider = BuildConfigProvider() + self.settingsProvider = FromFileSettingsProvider() + + lineStripper = Stripper() + commentRemover = CommentRemover() + self.lineConveyor = LineConveyor() + self.lineConveyor.addProcessor(lineStripper) + self.lineConveyor.addProcessor(commentRemover) def run(self): - settingsProvider = FromFileSettingsProvider() - settings = settingsProvider.fetchSettings() - - configsProvider = BuildConfigProvider() - buildReadyConfigs = configsProvider.getConfigs(settings) + settings = self.settingsProvider.fetchSettings() + buildReadyConfigs = self.configsProvider.getConfigs(settings) for bc in buildReadyConfigs: self.runConfig(bc) @@ -29,7 +36,7 @@ class TaskRunner: def runConfig(self, config): content = self.getStepsContent(config) - stepsRunner = StepsRunner(config) + stepsRunner = StepsRunner(config, self.lineConveyor) stepsRunner.run(content) def getStepsContent(self, config): From 792722176993dd746602e9f12de6b6d59a5e99bc Mon Sep 17 00:00:00 2001 From: rzaitov Date: Tue, 5 Nov 2013 11:02:34 +0400 Subject: [PATCH 4/6] =?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=B5=D1=80=20?= =?UTF-8?q?=D0=BC=D0=B0=D0=BA=D1=80=D0=BE=D1=81=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/Tests/UnitTests/Macro/__init__.py | 1 + scripts/Tests/UnitTests/Macro/test_macro.py | 17 ++++++++++++++ scripts/utils/Macro.py | 26 +++++++++++++++++++++ 3 files changed, 44 insertions(+) create mode 100644 scripts/Tests/UnitTests/Macro/__init__.py create mode 100644 scripts/Tests/UnitTests/Macro/test_macro.py create mode 100644 scripts/utils/Macro.py diff --git a/scripts/Tests/UnitTests/Macro/__init__.py b/scripts/Tests/UnitTests/Macro/__init__.py new file mode 100644 index 0000000..cc31abc --- /dev/null +++ b/scripts/Tests/UnitTests/Macro/__init__.py @@ -0,0 +1 @@ +__author__ = 'rzaitov' diff --git a/scripts/Tests/UnitTests/Macro/test_macro.py b/scripts/Tests/UnitTests/Macro/test_macro.py new file mode 100644 index 0000000..18c496d --- /dev/null +++ b/scripts/Tests/UnitTests/Macro/test_macro.py @@ -0,0 +1,17 @@ +import unittest +from utils.Macro import Macro + + +class TestMacro(unittest.TestCase): + def setUp(self): + self.macroParser = Macro({}) + + def test_parseMacros(self): + line = 'hello {@this} is {@my_macro} and {@macro_with_numbers123}' + symbols = self.macroParser.getSymbols(line) + + self.assertEqual(3, len(symbols)) + self.assertTrue('this' in symbols) + self.assertTrue('my_macro' in symbols) + self.assertTrue('macro_with_numbers123' in symbols) + diff --git a/scripts/utils/Macro.py b/scripts/utils/Macro.py new file mode 100644 index 0000000..4279490 --- /dev/null +++ b/scripts/utils/Macro.py @@ -0,0 +1,26 @@ +import re + +class Macro: + def __init__(self, valueResolver): + assert valueResolver is not None + + self.__valueResolver = valueResolver + + def resolveLine(self, line): + assert line is not None + + symbols = self.getSymbols(line) + + def getSymbols(self, line): + assert line is not None + + symRegexp = r"{@(?P[\w]+)}" + regexp = re.compile(symRegexp) + + result = regexp.findall(line) + symbols = [] + if result is not None: + for r in result: + symbols.append(r) + + return symbols \ No newline at end of file From fedf7b624142b7b7921166cb2213e3e43e0657dc Mon Sep 17 00:00:00 2001 From: rzaitov Date: Tue, 5 Nov 2013 11:10:04 +0400 Subject: [PATCH 5/6] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D1=8B=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BC=D0=B0=D0=BA=D1=80?= =?UTF-8?q?=D0=BE=D1=81=D0=B0=20=D0=BF=D0=BE=20=D0=B8=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=20=D0=B8=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B8=20=D0=BF=D0=BE=20?= =?UTF-8?q?=D0=BC=D0=B0=D0=BA=D1=80=D0=BE=D1=81=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/Tests/UnitTests/Macro/test_macro.py | 13 ++++++++++++- scripts/utils/Macro.py | 16 ++++++++++------ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/scripts/Tests/UnitTests/Macro/test_macro.py b/scripts/Tests/UnitTests/Macro/test_macro.py index 18c496d..e77f99d 100644 --- a/scripts/Tests/UnitTests/Macro/test_macro.py +++ b/scripts/Tests/UnitTests/Macro/test_macro.py @@ -4,7 +4,7 @@ from utils.Macro import Macro class TestMacro(unittest.TestCase): def setUp(self): - self.macroParser = Macro({}) + self.macroParser = Macro() def test_parseMacros(self): line = 'hello {@this} is {@my_macro} and {@macro_with_numbers123}' @@ -15,3 +15,14 @@ class TestMacro(unittest.TestCase): self.assertTrue('my_macro' in symbols) self.assertTrue('macro_with_numbers123' in symbols) + def test_getName(self): + line = '{@macro_name}' + name = self.macroParser.getMacroName(line) + + self.assertEqual('macro_name', name) + + def test_getMacro(self): + line = 'some_name' + macro = self.macroParser.getMacroByName(line) + + self.assertEqual('{@some_name}', macro) \ No newline at end of file diff --git a/scripts/utils/Macro.py b/scripts/utils/Macro.py index 4279490..7d62e6d 100644 --- a/scripts/utils/Macro.py +++ b/scripts/utils/Macro.py @@ -1,15 +1,19 @@ import re class Macro: - def __init__(self, valueResolver): - assert valueResolver is not None + def __init__(self): + pass - self.__valueResolver = valueResolver + def getMacroByName(self, macroName): + assert macroName is not None - def resolveLine(self, line): - assert line is not None + return '{@' + macroName + '}' - symbols = self.getSymbols(line) + def getMacroName(self, macro): + assert macro.startswith('{@') + assert macro.endswith('}') + + return macro[2:-1] def getSymbols(self, line): assert line is not None From 10594d0b9bff7b31d15f7f69b41e31717335e52d Mon Sep 17 00:00:00 2001 From: rzaitov Date: Tue, 5 Nov 2013 13:00:37 +0400 Subject: [PATCH 6/6] =?UTF-8?q?=D1=80=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=BE=D0=B4=D1=81=D1=82=D0=B0=D0=BD?= =?UTF-8?q?=D0=BE=D0=B2=D0=BA=D1=83=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B9=20=D0=B8=D0=B7=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8?= =?UTF-8?q?=D0=B3=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/Core/LineConveyor/MacroResolver.py | 20 ++++++++++++++++ scripts/Core/StepsRunner.py | 7 +++--- scripts/IosSteps.txt | 14 +++++------ .../LineConveyor/test_macroResolver.py | 23 +++++++++++++++++++ scripts/Tests/UnitTests/Macro/test_macro.py | 8 +++---- scripts/commands/ValueProvider.py | 3 +-- scripts/settings.txt | 2 ++ scripts/taskRunner.py | 12 +++++++++- scripts/utils/{Macro.py => MacroProcessor.py} | 9 ++++---- 9 files changed, 76 insertions(+), 22 deletions(-) create mode 100644 scripts/Core/LineConveyor/MacroResolver.py create mode 100644 scripts/Tests/UnitTests/LineConveyor/test_macroResolver.py rename scripts/utils/{Macro.py => MacroProcessor.py} (71%) diff --git a/scripts/Core/LineConveyor/MacroResolver.py b/scripts/Core/LineConveyor/MacroResolver.py new file mode 100644 index 0000000..a57b5fe --- /dev/null +++ b/scripts/Core/LineConveyor/MacroResolver.py @@ -0,0 +1,20 @@ +class MacroResolver: + def __init__(self, macroProcessor, valueProvider): + assert macroProcessor is not None + assert valueProvider is not None + + self.macroProcessor = macroProcessor + self.valueProvider = valueProvider + + def processLine(self, line): + assert line is not None + + symbols = self.macroProcessor.getSymbols(line) + + for sym in symbols: + macro = self.macroProcessor.getMacroByName(sym) + value = self.valueProvider.getValueFor(sym) + + line = line.replace(macro, value) + + return line \ No newline at end of file diff --git a/scripts/Core/StepsRunner.py b/scripts/Core/StepsRunner.py index d106fcc..51e1d01 100644 --- a/scripts/Core/StepsRunner.py +++ b/scripts/Core/StepsRunner.py @@ -8,17 +8,16 @@ from CommandBuilders.PatchInfoplistCommandBuilder import PatchInfoplistCommandBu from CommandBuilders.RemoveProjectCommandBuilder import RemoveProjectCommandBuilder from CommandBuilders.RestoreBackupCommandBuilder import RestoreBackupCommandBuilder from CommandBuilders.ShCommandBuilder import ShCommandBuilder -from commands.ValueProvider import ValueProvider class StepsRunner: - def __init__(self, config, compositeLineProcessor): + def __init__(self, config, compositeLineProcessor, valueProvider): assert config is not None assert compositeLineProcessor is not None + assert valueProvider is not None self.lineConveyor = compositeLineProcessor - - self.valueProvider = ValueProvider(config) + self.valueProvider = valueProvider self.shCommandBuilder = ShCommandBuilder() self.removeProjectBuilder = RemoveProjectCommandBuilder() diff --git a/scripts/IosSteps.txt b/scripts/IosSteps.txt index 870290c..8ef53bc 100644 --- a/scripts/IosSteps.txt +++ b/scripts/IosSteps.txt @@ -1,22 +1,22 @@ +sh echo hello from '{@author}' + restore from backup create backup for 'BuildSample' inside 'BuildSample/BuildSample.sln' remove NotCompileApp project inside 'BuildSample/BuildSample/CoolApp.csproj' set OutputPath to 'Output' -inside 'BuildSample/BuildSample/Info.plist' set CFBundleVersion to '1.2.3' +inside 'BuildSample/BuildSample/Info.plist' set CFBundleVersion to '{@version}' inside 'BuildSample/BuildSample/Info.plist' set CFBundleDisplayName to 'CoolApp' copy 'BuildSample/BuildSample/Profiles/8F606DAE-F9C9-4A19-8EFF-34B990D76C28.mobileprovision' to '~/Library/MobileDevice/Provisioning Profiles/BuildScript.mobileprovision' -clean 'BuildSample/BuildSample.sln' for 'Release|iPhone' -build 'BuildSample/BuildSample.sln' for 'Release|iPhone' +clean 'BuildSample/BuildSample.sln' for '{@sln_config}' +build 'BuildSample/BuildSample.sln' for '{@sln_config}' create dirs 'Output/Appstore/Artifacts' -copy 'BuildSample/BuildSample/Output/BuildSample-1.2.3.ipa' to 'Output/Appstore/Artifacts' +copy 'BuildSample/BuildSample/Output/BuildSample-{@version}.ipa' to 'Output/Appstore/Artifacts' sh cp -a BuildSample/BuildSample/Output/ Output/Appstore/ restore from backup -delete backup - -sh echo hello from Rustam \ No newline at end of file +delete backup \ No newline at end of file diff --git a/scripts/Tests/UnitTests/LineConveyor/test_macroResolver.py b/scripts/Tests/UnitTests/LineConveyor/test_macroResolver.py new file mode 100644 index 0000000..019b5a1 --- /dev/null +++ b/scripts/Tests/UnitTests/LineConveyor/test_macroResolver.py @@ -0,0 +1,23 @@ +import unittest +from Core.LineConveyor.MacroResolver import MacroResolver +from commands.ValueProvider import ValueProvider +from utils.MacroProcessor import MacroProcessor + + +class TestMacroResolver(unittest.TestCase): + def setUp(self): + config = { + 'key1': 'hello world', + 'some_name': 'another name', + 'version': '1.2.3' + } + + macroProcessor = MacroProcessor() + valueProvider = ValueProvider(config) + self.macroResolver = MacroResolver(macroProcessor, valueProvider) + + def test_resolveLine(self): + line = '{@key1} bla {@some_name} version: {@version}' + newLine = self.macroResolver.processLine(line) + + self.assertEqual('hello world bla another name version: 1.2.3', newLine) \ No newline at end of file diff --git a/scripts/Tests/UnitTests/Macro/test_macro.py b/scripts/Tests/UnitTests/Macro/test_macro.py index e77f99d..dc89ac4 100644 --- a/scripts/Tests/UnitTests/Macro/test_macro.py +++ b/scripts/Tests/UnitTests/Macro/test_macro.py @@ -1,10 +1,10 @@ import unittest -from utils.Macro import Macro +from utils.MacroProcessor import MacroProcessor class TestMacro(unittest.TestCase): def setUp(self): - self.macroParser = Macro() + self.macroParser = MacroProcessor() def test_parseMacros(self): line = 'hello {@this} is {@my_macro} and {@macro_with_numbers123}' @@ -19,10 +19,10 @@ class TestMacro(unittest.TestCase): line = '{@macro_name}' name = self.macroParser.getMacroName(line) - self.assertEqual('macro_name', name) + self.assertEqual('@macro_name', name) def test_getMacro(self): - line = 'some_name' + line = '@some_name' macro = self.macroParser.getMacroByName(line) self.assertEqual('{@some_name}', macro) \ No newline at end of file diff --git a/scripts/commands/ValueProvider.py b/scripts/commands/ValueProvider.py index 8423cb9..bd5fea1 100644 --- a/scripts/commands/ValueProvider.py +++ b/scripts/commands/ValueProvider.py @@ -1,7 +1,6 @@ class ValueProvider: - def __init__(self, config): + def setConfig(self, config): assert config is not None - self.__config = config def getValueFor(self, link): diff --git a/scripts/settings.txt b/scripts/settings.txt index ae50dd1..8b5a24c 100644 --- a/scripts/settings.txt +++ b/scripts/settings.txt @@ -12,6 +12,8 @@ ios.steps = 'scripts/IosSteps.txt' ios.appstore.build_ready = 'true' ios.appstore.app_name = 'CoolApp' ios.appstore.sln_config = 'Release|iPhone' +ios.appstore.author = 'Rustam' +ios.appstore.version = '7.7.7' #ios.staging.build_ready = 'true' ios.staging.app_name = 'CoolApp staging' diff --git a/scripts/taskRunner.py b/scripts/taskRunner.py index 57494de..a58f578 100644 --- a/scripts/taskRunner.py +++ b/scripts/taskRunner.py @@ -1,9 +1,12 @@ import os from Core.LineConveyor.CommentRemover import CommentRemover from Core.LineConveyor.LineConveyor import LineConveyor +from Core.LineConveyor.MacroResolver import MacroResolver from Core.LineConveyor.Stripper import Stripper +from commands.ValueProvider import ValueProvider from utils.BuildConfigProvider import BuildConfigProvider from utils.FromFileSettingsProvider import FromFileSettingsProvider +from utils.MacroProcessor import MacroProcessor scriptFilePath = os.path.abspath(__file__) @@ -22,21 +25,28 @@ class TaskRunner: lineStripper = Stripper() commentRemover = CommentRemover() + + macroProcessor = MacroProcessor() + self.valueProvider = ValueProvider() + macroResolver = MacroResolver(macroProcessor, self.valueProvider) + self.lineConveyor = LineConveyor() self.lineConveyor.addProcessor(lineStripper) self.lineConveyor.addProcessor(commentRemover) + self.lineConveyor.addProcessor(macroResolver) def run(self): settings = self.settingsProvider.fetchSettings() buildReadyConfigs = self.configsProvider.getConfigs(settings) for bc in buildReadyConfigs: + self.valueProvider.setConfig(bc) self.runConfig(bc) def runConfig(self, config): content = self.getStepsContent(config) - stepsRunner = StepsRunner(config, self.lineConveyor) + stepsRunner = StepsRunner(config, self.lineConveyor, self.valueProvider) stepsRunner.run(content) def getStepsContent(self, config): diff --git a/scripts/utils/Macro.py b/scripts/utils/MacroProcessor.py similarity index 71% rename from scripts/utils/Macro.py rename to scripts/utils/MacroProcessor.py index 7d62e6d..911647d 100644 --- a/scripts/utils/Macro.py +++ b/scripts/utils/MacroProcessor.py @@ -1,24 +1,25 @@ import re -class Macro: +class MacroProcessor: def __init__(self): pass def getMacroByName(self, macroName): assert macroName is not None + assert macroName.startswith('@') - return '{@' + macroName + '}' + return '{' + macroName + '}' def getMacroName(self, macro): assert macro.startswith('{@') assert macro.endswith('}') - return macro[2:-1] + return macro[1:-1] def getSymbols(self, line): assert line is not None - symRegexp = r"{@(?P[\w]+)}" + symRegexp = r"{(?P@[\w]+)}" regexp = re.compile(symRegexp) result = regexp.findall(line)