From f46c5e0c785c8051436a78130045b262d657b14c Mon Sep 17 00:00:00 2001 From: rzaitov Date: Thu, 14 Nov 2013 17:24:26 +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=BC=D0=BC=D0=B0=D0=BD=D0=B4=D1=83?= =?UTF-8?q?=20=D0=BF=D0=B0=D1=82=D1=87=D0=B8=D0=BD=D0=B3=D0=B0=20=D0=B0?= =?UTF-8?q?=D0=BD=D0=B4=D1=80=D0=BE=D0=B8=D0=B4=20=D0=BC=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=84=D0=B5=D1=81=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PatchManifestCommandBuilder.py | 24 +++++++++++++++++++ .../Tests/ManualTests/manifest_test.py | 8 +++++++ .../commands/PatchManifestCommand.py | 20 ++++++++++++++++ scripts/TouchinBuild/utils/ManifestPatcher.py | 16 +++++++++++++ 4 files changed, 68 insertions(+) create mode 100644 scripts/TouchinBuild/CommandBuilders/PatchManifestCommandBuilder.py create mode 100644 scripts/TouchinBuild/Tests/ManualTests/manifest_test.py create mode 100644 scripts/TouchinBuild/commands/PatchManifestCommand.py create mode 100644 scripts/TouchinBuild/utils/ManifestPatcher.py 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/manifest_test.py b/scripts/TouchinBuild/Tests/ManualTests/manifest_test.py new file mode 100644 index 0000000..493a174 --- /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 '777'" + +builder = PatchManifestCommandBuilder() + +command = builder.getCommandFor(line) +command.execute() 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/utils/ManifestPatcher.py b/scripts/TouchinBuild/utils/ManifestPatcher.py new file mode 100644 index 0000000..83a052d --- /dev/null +++ b/scripts/TouchinBuild/utils/ManifestPatcher.py @@ -0,0 +1,16 @@ +import xml.etree.ElementTree as eT + + +class ManifestPatcher: + def __init__(self, manifestPath): + assert manifestPath is not None + + self.manifestPath = manifestPath + + def AddOrReplaceManifestAtr(self, atrName, atrValue): + tree = eT.parse(self.manifestPath) + manifestElement = tree.getroot().find('manifest') + + manifestElement.attrib[atrName] = atrValue + + tree.write(self.manifestPath, xml_declaration=True, encoding='UTF-8', method="xml") \ No newline at end of file From cf255b7b1bd60f34a83a4188cb7298043d629bb3 Mon Sep 17 00:00:00 2001 From: rzaitov Date: Thu, 14 Nov 2013 19:59:12 +0400 Subject: [PATCH 2/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=B0=D1=82=D1=87=D0=B8=D0=BD=D0=B3?= =?UTF-8?q?=20manifest=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Tests/ManualTests/manifest_test.py | 2 +- .../parsers/InsideParser/InsideSetParser.py | 2 +- scripts/TouchinBuild/run_manual_tests.py | 3 +- scripts/TouchinBuild/utils/ManifestPatcher.py | 57 ++++++++++++++++--- scripts/TouchinBuild/utils/XmlPatcher.py | 27 +++++++++ 5 files changed, 79 insertions(+), 12 deletions(-) create mode 100644 scripts/TouchinBuild/utils/XmlPatcher.py diff --git a/scripts/TouchinBuild/Tests/ManualTests/manifest_test.py b/scripts/TouchinBuild/Tests/ManualTests/manifest_test.py index 493a174..996528f 100644 --- a/scripts/TouchinBuild/Tests/ManualTests/manifest_test.py +++ b/scripts/TouchinBuild/Tests/ManualTests/manifest_test.py @@ -1,6 +1,6 @@ from CommandBuilders.PatchManifestCommandBuilder import PatchManifestCommandBuilder -line = "inside 'BuildSample/DroidApp/Properties/AndroidManifest.xml' set android:versionCode to '777'" +line = "inside 'BuildSample/DroidApp/Properties/AndroidManifest.xml' set android:versionCode to '7.7.7'" builder = PatchManifestCommandBuilder() 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 index 83a052d..4520f40 100644 --- a/scripts/TouchinBuild/utils/ManifestPatcher.py +++ b/scripts/TouchinBuild/utils/ManifestPatcher.py @@ -1,16 +1,55 @@ -import xml.etree.ElementTree as eT +from utils.XmlPatcher import XmlPatcher - -class ManifestPatcher: +class ManifestPatcher(XmlPatcher): def __init__(self, manifestPath): assert manifestPath is not None - self.manifestPath = manifestPath + XmlPatcher.__init__(self, manifestPath) - def AddOrReplaceManifestAtr(self, atrName, atrValue): - tree = eT.parse(self.manifestPath) - manifestElement = tree.getroot().find('manifest') + self.androidNs = "http://schemas.android.com/apk/res/android" + self.androidNsPrefix = 'android' - manifestElement.attrib[atrName] = atrValue + self.namespaces[self.androidNsPrefix] = self.androidNs + self.regNamespace(self.androidNsPrefix, self.androidNs) - tree.write(self.manifestPath, xml_declaration=True, encoding='UTF-8', method="xml") \ No newline at end of file + 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) > 0 + + atrInfo = { + 'prefix': result[0] if prefixExists else None, + 'original_name': result[1] + } + + return atrInfo + + 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) From b183e05da0c5340c1827515b48d82c25d6a99b17 Mon Sep 17 00:00:00 2001 From: rzaitov Date: Thu, 14 Nov 2013 20:08:44 +0400 Subject: [PATCH 3/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=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8=20=D1=84=D0=BE=D1=80=D0=BC?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=20=D1=81=20namespace=20=D0=BF=D1=80=D0=B5=D1=84?= =?UTF-8?q?=D0=B8=D0=BA=D1=81=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Tests/UnitTests/XmlParcher/__init__.py | 1 + .../Tests/UnitTests/XmlParcher/test_xmlPatcher.py | 11 +++++++++++ 2 files changed, 12 insertions(+) create mode 100644 scripts/TouchinBuild/Tests/UnitTests/XmlParcher/__init__.py create mode 100644 scripts/TouchinBuild/Tests/UnitTests/XmlParcher/test_xmlPatcher.py 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_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) From a333991516b92d62727c2edc711f8adb515203ce Mon Sep 17 00:00:00 2001 From: rzaitov Date: Thu, 14 Nov 2013 20:16:36 +0400 Subject: [PATCH 4/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=20Manifest=20?= =?UTF-8?q?=D0=BF=D0=B0=D1=82=D1=87=D0=B5=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UnitTests/XmlParcher/test_manifestPatcher.py | 16 ++++++++++++++++ scripts/TouchinBuild/utils/ManifestPatcher.py | 4 ++-- 2 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 scripts/TouchinBuild/Tests/UnitTests/XmlParcher/test_manifestPatcher.py 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..de75c4f --- /dev/null +++ b/scripts/TouchinBuild/Tests/UnitTests/XmlParcher/test_manifestPatcher.py @@ -0,0 +1,16 @@ +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']) diff --git a/scripts/TouchinBuild/utils/ManifestPatcher.py b/scripts/TouchinBuild/utils/ManifestPatcher.py index 4520f40..650eccd 100644 --- a/scripts/TouchinBuild/utils/ManifestPatcher.py +++ b/scripts/TouchinBuild/utils/ManifestPatcher.py @@ -35,11 +35,11 @@ class ManifestPatcher(XmlPatcher): """ result = rawName.split(':') - prefixExists = len(result) > 0 + prefixExists = len(result) > 1 atrInfo = { 'prefix': result[0] if prefixExists else None, - 'original_name': result[1] + 'original_name': result[1] if prefixExists else result[0] } return atrInfo From 0745de4f201d91c256c54ad23d965b032afb0e40 Mon Sep 17 00:00:00 2001 From: rzaitov Date: Thu, 14 Nov 2013 20:21:50 +0400 Subject: [PATCH 5/6] =?UTF-8?q?=D0=B5=D1=89=D0=B5=20=D0=BE=D0=B4=D0=B8?= =?UTF-8?q?=D0=BD=20=D1=82=D0=B5=D1=81=D1=82=20=D0=BD=D0=B0=20=D1=84=D0=BE?= =?UTF-8?q?=D1=80=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B8=D0=BC=D0=B5=D0=BD=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Tests/UnitTests/XmlParcher/test_manifestPatcher.py | 9 +++++++++ scripts/TouchinBuild/utils/ManifestPatcher.py | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/scripts/TouchinBuild/Tests/UnitTests/XmlParcher/test_manifestPatcher.py b/scripts/TouchinBuild/Tests/UnitTests/XmlParcher/test_manifestPatcher.py index de75c4f..1015a8d 100644 --- a/scripts/TouchinBuild/Tests/UnitTests/XmlParcher/test_manifestPatcher.py +++ b/scripts/TouchinBuild/Tests/UnitTests/XmlParcher/test_manifestPatcher.py @@ -14,3 +14,12 @@ class TestManifestPatcher(unittest.TestCase): 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/utils/ManifestPatcher.py b/scripts/TouchinBuild/utils/ManifestPatcher.py index 650eccd..adb8e97 100644 --- a/scripts/TouchinBuild/utils/ManifestPatcher.py +++ b/scripts/TouchinBuild/utils/ManifestPatcher.py @@ -37,12 +37,12 @@ class ManifestPatcher(XmlPatcher): result = rawName.split(':') prefixExists = len(result) > 1 - atrInfo = { + nameInfo = { 'prefix': result[0] if prefixExists else None, 'original_name': result[1] if prefixExists else result[0] } - return atrInfo + return nameInfo def fetchName(self, nameInfo): assert nameInfo is not None From 65cc1541857262324e14422512badccbac760b2d Mon Sep 17 00:00:00 2001 From: rzaitov Date: Thu, 14 Nov 2013 20:27:25 +0400 Subject: [PATCH 6/6] =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BF=D1=80=D0=B5=D0=B4=D1=83=D0=BF=D1=80=D0=B5=D0=B6?= =?UTF-8?q?=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F=20code=20inspect?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/TouchinBuild/Tests/ManualTests/macros_include_test.py | 2 +- scripts/TouchinBuild/Tests/ManualTests/resolve_settings.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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/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()