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)