From: Chris Lamb Date: Wed, 28 Oct 2009 13:03:26 +0000 (+0000) Subject: Split out parse_format to module-level and test it explicitly. X-Git-Url: https://git.decadent.org.uk/gitweb/?a=commitdiff_plain;h=b7d36f712210b0efac983da88ae91cdd3fd7f469;p=dak.git Split out parse_format to module-level and test it explicitly. Signed-off-by: Chris Lamb --- diff --git a/daklib/srcformats.py b/daklib/srcformats.py index 2b07c7ef..f3afb8db 100644 --- a/daklib/srcformats.py +++ b/daklib/srcformats.py @@ -5,6 +5,36 @@ from dak_exceptions import UnknownFormatError srcformats = [] +def parse_format(txt): + """ + Parse a .changes Format string into a tuple representation for easy + comparison. + + >>> parse_format('1.0') + (1, 0) + >>> parse_format('8.4 (hardy)') + (8, 4, 'hardy') + + If the format doesn't match these forms, raises UnknownFormatError. + """ + + format = re_verwithext.search(txt) + + if format is None: + raise UnknownFormatError, txt + + format = format.groups() + + if format[1] is None: + format = int(float(format[0])), 0, format[2] + else: + format = int(format[0]), int(format[1]), format[2] + + if format[2] is None: + format = format[:2] + + return format + class SourceFormat(type): def __new__(cls, name, bases, attrs): klass = super(SourceFormat, cls).__new__(cls, name, bases, attrs) @@ -27,25 +57,6 @@ class SourceFormat(type): if has[key]: yield "contains source files not allowed in format %s" % cls.name - @classmethod - def parse_format(cls, txt): - format = re_verwithext.search(txt) - - if format is None: - raise UnknownFormatError, txt - - format = format.groups() - - if format[1] is None: - format = int(float(format[0])), 0, format[2] - else: - format = int(format[0]), int(format[1]), format[2] - - if format[2] is None: - format = format[:2] - - return format - @classmethod def validate_format(cls, format, is_a_dsc=False, field='files'): if is_a_dsc: diff --git a/tests/test_srcformats.py b/tests/test_srcformats.py index 9c62d831..0ae18231 100755 --- a/tests/test_srcformats.py +++ b/tests/test_srcformats.py @@ -105,28 +105,27 @@ class FormatTreeQuiltTestCase(SourceFormatTestCase): ## -class ParseFormat(unittest.TestCase): - def assertFormat(self, input, expected, **kwargs): - format = srcformats.SourceFormat.parse_format(input) - self.assertEqual(format, expected) - srcformats.SourceFormat.validate_format(format, **kwargs) - - def assertInvalidFormat(self, input, **kwargs): - try: - format = srcformats.SourceFormat.parse_format(input) - srcformats.SourceFormat.validate_format(format, **kwargs) - except UnknownFormatError: - return +class ParseFormatTestCase(unittest.TestCase): + def assertParse(self, format, expected): + self.assertEqual(srcformats.parse_format(format), expected) + + def assertParseFail(self, format): + self.assertRaises( + UnknownFormatError, + lambda: srcformats.parse_format(format) + ) + + def testParse(self): + self.assertParse('1.0', (1, 0)) def testEmpty(self): - self.assertInvalidFormat('') - self.assertInvalidFormat(' ') - self.assertInvalidFormat(' ') - - def testBroken(self): - self.assertInvalidFormat('.0') - self.assertInvalidFormat('.1') - self.assertInvalidFormat('format') + self.assertParseFail('') + self.assertParseFail(' ') + self.assertParseFail(' ') + + def textText(self): + self.assertParse('1.2 (three)', (1, 2, 'three')) + self.assertParseFail('0.0 ()') class ParseSourceFormat(ParseFormat): def assertFormat(self, *args, **kwargs):