From 8a5ba62209b61253ccbb97f25f81bab19a9e8070 Mon Sep 17 00:00:00 2001 From: rzaitov Date: Fri, 1 Nov 2013 19:40:16 +0400 Subject: [PATCH] =?UTF-8?q?=D0=A0=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=80=D1=81=D0=B5=D1=80=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D1=8B?= =?UTF-8?q?=20=D0=BF=D1=83=D0=B1=D0=BB=D0=B8=D0=BA=D0=B0=D1=86=D0=B8=D0=B8?= =?UTF-8?q?=20=D0=B2=20=D1=82=D0=B5=D1=81=D1=82=D1=84=D0=BB=D0=B0=D0=B9?= =?UTF-8?q?=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UnitTests/TestflightParser/__init__.py | 1 + .../TestflightParser/test_testflightParser.py | 28 +++++++++++++ .../parser/BackupParser/CreateBackupParser.py | 2 +- scripts/parser/CleanBuildParser.py | 2 +- scripts/parser/CopyParser/CopyLineParser.py | 2 +- .../parser/InsideParser/InsideRemoveParser.py | 2 +- .../parser/InsideParser/InsideSetParser.py | 2 +- scripts/parser/LineParser.py | 8 +++- scripts/parser/MakeDirsParser.py | 2 +- scripts/parser/ShParser.py | 2 +- scripts/parser/TestflightParser.py | 41 +++++++++++++++++++ 11 files changed, 83 insertions(+), 9 deletions(-) create mode 100644 scripts/Tests/UnitTests/TestflightParser/__init__.py create mode 100644 scripts/Tests/UnitTests/TestflightParser/test_testflightParser.py create mode 100644 scripts/parser/TestflightParser.py diff --git a/scripts/Tests/UnitTests/TestflightParser/__init__.py b/scripts/Tests/UnitTests/TestflightParser/__init__.py new file mode 100644 index 0000000..cc31abc --- /dev/null +++ b/scripts/Tests/UnitTests/TestflightParser/__init__.py @@ -0,0 +1 @@ +__author__ = 'rzaitov' diff --git a/scripts/Tests/UnitTests/TestflightParser/test_testflightParser.py b/scripts/Tests/UnitTests/TestflightParser/test_testflightParser.py new file mode 100644 index 0000000..9b61ec2 --- /dev/null +++ b/scripts/Tests/UnitTests/TestflightParser/test_testflightParser.py @@ -0,0 +1,28 @@ +import unittest +from parser.TestflightParser import TestflightParser + + +class TesttestflightParser(unittest.TestCase): + def setUp(self): + self.parser = TestflightParser() + + def test_isValid(self): + line = 'publish bla bla' + isValid = self.parser.isValidLine(line) + + self.assertEqual(True, isValid) + + def test_isNotValid(self): + line = '*publish' + isValid = self.parser.isValidLine(line) + + self.assertEqual(False, isValid) + + def test_validInput(self): + line = "publish '~/Dir/another dir/file.ipa' to testflight notes = 'hello world! 123' api_token = 'qwerty123' team_token = 'asdfg123'" + result = self.parser.parseLine(line) + + self.assertEqual('~/Dir/another dir/file.ipa', result['path']) + self.assertEqual('hello world! 123', result['notes']) + self.assertEqual('qwerty123',result['api_token']) + self.assertEqual('asdfg123', result['team_token']) diff --git a/scripts/parser/BackupParser/CreateBackupParser.py b/scripts/parser/BackupParser/CreateBackupParser.py index c1c10ba..acf90ba 100644 --- a/scripts/parser/BackupParser/CreateBackupParser.py +++ b/scripts/parser/BackupParser/CreateBackupParser.py @@ -14,7 +14,7 @@ class CreateBackupParser(LineParser): folderNameRegexp = r"'(?P[^']+)'$" - regexpSource = self.startsWithKeywordToken('create backup for') + folderNameRegexp + regexpSource = self.startsWith('create backup for') + folderNameRegexp regexp = re.compile(regexpSource, re.UNICODE) match = regexp.match(line) diff --git a/scripts/parser/CleanBuildParser.py b/scripts/parser/CleanBuildParser.py index 3499d92..fc45994 100644 --- a/scripts/parser/CleanBuildParser.py +++ b/scripts/parser/CleanBuildParser.py @@ -16,7 +16,7 @@ class CleanBuildParser(LineParser): filePathRegexp = r"'(?P[./ a-zA-Z]+\.sln)'" slnConfigRegexp = r"'(?P[a-zA-Z|]+)'$" - regexpSource = self.startsWithKeywordToken(self.__commandToken) + filePathRegexp + self.keywordToken('for') + slnConfigRegexp + regexpSource = self.startsWith(self.__commandToken) + filePathRegexp + self.keywordToken('for') + slnConfigRegexp regexp = re.compile(regexpSource, re.UNICODE) match = regexp.match(line) diff --git a/scripts/parser/CopyParser/CopyLineParser.py b/scripts/parser/CopyParser/CopyLineParser.py index 7aa179a..4d77a66 100644 --- a/scripts/parser/CopyParser/CopyLineParser.py +++ b/scripts/parser/CopyParser/CopyLineParser.py @@ -15,7 +15,7 @@ class CopyLineParser(LineParser): srcFileNameRegexp = r"'(?P[^']+)'" dstFileNameRegexp = r"'(?P[^']+)'$" - regexpSource = self.startsWithKeywordToken('copy') + srcFileNameRegexp + self.keywordToken('to') + dstFileNameRegexp + regexpSource = self.startsWith('copy') + srcFileNameRegexp + self.keywordToken('to') + dstFileNameRegexp regexp = re.compile(regexpSource, re.UNICODE) match = regexp.match(line) diff --git a/scripts/parser/InsideParser/InsideRemoveParser.py b/scripts/parser/InsideParser/InsideRemoveParser.py index 97b0a73..e533c7a 100644 --- a/scripts/parser/InsideParser/InsideRemoveParser.py +++ b/scripts/parser/InsideParser/InsideRemoveParser.py @@ -16,7 +16,7 @@ class InsideRemoveParser(LineParser): filePathRegexp = r"'(?P[./ a-zA-Z]+\.{0})'".format(self.__extension) projectNameRegexp = r'(?P[.a-zA-Z]+)' - regexpSource = self.startsWithKeywordToken('inside') + filePathRegexp + self.keywordToken('remove') + projectNameRegexp + self.endsWithKeywordToken('project') + regexpSource = self.startsWith('inside') + filePathRegexp + self.keywordToken('remove') + projectNameRegexp + self.endsWith('project') regexp = re.compile(regexpSource, re.UNICODE) match = regexp.match(line) diff --git a/scripts/parser/InsideParser/InsideSetParser.py b/scripts/parser/InsideParser/InsideSetParser.py index c184137..1644a4d 100644 --- a/scripts/parser/InsideParser/InsideSetParser.py +++ b/scripts/parser/InsideParser/InsideSetParser.py @@ -18,7 +18,7 @@ class InsideSetParser(LineParser): keyRegexp = r'(?P[a-zA-Z]+)' valueRegexp = r"'(?P[^']+)'" - regexpSource = self.startsWithKeywordToken('inside') + filePathRegexp + self.keywordToken('set') + keyRegexp + self.keywordToken('to') + valueRegexp + regexpSource = self.startsWith('inside') + filePathRegexp + self.keywordToken('set') + keyRegexp + self.keywordToken('to') + valueRegexp regexp = re.compile(regexpSource, re.UNICODE) match = regexp.match(line) diff --git a/scripts/parser/LineParser.py b/scripts/parser/LineParser.py index d68196a..d04d475 100644 --- a/scripts/parser/LineParser.py +++ b/scripts/parser/LineParser.py @@ -14,14 +14,18 @@ class LineParser: assert keyword is not None return r'\s+' + keyword + r'\s+' - def startsWithKeywordToken(self, keyword): + def startsWith(self, keyword): assert keyword is not None return r'^' + keyword + r'\s+' - def endsWithKeywordToken(self, keyword): + def endsWith(self, keyword): assert keyword is not None return r'\s+' + keyword + '$' + def than(self, keyword): + assert keyword is not None + return keyword + r'\s+' + def _guardMatch(self, match_object, source, regexpSource = None): if match_object is None: msg = 'Recognition exception: "{0}" for "{1}"'.format(source, regexpSource) diff --git a/scripts/parser/MakeDirsParser.py b/scripts/parser/MakeDirsParser.py index 1886c31..2ec28ae 100644 --- a/scripts/parser/MakeDirsParser.py +++ b/scripts/parser/MakeDirsParser.py @@ -10,7 +10,7 @@ class MakeDirsParser(LineParser): def parseLine(self, line): pathRegexp = r"'(?P[^']+)'$" - regexpSource = self.startsWithKeywordToken('create dirs') + pathRegexp + regexpSource = self.startsWith('create dirs') + pathRegexp regexp = re.compile(regexpSource, re.UNICODE) match = regexp.match(line) diff --git a/scripts/parser/ShParser.py b/scripts/parser/ShParser.py index 4ef3050..4a65cdb 100644 --- a/scripts/parser/ShParser.py +++ b/scripts/parser/ShParser.py @@ -12,7 +12,7 @@ class ShParser(LineParser): cmdTextRegexp = r'(?P.*)' - regexpSource = self.startsWithKeywordToken('sh') + cmdTextRegexp + regexpSource = self.startsWith('sh') + cmdTextRegexp regexp = re.compile(regexpSource, re.UNICODE) match = regexp.match(line) diff --git a/scripts/parser/TestflightParser.py b/scripts/parser/TestflightParser.py new file mode 100644 index 0000000..8ba1d91 --- /dev/null +++ b/scripts/parser/TestflightParser.py @@ -0,0 +1,41 @@ +from parser.LineParser import LineParser +import re + +class TestflightParser(LineParser): + def __init__(self): + LineParser.__init__(self) + + def parseLine(self, line): + assert line is not None + + notesRegexp = r"'(?P[^']+)'" + apiTokenRegexp = r"'(?P[^']+)'" + teamTokenRegexp = r"'(?P[^']+)'" + filePathRegexp = r"'(?P[^']+)'" + + regexpSource = self.startsWith('publish') + filePathRegexp + self.keywordToken('to') + self.than('testflight') + \ + self.than('notes') + self.than('=') + notesRegexp + \ + self.keywordToken('api_token') + self.than('=') + apiTokenRegexp + \ + self.keywordToken('team_token') + self.than('=') + teamTokenRegexp + + regexp = re.compile(regexpSource, re.UNICODE) + + match = regexp.match(line) + self._guardMatch(match, line, regexpSource) + + path = match.group('path') + notes = match.group('notes') + apiToken = match.group('api_token') + teamToken = match.group('team_token') + + return { + 'path': path, + 'notes': notes, + 'api_token': apiToken, + 'team_token': teamToken + } + + def isValidLine(self, line): + assert line is not None + + return line.startswith('publish') \ No newline at end of file