diff --git a/scripts/TouchinBuild/CommandBuilders/PatchManifestCommandBuilder.py b/scripts/TouchinBuild/CommandBuilders/PatchManifestCommandBuilder.py new file mode 100644 index 0000000..97f0e79 --- /dev/null +++ b/scripts/TouchinBuild/CommandBuilders/PatchManifestCommandBuilder.py @@ -0,0 +1,24 @@ +from commands.PatchManifestCommand import PatchManifestCommand +from parsers.InsideParser.InsideSetParser import InsideSetParser + + +class PatchManifestCommandBuilder: + def __init__(self): + pass + + def isManifestCommand(self, line): + assert line is not None + + parser = InsideSetParser('xml') + isValid = parser.isValidLine(line) + + return isValid + + def getCommandFor(self, line): + assert line is not None + + parser = InsideSetParser('xml') + result = parser.parseLine(line) + + command = PatchManifestCommand(result[0], result[1], result[2]) + return command diff --git a/scripts/TouchinBuild/Tests/ManualTests/macros_include_test.py b/scripts/TouchinBuild/Tests/ManualTests/macros_include_test.py index a3c03d9..faa20a7 100644 --- a/scripts/TouchinBuild/Tests/ManualTests/macros_include_test.py +++ b/scripts/TouchinBuild/Tests/ManualTests/macros_include_test.py @@ -47,6 +47,6 @@ contentProvider = ContentProviderMock() buildConfigProvider = BuildConfigProvider() preprocessor = NullPreprocessor() -taskRunner = TaskRunner(settingsProvider, contentProvider, buildConfigProvider, preprocessor) +taskRunner = TaskRunner(settingsProvider, contentProvider, buildConfigProvider, preprocessor, {}) taskRunner.run() diff --git a/scripts/TouchinBuild/Tests/ManualTests/manifest_test.py b/scripts/TouchinBuild/Tests/ManualTests/manifest_test.py new file mode 100644 index 0000000..996528f --- /dev/null +++ b/scripts/TouchinBuild/Tests/ManualTests/manifest_test.py @@ -0,0 +1,8 @@ +from CommandBuilders.PatchManifestCommandBuilder import PatchManifestCommandBuilder + +line = "inside 'BuildSample/DroidApp/Properties/AndroidManifest.xml' set android:versionCode to '7.7.7'" + +builder = PatchManifestCommandBuilder() + +command = builder.getCommandFor(line) +command.execute() diff --git a/scripts/TouchinBuild/Tests/ManualTests/resolve_settings.py b/scripts/TouchinBuild/Tests/ManualTests/resolve_settings.py index b60aa96..189599c 100644 --- a/scripts/TouchinBuild/Tests/ManualTests/resolve_settings.py +++ b/scripts/TouchinBuild/Tests/ManualTests/resolve_settings.py @@ -40,7 +40,7 @@ resolvedBuildConfigProvider = ResolvedBuildConfigProvider(buildConfigProvider) contentProvider = ContentProviderMock() preprocessor = NullPreprocessor() -taskRunner = TaskRunner(settingsProvider, contentProvider, resolvedBuildConfigProvider, preprocessor) +taskRunner = TaskRunner(settingsProvider, contentProvider, resolvedBuildConfigProvider, preprocessor, {}) taskRunner.run() diff --git a/scripts/TouchinBuild/Tests/UnitTests/XmlParcher/__init__.py b/scripts/TouchinBuild/Tests/UnitTests/XmlParcher/__init__.py new file mode 100644 index 0000000..cc31abc --- /dev/null +++ b/scripts/TouchinBuild/Tests/UnitTests/XmlParcher/__init__.py @@ -0,0 +1 @@ +__author__ = 'rzaitov' diff --git a/scripts/TouchinBuild/Tests/UnitTests/XmlParcher/test_manifestPatcher.py b/scripts/TouchinBuild/Tests/UnitTests/XmlParcher/test_manifestPatcher.py new file mode 100644 index 0000000..1015a8d --- /dev/null +++ b/scripts/TouchinBuild/Tests/UnitTests/XmlParcher/test_manifestPatcher.py @@ -0,0 +1,25 @@ +import unittest +from utils.ManifestPatcher import ManifestPatcher + + +class TestManifestPatcher(unittest.TestCase): + def setUp(self): + self.patcher = ManifestPatcher('somePath') + + def test_parseRawName(self): + nameInfo1 = self.patcher.parseRawName('simpleName') + self.assertEqual(None, nameInfo1['prefix']) + self.assertEqual('simpleName', nameInfo1['original_name']) + + nameInfo2 = self.patcher.parseRawName('prefix:originalName') + self.assertEqual('prefix', nameInfo2['prefix']) + self.assertEqual('originalName', nameInfo2['original_name']) + + def test_fetchName(self): + nameInfo = { + 'prefix': 'android', + 'original_name': 'MyName' + } + + name = self.patcher.fetchName(nameInfo) + self.assertEqual('{http://schemas.android.com/apk/res/android}MyName', name) \ No newline at end of file diff --git a/scripts/TouchinBuild/Tests/UnitTests/XmlParcher/test_xmlPatcher.py b/scripts/TouchinBuild/Tests/UnitTests/XmlParcher/test_xmlPatcher.py new file mode 100644 index 0000000..53f54e3 --- /dev/null +++ b/scripts/TouchinBuild/Tests/UnitTests/XmlParcher/test_xmlPatcher.py @@ -0,0 +1,11 @@ +import unittest +from utils.XmlPatcher import XmlPatcher + + +class TestXmlPatcher(unittest.TestCase): + def setUp(self): + self.patcher = XmlPatcher('somePath') + + def test_getNameWithNs(self): + name = self.patcher.getNameWithNs('OriginalName', 'http://namespace') + self.assertEqual('{http://namespace}OriginalName', name) diff --git a/scripts/TouchinBuild/commands/PatchManifestCommand.py b/scripts/TouchinBuild/commands/PatchManifestCommand.py new file mode 100644 index 0000000..5b1dbab --- /dev/null +++ b/scripts/TouchinBuild/commands/PatchManifestCommand.py @@ -0,0 +1,20 @@ +from commands.CommandBase import CommandBase +from utils.ManifestPatcher import ManifestPatcher + + +class PatchManifestCommand(CommandBase): + def __init__(self, pathToManifest, key, value): + CommandBase.__init__(self) + + assert pathToManifest is not None + assert key is not None + assert value is not None + + self.pathToManifest = pathToManifest + self.key = key + self.value = value + + def execute(self): + patcher = ManifestPatcher(self.pathToManifest) + + patcher.AddOrReplaceManifestAtr(self.key, self.value) diff --git a/scripts/TouchinBuild/parsers/InsideParser/InsideSetParser.py b/scripts/TouchinBuild/parsers/InsideParser/InsideSetParser.py index aadf89d..99d8b06 100644 --- a/scripts/TouchinBuild/parsers/InsideParser/InsideSetParser.py +++ b/scripts/TouchinBuild/parsers/InsideParser/InsideSetParser.py @@ -19,7 +19,7 @@ class InsideSetParser(InsideParserBase): def getMatchInfo(self, line): assert line is not None - keyRegexp = r'(?P[a-zA-Z]+)' + keyRegexp = r'(?P\S+)' valueRegexp = r"'(?P[^']+)'$" rb = RegexpBuilder() diff --git a/scripts/TouchinBuild/run_manual_tests.py b/scripts/TouchinBuild/run_manual_tests.py index 20deb9d..de6aae9 100644 --- a/scripts/TouchinBuild/run_manual_tests.py +++ b/scripts/TouchinBuild/run_manual_tests.py @@ -24,5 +24,6 @@ print 'current working dir: {0}'.format(baseDirAbsPath) #import Tests.ManualTests.install_profile #import Tests.ManualTests.macros_include_test #import Tests.ManualTests.resolve_settings +#import Tests.ManualTests.infoPlistMultipleValues_test -import Tests.ManualTests.infoPlistMultipleValues_test \ No newline at end of file +import Tests.ManualTests.manifest_test \ No newline at end of file diff --git a/scripts/TouchinBuild/utils/ManifestPatcher.py b/scripts/TouchinBuild/utils/ManifestPatcher.py new file mode 100644 index 0000000..adb8e97 --- /dev/null +++ b/scripts/TouchinBuild/utils/ManifestPatcher.py @@ -0,0 +1,55 @@ +from utils.XmlPatcher import XmlPatcher + +class ManifestPatcher(XmlPatcher): + def __init__(self, manifestPath): + assert manifestPath is not None + + XmlPatcher.__init__(self, manifestPath) + + self.androidNs = "http://schemas.android.com/apk/res/android" + self.androidNsPrefix = 'android' + + self.namespaces[self.androidNsPrefix] = self.androidNs + self.regNamespace(self.androidNsPrefix, self.androidNs) + + def AddOrReplaceManifestAtr(self, rawAtrName, atrValue): + assert rawAtrName is not None + assert atrValue is not None + + tree = self.parse() + manifestElement = tree.getroot() + + name = self.fetchNameByRawName(rawAtrName) + manifestElement.set(name, atrValue) + + self.write(tree) + + def fetchNameByRawName(self, rawName): + nameInfo = self.parseRawName(rawName) + name = self.fetchName(nameInfo) + + return name + + def parseRawName(self, rawName): + """rawName=(nsPrefix:)?OriginalName + """ + + result = rawName.split(':') + prefixExists = len(result) > 1 + + nameInfo = { + 'prefix': result[0] if prefixExists else None, + 'original_name': result[1] if prefixExists else result[0] + } + + return nameInfo + + def fetchName(self, nameInfo): + assert nameInfo is not None + + nsPrefix = nameInfo['prefix'] + origName = nameInfo['original_name'] + + namespace = self.namespaces.get(nsPrefix, None) + name = self.getNameWithNs(origName, namespace) if nsPrefix else origName + return name \ No newline at end of file diff --git a/scripts/TouchinBuild/utils/XmlPatcher.py b/scripts/TouchinBuild/utils/XmlPatcher.py new file mode 100644 index 0000000..356b86f --- /dev/null +++ b/scripts/TouchinBuild/utils/XmlPatcher.py @@ -0,0 +1,27 @@ +import xml.etree.ElementTree as eT + +class XmlPatcher: + def __init__(self, path): + assert path is not None + + self.path = path + self.namespaces = {} + + def parse(self): + return eT.parse(self.path) + + def write(self, tree): + tree.write(self.path, xml_declaration=True, encoding="UTF-8", method="xml") + + def regNamespace(self, nsKey, nsValue): + assert nsKey is not None + assert nsValue is not None + + eT.register_namespace(nsKey, nsValue) + + def getNameWithNs(self, originalName, namespace): + assert originalName is not None + assert namespace is not None + + # {someNamespace}OriginalName + return '{{{0}}}{1}'.format(namespace, originalName)