def test_project_line_parser_doesnt_consume_after_lf(self): from gpl.parsers import PROJECT_LINE # make sure that the parser does not consume after LF from gpl.Pysec import match self.assertEqual(' NEXTLINE', (PROJECT_LINE & match(' NEXTLINE')).parseString(project_line + LF + ' NEXTLINE'))
def test_project_line_parser_doesnt_consume_after_lf(self): from gpl.parsers import PROJECT_LINE # make sure that the parser does not consume after LF from gpl.Pysec import match self.assertEquals(' NEXTLINE', (PROJECT_LINE & match(' NEXTLINE')).parseString(project_line + LF + ' NEXTLINE'))
def test_copyright(self): from gpl.parsers import COPYRIGHT_SIGN self.assertTrue(COPYRIGHT_SIGN.parseString('Copyright (C)')) from gpl.parsers import Span self.assertEqual('2010', str(Span(2010))) self.assertEqual('2010-2012', str(Span(2010, 2012))) from gpl.parsers import YEAR_SPAN self.assertEqual(Span(2010, 2012), YEAR_SPAN.parseString('2010-2012')) self.assertEqual(Span(2010, 2010), YEAR_SPAN.parseString('2010')) from gpl.parsers import YEARS self.assertEqual(set([2010]), YEARS.parseString('2010')) self.assertEqual(set([2010, 2011]), YEARS.parseString('2010,2011')) self.assertEqual(set([2010, 2011, 2012]), YEARS.parseString('2010-2012')) self.assertEqual(set([2010, 2011, 2013, 2014, 2015, 2017]), YEARS.parseString('2010,2011,2013-2015,2017')) from gpl.parsers import AUTHOR_NAME self.assertEqual('Hello World', AUTHOR_NAME.parseString('Hello World')) self.assertEqual('Hello World', AUTHOR_NAME.parseString('Hello World <')) from gpl.parsers import AUTHOR_EMAIL self.assertEqual('*****@*****.**', AUTHOR_EMAIL.parseString('<*****@*****.**>')) from gpl.parsers import Author from gpl.parsers import AUTHOR self.assertEqual(Author('hong gil-dong', '*****@*****.**'), AUTHOR.parseString('hong gil-dong <*****@*****.**>')) self.assertEqual(Author('hong gil-dong'), (AUTHOR.parseString('hong gil-dong'))) self.assertEqual(Author(None, '*****@*****.**'), (AUTHOR.parseString('<*****@*****.**>'))) from gpl.parsers import AUTHORS self.assertEqual([Author('mete0r'), Author('hong gil-dong', '*****@*****.**')], AUTHORS.parseString('mete0r, hong gil-dong <*****@*****.**>')) from gpl.parsers import Copyright from gpl.parsers import COPYRIGHT_LINE # ok with LF self.assertEqual(Copyright(set([2010, 2011, 2012]), [Author('mete0r')]), (COPYRIGHT_LINE.parseString(copyright_line + LF))) # ok without LF self.assertEqual(Copyright(set([2010, 2011, 2012]), [Author('mete0r')]), (COPYRIGHT_LINE.parseString(copyright_line))) # make sure that the parser does not consume after the LF from gpl.Pysec import match self.assertEqual(' NEXTLINE', (COPYRIGHT_LINE & match(' NEXTLINE')).parseString(copyright_line + LF + ' NEXTLINE'))
def py_comment(parser): return inline_spaces & match('#') & parser
def skip_tailspace_of_line(parser): return skip_after(parser, inline_spaces & option(None, match('\n')))
return name, description def __str__(self): return self.name + (' : ' + self.description if self.description else '') alphabet = char_range('a', 'z') + char_range('A', 'Z') PROJECT_NAME = (group_chars([one_of(alphabet), many_chars(one_of(alphabet + char_range('0', '9') + '-_'), 1)]) >> lift(str.strip)) PROJECT_NAME = skip_after(PROJECT_NAME, option(None, inline_spaces)) PROJECT_DESC = until_one_of('\n') >> lift(str.strip) PROJECT_LINE = pair(PROJECT_NAME, option(None, match(':') & PROJECT_DESC)) PROJECT_LINE = PROJECT_LINE >> lift(lambda seq: Project(*seq)) PROJECT_LINE = skip_before(inline_spaces, PROJECT_LINE) PROJECT_LINE = skip_tailspace_of_line(PROJECT_LINE) COPYRIGHT_SIGN = match('Copyright (C)') class Span(Record('start', 'end')): @classmethod def prepare(cls, start, end=None): if end is None: end = start assert start <= end return start, end
def test_copyright(self): from gpl.parsers import COPYRIGHT_SIGN self.assertTrue(COPYRIGHT_SIGN.parseString('Copyright (C)')) from gpl.parsers import Span self.assertEquals('2010', str(Span(2010))) self.assertEquals('2010-2012', str(Span(2010, 2012))) from gpl.parsers import YEAR_SPAN self.assertEquals(Span(2010, 2012), YEAR_SPAN.parseString('2010-2012')) self.assertEquals(Span(2010, 2010), YEAR_SPAN.parseString('2010')) from gpl.parsers import YEARS self.assertEquals(set([2010]), YEARS.parseString('2010')) self.assertEquals(set([2010, 2011]), YEARS.parseString('2010,2011')) self.assertEquals(set([2010, 2011, 2012]), YEARS.parseString('2010-2012')) self.assertEquals(set([2010, 2011, 2013, 2014, 2015, 2017]), YEARS.parseString('2010,2011,2013-2015,2017')) from gpl.parsers import AUTHOR_NAME self.assertEquals('Hello World', AUTHOR_NAME.parseString('Hello World')) self.assertEquals('Hello World', AUTHOR_NAME.parseString('Hello World <')) from gpl.parsers import AUTHOR_EMAIL self.assertEquals('*****@*****.**', AUTHOR_EMAIL.parseString('<*****@*****.**>')) from gpl.parsers import Author from gpl.parsers import AUTHOR self.assertEquals( Author('hong gil-dong', '*****@*****.**'), AUTHOR.parseString('hong gil-dong <*****@*****.**>')) self.assertEquals(Author('hong gil-dong'), (AUTHOR.parseString('hong gil-dong'))) self.assertEquals(Author(None, '*****@*****.**'), (AUTHOR.parseString('<*****@*****.**>'))) from gpl.parsers import AUTHORS self.assertEquals( [Author('mete0r'), Author('hong gil-dong', '*****@*****.**')], AUTHORS.parseString('mete0r, hong gil-dong <*****@*****.**>')) from gpl.parsers import Copyright from gpl.parsers import COPYRIGHT_LINE # ok with LF self.assertEquals( Copyright(set([2010, 2011, 2012]), [Author('mete0r')]), (COPYRIGHT_LINE.parseString(copyright_line + LF))) # ok without LF self.assertEquals( Copyright(set([2010, 2011, 2012]), [Author('mete0r')]), (COPYRIGHT_LINE.parseString(copyright_line))) # make sure that the parser does not consume after the LF from gpl.Pysec import match self.assertEquals(' NEXTLINE', (COPYRIGHT_LINE & match(' NEXTLINE')).parseString(copyright_line + LF + ' NEXTLINE'))
description = description.strip() return name, description def __str__(self): return self.name + (' : ' + self.description if self.description else '') alphabet = char_range('a', 'z') + char_range('A', 'Z') PROJECT_NAME = (group_chars([ one_of(alphabet), many_chars(one_of(alphabet + char_range('0', '9') + '-_'), 1) ]) >> lift(str.strip)) PROJECT_NAME = skip_after(PROJECT_NAME, option(None, inline_spaces)) PROJECT_DESC = until_one_of('\n') >> lift(str.strip) PROJECT_LINE = pair(PROJECT_NAME, option(None, match(':') & PROJECT_DESC)) PROJECT_LINE = PROJECT_LINE >> lift(lambda seq: Project(*seq)) PROJECT_LINE = skip_before(inline_spaces, PROJECT_LINE) PROJECT_LINE = skip_tailspace_of_line(PROJECT_LINE) COPYRIGHT_SIGN = match('Copyright (C)') class Span(Record('start', 'end')): @classmethod def prepare(cls, start, end=None): if end is None: end = start assert start <= end return start, end