Merge branch 'BS-20'

This commit is contained in:
rzaitov 2013-11-05 14:22:47 +04:00
commit 9f9a75c317
18 changed files with 211 additions and 25 deletions

View File

@ -0,0 +1,10 @@
class CommentRemover:
def processLine(self, line):
assert line is not None
newLine = line
index = line.find('#')
if index >= 0:
newLine = line[:index]
return newLine

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,5 @@
class Stripper:
def processLine(self, line):
assert line is not None
return line.strip(' \t\n\r')

View File

@ -8,14 +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):
def __init__(self, config, compositeLineProcessor, valueProvider):
assert config is not None
assert compositeLineProcessor is not None
assert valueProvider is not None
self.valueProvider = ValueProvider(config)
self.lineConveyor = compositeLineProcessor
self.valueProvider = valueProvider
self.shCommandBuilder = ShCommandBuilder()
self.removeProjectBuilder = RemoveProjectCommandBuilder()
@ -36,14 +38,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):

1
scripts/Core/__init__.py Normal file
View File

@ -0,0 +1 @@
__author__ = 'rzaitov'

View File

@ -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
delete backup

View File

@ -0,0 +1 @@
__author__ = 'rzaitov'

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -0,0 +1 @@
__author__ = 'rzaitov'

View File

@ -0,0 +1,28 @@
import unittest
from utils.MacroProcessor import MacroProcessor
class TestMacro(unittest.TestCase):
def setUp(self):
self.macroParser = MacroProcessor()
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)
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)

View File

@ -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):

View File

@ -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'

View File

@ -1,6 +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__)
@ -9,27 +15,38 @@ baseDir = os.path.join(scriptDir, os.pardir)
os.chdir(baseDir)
from StepRunner.StepsRunner import StepsRunner
from Core.StepsRunner import StepsRunner
class TaskRunner:
def __init__(self):
pass
self.configsProvider = BuildConfigProvider()
self.settingsProvider = FromFileSettingsProvider()
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):
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.valueProvider.setConfig(bc)
self.runConfig(bc)
def runConfig(self, config):
content = self.getStepsContent(config)
stepsRunner = StepsRunner(config)
stepsRunner = StepsRunner(config, self.lineConveyor, self.valueProvider)
stepsRunner.run(content)
def getStepsContent(self, config):

View File

@ -0,0 +1,31 @@
import re
class MacroProcessor:
def __init__(self):
pass
def getMacroByName(self, macroName):
assert macroName is not None
assert macroName.startswith('@')
return '{' + macroName + '}'
def getMacroName(self, macro):
assert macro.startswith('{@')
assert macro.endswith('}')
return macro[1:-1]
def getSymbols(self, line):
assert line is not None
symRegexp = r"{(?P<symbol>@[\w]+)}"
regexp = re.compile(symRegexp)
result = regexp.findall(line)
symbols = []
if result is not None:
for r in result:
symbols.append(r)
return symbols