From cf255b7b1bd60f34a83a4188cb7298043d629bb3 Mon Sep 17 00:00:00 2001 From: rzaitov Date: Thu, 14 Nov 2013 19:59:12 +0400 Subject: [PATCH] =?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)