예제 #1
0
    def test_date(self):

        g = IMAPFilterGenerator()
        ctx = {'date': datetime(2015, 11, 15)}
        p = SimpleEvaluator(ctx)
        t = "date = 2015-11-15"
        self.assertEqual(g.parse(t), "ON 15-Nov-2015")
        self.assertTrue(p.parse(t))

        t = "date < 2015-11-14"
        self.assertEqual(g.parse(t), 'BEFORE 14-Nov-2015')
        self.assertFalse(p.parse(t))

        t = "date > 2015-11-14"
        self.assertEqual(g.parse(t),
                         '(OR SINCE 14-Nov-2015 NOT (ON 14-Nov-2015))')
        self.assertTrue(p.parse(t))

        t = "date <= 2015-11-15"
        self.assertEqual(g.parse(t), '(OR BEFORE 15-Nov-2015 ON 15-Nov-2015)')
        self.assertTrue(p.parse(t))

        t = "date >= 2015-11-15"
        self.assertEqual(g.parse(t), 'SINCE 15-Nov-2015')
        self.assertTrue(p.parse(t))

        p = SimpleEvaluator({'date': datetime(2015, 11, 15, 15, 10)})
        t = "date <= 2015-11-15"
        self.assertEqual(g.parse(t), '(OR BEFORE 15-Nov-2015 ON 15-Nov-2015)')
        self.assertTrue(p.parse(t))
예제 #2
0
    def test(self):
        p = SimpleEvaluator({
            'flags':
            TagList(['quick', 'BROWN', 'fox', 'JUMPS', 'over', 'LAZY', 'dog'])
        })

        self.assertTrue(p.parse('flags = "over" & flags= "brown"'))
        self.assertTrue(p.parse('flags~="row" & flags^="jump" & flags$="zy"'))
예제 #3
0
    def test_imap(self):
        g = IMAPFilterGenerator()
        p = SimpleEvaluator(CONTEXT)
        t1 = 'to ~= "myself"'
        self.assertEqual(g.parse(t1), 'TO "myself"')
        self.assertTrue(p.parse(t1))

        t1 = 'to ^= "myself"'
        self.assertEqual(g.parse(t1), 'TO "myself"')
        t1 = 'to $= "myself"'
        self.assertEqual(g.parse(t1), 'TO "myself"')

        t2 = 'mime = "image/png"'
        self.assertEqual(g.parse(t2), '')
        self.assertTrue(p.parse(t2))

        t3 = 'to = "myself"'
        self.assertEqual(g.parse(t3), 'TO "myself"')
        self.assertFalse(p.parse(t3))

        t4 = 'to ~= "myself" & subject ~= "test"'
        self.assertEqual(g.parse(t4), '(TO "myself" SUBJECT "test")')
        self.assertTrue(p.parse(t4))

        t5 = 'to ~= "myself" | subject ~= "test"'
        self.assertEqual(g.parse(t5), '(OR TO "myself" SUBJECT "test")')
        self.assertTrue(p.parse(t5))

        t6 = 'to ~= "myself" & mime ~= "image"'
        self.assertEqual(g.parse(t6), 'TO "myself"')
        self.assertTrue(p.parse(t6))

        t7 = 'mime~="image" & subject ~= "test"'
        self.assertEqual(g.parse(t7), 'SUBJECT "test"')
        self.assertTrue(p.parse(t7))
예제 #4
0
    def test_custom_flags(self):
        g = IMAPFilterGenerator(unsafe=True)
        ctx = {'flags': TagList(['$Forwarded', 'NotJunk'])}
        p = SimpleEvaluator(ctx)
        t = 'flags = "$Forwarded"'
        self.assertEqual(g.parse(t), 'KEYWORD "$Forwarded"')
        self.assertTrue(p.parse(t))

        t = 'flags ^= "$Forwarded"'
        self.assertEqual(g.parse(t), '')
        self.assertTrue(p.parse(t))
예제 #5
0
    def test_text(self):
        g = IMAPFilterGenerator(unsafe=True)
        ctx = {'mime': 'application/pdf', 'name': 'soubor.pdf'}
        p = SimpleEvaluator(ctx)
        t = 'mime="application/pdf" & name ~= "soubor"'
        self.assertEqual(g.parse(t), '(TEXT "application/pdf" TEXT "soubor")')
        self.assertTrue(p.parse(t))

        t = 'mime^="application" & name $= ".pdf"'
        self.assertEqual(g.parse(t), '(TEXT "application" TEXT ".pdf")')
        self.assertTrue(p.parse(t))
예제 #6
0
 def test_custom_flags(self):
     g=IMAPFilterGenerator(unsafe=True)
     ctx={'flags':TagList(['$Forwarded', 'NotJunk'])}
     p=SimpleEvaluator(ctx)
     t='flags = "$Forwarded"'
     self.assertEqual(g.parse(t), 'KEYWORD "$Forwarded"')
     self.assertTrue(p.parse(t))
     
     t='flags ^= "$Forwarded"'
     self.assertEqual(g.parse(t), '')
     self.assertTrue(p.parse(t))
예제 #7
0
 def test_text(self):
     g=IMAPFilterGenerator(unsafe=True)
     ctx={'mime':'application/pdf', 'name':'soubor.pdf'}
     p=SimpleEvaluator(ctx)
     t='mime="application/pdf" & name ~= "soubor"'
     self.assertEqual(g.parse(t), '(TEXT "application/pdf" TEXT "soubor")')
     self.assertTrue(p.parse(t))
     
     t='mime^="application" & name $= ".pdf"'
     self.assertEqual(g.parse(t), '(TEXT "application" TEXT ".pdf")')
     self.assertTrue(p.parse(t))
예제 #8
0
 def test_8(self):
     p=SimpleEvaluator({"number":100, 'date':datetime(2015,11,15), 'adate': datetime(2015,11,15,9,5)})
     
     self.assertFalse(p.parse("number < 9"))
     self.assertTrue(p.parse("number < 200"))
     self.assertTrue(p.parse("date < 2015-12-01"))
     self.assertTrue(p.parse("date < 2015-12-1"))
     self.assertFalse(p.parse("date < 2015-1-1"))
     self.assertTrue(p.parse("adate < 2015-11-15 9:10"))
     self.assertFalse(p.parse("adate < 2015-11-15 9:01"))
     
     self.assertTrue(p.parse("number < 200 & adate < 2015-11-15 9:10"))
예제 #9
0
 def test_notimap(self):
     g=IMAPFilterGenerator()
     ctx={'mime':'text/plain', 'date': datetime(2015,10,13), 'year':2015, 'subject':'mako','section':'1.1'}
     p=SimpleEvaluator(ctx)
     t='(section="1" | section~="1.")'
     self.assertEqual(g.parse(t), '')
     self.assertEqual(g.parse(t, serialize='list'), [])
     self.assertTrue(p.parse(t))
     t='mime="text/plain" & year=2015 & ! subject^="re:" & (section="1" | section~="1.")'    
     self.assertEqual(g.parse(t), '(SINCE 1-Jan-2015 BEFORE 1-Jan-2016) (NOT SUBJECT "re:")')
     self.assertEqual(g.parse(t, serialize='list'), ['(','SINCE', '1-Jan-2015', 'BEFORE',  '1-Jan-2016', ')', '(', 'NOT', 'SUBJECT', "re:", ')'])
     self.assertTrue(p.parse(t))
예제 #10
0
 def test_date(self):
     
     g=IMAPFilterGenerator()
     ctx={'date' : datetime(2015,11,15)}
     p=SimpleEvaluator(ctx)
     t="date = 2015-11-15"
     self.assertEqual(g.parse(t), "ON 15-Nov-2015")
     self.assertTrue(p.parse(t))
     
     t="date < 2015-11-14"
     self.assertEqual(g.parse(t), 'BEFORE 14-Nov-2015')
     self.assertFalse(p.parse(t))
     
     t="date > 2015-11-14"
     self.assertEqual(g.parse(t), '(OR SINCE 14-Nov-2015 NOT (ON 14-Nov-2015))')
     self.assertTrue(p.parse(t))
     
     t="date <= 2015-11-15"
     self.assertEqual(g.parse(t), '(OR BEFORE 15-Nov-2015 ON 15-Nov-2015)')
     self.assertTrue(p.parse(t))
     
     t="date >= 2015-11-15"
     self.assertEqual(g.parse(t), 'SINCE 15-Nov-2015')
     self.assertTrue(p.parse(t))
     
     p=SimpleEvaluator({'date' : datetime(2015,11,15,15,10)})
     t="date <= 2015-11-15"
     self.assertEqual(g.parse(t), '(OR BEFORE 15-Nov-2015 ON 15-Nov-2015)')
     self.assertTrue(p.parse(t))
예제 #11
0
 def test_imap(self):
     g=IMAPFilterGenerator()
     p=SimpleEvaluator( CONTEXT)
     t1='to ~= "myself"'
     self.assertEqual(g.parse(t1), 'TO "myself"')
     self.assertTrue(p.parse(t1))
     
     t1='to ^= "myself"'
     self.assertEqual(g.parse(t1), 'TO "myself"')
     t1='to $= "myself"'
     self.assertEqual(g.parse(t1), 'TO "myself"')
     
     t2='mime = "image/png"'
     self.assertEqual(g.parse(t2), '')
     self.assertTrue(p.parse(t2))
     
     t3='to = "myself"'
     self.assertEqual(g.parse(t3), 'TO "myself"')
     self.assertFalse(p.parse(t3))
     
     t4='to ~= "myself" & subject ~= "test"'
     self.assertEqual(g.parse(t4), '(TO "myself" SUBJECT "test")')
     self.assertTrue(p.parse(t4))
     
     t5='to ~= "myself" | subject ~= "test"'
     self.assertEqual(g.parse(t5), '(OR TO "myself" SUBJECT "test")')
     self.assertTrue(p.parse(t5))
     
     t6='to ~= "myself" & mime ~= "image"'
     self.assertEqual(g.parse(t6), 'TO "myself"')
     self.assertTrue(p.parse(t6))
     
     t7='mime~="image" & subject ~= "test"'
     self.assertEqual(g.parse(t7), 'SUBJECT "test"')
     self.assertTrue(p.parse(t7))
예제 #12
0
 def test_9(self):
     p=SimpleEvaluator({"number":100, 'date':datetime(2015,11,15), 'adate': datetime(2015,11,15,9,5)})
     self.assertFalse(p.parse("adate < 2015-11-15 8:10"))
     self.assertFalse(p.parse("adate < 2015-11-15 8:10 & number < 200  "))
     
     self.assertTrue(p.parse("number = 100"))
     self.assertTrue(p.parse("date = 2015-11-15"))
     self.assertTrue(p.parse("adate = 2015-11-15 09:05"))
     
     self.assertFalse(p.parse("date = 2015-11-15 01:59"))
     self.assertFalse(p.parse("adate = 2015-11-15 09:06"))
예제 #13
0
 def test_imap4(self):
     g=IMAPFilterGenerator()
     p=SimpleEvaluator( CONTEXT)
     
     t='subject~= "test" & mime ~= "image" |  to ~= "myself"'
     self.assertEqual(g.parse(t), '(OR SUBJECT "test" TO "myself")')
     self.assertTrue(p.parse(t))
     
     t='subject~= "test" |  mime ~= "image" &  to ~= "myself"'
     self.assertEqual(g.parse(t), '(OR SUBJECT "test" TO "myself")')
     self.assertTrue(p.parse(t))
     
     t='subject~="test" & seen | to~="myself" &  ! recent'
     self.assertEqual( g.parse(t), '(OR (SUBJECT "test" SEEN) (TO "myself" (NOT RECENT)))')
     self.assertTrue(p.parse(t))
예제 #14
0
 def test_flags(self):
     g = IMAPFilterGenerator()
     ctx = {
         'recent': True,
         'seen': True,
         'answered': True,
         'flagged': True,
         'deleted': True,
         'draft': True,
     }
     p = SimpleEvaluator(ctx)
     t = "recent & seen & answered & flagged & deleted & draft"
     self.assertEqual(g.parse(t),
                      "(RECENT SEEN ANSWERED FLAGGED DELETED DRAFT)")
     self.assertTrue(p.parse(t))
예제 #15
0
    def test_imap2(self):
        g = IMAPFilterGenerator()
        p = SimpleEvaluator(CONTEXT)

        t8 = 'to ~= "myself" | mime ~= "image"'
        self.assertEqual(g.parse(t8), '')
        self.assertTrue(p.parse(t8))

        t9 = 'mime~="image" | subject ~= "test"'
        self.assertEqual(g.parse(t9), '')
        self.assertTrue(p.parse(t9))

        t10 = '! subject ~= "test"'
        self.assertEqual(g.parse(t10), '(NOT SUBJECT "test")')
        self.assertFalse(p.parse(t10))
예제 #16
0
 def test_flags(self):
     g=IMAPFilterGenerator()
     ctx={
          'recent': True,
       'seen': True,
       'answered' : True,
       'flagged': True,
       'deleted': True,
       'draft' : True,
       
          }
     p=SimpleEvaluator(ctx)
     t="recent & seen & answered & flagged & deleted & draft"
     self.assertEqual(g.parse(t), "(RECENT SEEN ANSWERED FLAGGED DELETED DRAFT)")
     self.assertTrue(p.parse(t))
예제 #17
0
 def test_imap2(self):
     g=IMAPFilterGenerator()
     p=SimpleEvaluator( CONTEXT)
        
     t8='to ~= "myself" | mime ~= "image"'
     self.assertEqual(g.parse(t8), '')
     self.assertTrue(p.parse(t8))
     
     t9='mime~="image" | subject ~= "test"'
     self.assertEqual(g.parse(t9), '')
     self.assertTrue(p.parse(t9))
     
     t10='! subject ~= "test"'
     self.assertEqual(g.parse(t10), '(NOT SUBJECT "test")')
     self.assertFalse(p.parse(t10))
예제 #18
0
 def test_imap3(self):
     g=IMAPFilterGenerator()
     p=SimpleEvaluator( CONTEXT)    
     
     t='(! subject ~= "test" | from ~= "example.com") & ( ! recent |  seen)'
     self.assertEqual(g.parse(t),'(((OR (NOT SUBJECT "test") FROM "example.com")) ((OR (NOT RECENT) SEEN)))')
     self.assertTrue(p.parse(t))
     
     
     t='subject ~= "test" & from ~= "example.com" & to ~= "myself"' 
     self.assertEqual(g.parse(t), '(SUBJECT "test" FROM "example.com" TO "myself")')
     self.assertTrue(p.parse(t))
     
     t='subject ~= "test" | from ~= "example.com" | to ~= "myself"' 
     self.assertEqual(g.parse(t), '(OR SUBJECT "test" (OR FROM "example.com" TO "myself"))')
     self.assertTrue(p.parse(t))
예제 #19
0
    def test_imap4(self):
        g = IMAPFilterGenerator()
        p = SimpleEvaluator(CONTEXT)

        t = 'subject~= "test" & mime ~= "image" |  to ~= "myself"'
        self.assertEqual(g.parse(t), '(OR SUBJECT "test" TO "myself")')
        self.assertTrue(p.parse(t))

        t = 'subject~= "test" |  mime ~= "image" &  to ~= "myself"'
        self.assertEqual(g.parse(t), '(OR SUBJECT "test" TO "myself")')
        self.assertTrue(p.parse(t))

        t = 'subject~="test" & seen | to~="myself" &  ! recent'
        self.assertEqual(
            g.parse(t),
            '(OR (SUBJECT "test" SEEN) (TO "myself" (NOT RECENT)))')
        self.assertTrue(p.parse(t))
예제 #20
0
    def test_or(self):
        g = IMAPFilterGenerator()
        ctx = {
            'mime': 'application/pdf',
            'size': 200 * 1024,
            'from': '*****@*****.**',
            'cc': '',
            'subject': 'mako',
            'section': '1.1'
        }
        p = SimpleEvaluator(ctx)

        t = 'from~="test" | mime="application/pdf"'
        self.assertEqual(g.parse(t), '')
        self.assertTrue(p.parse(t))

        t = 'from~="test" | (mime="application/pdf")'
        self.assertEqual(g.parse(t), '')
        self.assertTrue(p.parse(t))
        t = '(mime="application/pdf") | from~="test"'
        self.assertEqual(g.parse(t), '')
        self.assertTrue(p.parse(t))
        t = '(mime="application/pdf") | (from~="test")'
        self.assertEqual(g.parse(t), '')
        self.assertTrue(p.parse(t))

        t = '(mime="application/pdf" & ! from ~= "siska" & ! cc~="nekdo" & size>100k & size<1M) | (mime="image/png")'
        self.assertEqual(g.parse(t), '')
        self.assertTrue(p.parse(t))
예제 #21
0
 def test_errors(self):
     p=SimpleEvaluator({'a':'1', 'b':'2', 'dummy':'dummy test', "uni":True})
     try:
         self.assertTrue(p.parse('(a="2" | b="x" & dummy="test' ))
         self.fail('Should rise parse exception')
     except ParserSyntaxError as e:
         print(e)
         
         
     try:
         self.assertTrue(p.parse('a > "1"' ))
         self.fail('Should rise parse exception')
     except ParserSyntaxError as e:
         print(e)
         
     try:
         self.assertTrue(p.parse('!! a="1"')) # this should not be possible  inner expression should be in ()
         self.fail('Should rise parse exception')
     except ParserSyntaxError as e:
         print(e)
            
     try:
         self.assertTrue(p.parse('a="2" | b="x" & dummy="test" | c' ))
         self.fail('Should rise eval exception')
     except ParserEvalError as e:
         print(e)
          
      
     try:
         self.assertTrue(p.parse('a="2" | b="x" & uni="y" ' ))
         self.fail('Should rise eval exception')
     except ParserEvalError as e:
         print(e)
예제 #22
0
 def test_11(self):
     p=SimpleEvaluator({"text":"start lorem ipsum neco end"})
     self.assertFalse(p.parse('text ^= "end"'))
     self.assertTrue(p.parse('text ^= "start"'))
     
     self.assertTrue(p.parse('text ^= "START"'))
     
     self.assertTrue(p.parse('text ~= "IPSUM"'))
     
     self.assertTrue(p.parse('text $= "end"'))
     self.assertFalse(p.parse('text $= "start"'))
예제 #23
0
 def test_2(self):
     p=SimpleEvaluator({'a':'1', 'b':'2', 'dummy':'dummy test'})
     self.assertTrue(p.parse('(a="1")'))
     self.assertFalse(p.parse('! (a="1")'))
     self.assertFalse(p.parse('! a="1" '))
     self.assertTrue(p.parse('!(! a="1")'))
     
     self.assertTrue(p.parse('a="1" & b="2"'))
예제 #24
0
 def test_size(self):
     g=IMAPFilterGenerator()
     ctx={'size' : 5 * 1024}
     p=SimpleEvaluator(ctx)
     
     t="size > 4k"
     self.assertEqual(g.parse(t), "LARGER %d"% (4*1024))
     self.assertTrue(p.parse(t))
     
     t="size >= 4k"
     self.assertEqual(g.parse(t), "LARGER %d"% (4*1024))
     self.assertTrue(p.parse(t))
     
     t="size < 4k"
     self.assertEqual(g.parse(t), '')
     self.assertFalse(p.parse(t))
     
     t="size <= 4k"
     self.assertEqual(g.parse(t), '')
     self.assertFalse(p.parse(t))
예제 #25
0
    def test_imap3(self):
        g = IMAPFilterGenerator()
        p = SimpleEvaluator(CONTEXT)

        t = '(! subject ~= "test" | from ~= "example.com") & ( ! recent |  seen)'
        self.assertEqual(
            g.parse(t),
            '(((OR (NOT SUBJECT "test") FROM "example.com")) ((OR (NOT RECENT) SEEN)))'
        )
        self.assertTrue(p.parse(t))

        t = 'subject ~= "test" & from ~= "example.com" & to ~= "myself"'
        self.assertEqual(g.parse(t),
                         '(SUBJECT "test" FROM "example.com" TO "myself")')
        self.assertTrue(p.parse(t))

        t = 'subject ~= "test" | from ~= "example.com" | to ~= "myself"'
        self.assertEqual(
            g.parse(t),
            '(OR SUBJECT "test" (OR FROM "example.com" TO "myself"))')
        self.assertTrue(p.parse(t))
예제 #26
0
 def test_6(self):
      
     p=SimpleEvaluator({'a':'1', 'b':'2', 'dummy':'dummy test', 'd':'', 'c':''})   
     self.assertTrue(p.parse('(b="2" & dummy="xxx" )|a="1"' ))
     self.assertTrue(p.parse('((b="2" & dummy="xxx" )|a="1") | c="x"' ))
     self.assertTrue(p.parse('(b="2" & dummy="xxx" )|(a="1" | c="x")' ))
     self.assertTrue(p.parse('b="2" | a="1" | c="x"' ))
     self.assertTrue(p.parse('(b="2" & dummy="xxx" )| c="x" | a="1" ' ))
예제 #27
0
 def test_errors2(self):
     p= p=SimpleEvaluator({"number":100, 'date':datetime(2015,11,15), 'string':"something"})
     
     try:
         self.assertTrue(p.parse('number ~="1"' ))
         self.fail('Should rise eval exception')
     except ParserEvalError as e:
         print(e)
         
     try:
         self.assertTrue(p.parse('number ^="1"' ))
         self.fail('Should rise eval exception')
     except ParserEvalError as e:
         print(e)
         
     try:
         self.assertTrue(p.parse('number $="1"' ))
         self.fail('Should rise eval exception')
     except ParserEvalError as e:
         print(e)
         
     
     try:
         self.assertTrue(p.parse('date $="2"' ))
         self.fail('Should rise eval exception')
     except ParserEvalError as e:
         print(e)   
         
     try:
         self.assertTrue(p.parse('string < 1' ))
         self.fail('Should rise eval exception')
     except ParserEvalError as e:
         print(e) 
         
     try:
         self.assertTrue(p.parse('string <= 1' ))
         self.fail('Should rise eval exception')
     except ParserEvalError as e:
         print(e) 
         
     try:
         self.assertTrue(p.parse('string > 1' ))
         self.fail('Should rise eval exception')
     except ParserEvalError as e:
         print(e) 
         
     try:
         self.assertTrue(p.parse('string >= 1' ))
         self.fail('Should rise eval exception')
     except ParserEvalError as e:
         print(e) 
예제 #28
0
 def test_notimap(self):
     g = IMAPFilterGenerator()
     ctx = {
         'mime': 'text/plain',
         'date': datetime(2015, 10, 13),
         'year': 2015,
         'subject': 'mako',
         'section': '1.1'
     }
     p = SimpleEvaluator(ctx)
     t = '(section="1" | section~="1.")'
     self.assertEqual(g.parse(t), '')
     self.assertEqual(g.parse(t, serialize='list'), [])
     self.assertTrue(p.parse(t))
     t = 'mime="text/plain" & year=2015 & ! subject^="re:" & (section="1" | section~="1.")'
     self.assertEqual(
         g.parse(t),
         '(SINCE 1-Jan-2015 BEFORE 1-Jan-2016) (NOT SUBJECT "re:")')
     self.assertEqual(g.parse(t, serialize='list'), [
         '(', 'SINCE', '1-Jan-2015', 'BEFORE', '1-Jan-2016', ')', '(',
         'NOT', 'SUBJECT', "re:", ')'
     ])
     self.assertTrue(p.parse(t))
예제 #29
0
 def test_12(self):
     
     p=SimpleEvaluator({"small":100, 'large':1024*1024*10, 'kilo':1024, 'mega':1024*1024, 'giga':1024*1024*1024})
     
     self.assertTrue(p.parse('small < 1k'))
     self.assertFalse(p.parse('small > 1k'))
     
     self.assertTrue(p.parse('large > 9M'))
     
     self.assertTrue(p.parse('kilo=1k & mega=1M & giga=1G'))
예제 #30
0
    def test_size(self):
        g = IMAPFilterGenerator()
        ctx = {'size': 5 * 1024}
        p = SimpleEvaluator(ctx)

        t = "size > 4k"
        self.assertEqual(g.parse(t), "LARGER %d" % (4 * 1024))
        self.assertTrue(p.parse(t))

        t = "size >= 4k"
        self.assertEqual(g.parse(t), "LARGER %d" % (4 * 1024))
        self.assertTrue(p.parse(t))

        t = "size < 4k"
        self.assertEqual(g.parse(t), '')
        self.assertFalse(p.parse(t))

        t = "size <= 4k"
        self.assertEqual(g.parse(t), '')
        self.assertFalse(p.parse(t))
예제 #31
0
    def test_year(self):
        g = IMAPFilterGenerator(unsafe=True)
        ctx = {'year': 2015}
        p = SimpleEvaluator(ctx)

        t = 'year=2015'
        self.assertEqual(g.parse(t), '(SINCE 1-Jan-2015 BEFORE 1-Jan-2016)')
        self.assertTrue(p.parse(t))

        t = 'year>2015'
        self.assertEqual(g.parse(t), 'SINCE 1-Jan-2016')
        self.assertFalse(p.parse(t))

        t = 'year>=2015'
        self.assertEqual(g.parse(t), 'SINCE 1-Jan-2015')
        self.assertTrue(p.parse(t))

        t = 'year<2016'
        self.assertEqual(g.parse(t), 'BEFORE 1-Jan-2016')
        self.assertTrue(p.parse(t))

        t = 'year<=2016'
        self.assertEqual(g.parse(t), 'BEFORE 1-Jan-2017')
        self.assertTrue(p.parse(t))
예제 #32
0
 def test_or(self):
     g=IMAPFilterGenerator()
     ctx={'mime':'application/pdf', 'size': 200*1024, 'from':'*****@*****.**', 'cc':'','subject':'mako','section':'1.1'}
     p=SimpleEvaluator(ctx)
     
     t='from~="test" | mime="application/pdf"'
     self.assertEqual(g.parse(t), '')
     self.assertTrue(p.parse(t))
     
     t='from~="test" | (mime="application/pdf")'
     self.assertEqual(g.parse(t), '')
     self.assertTrue(p.parse(t))
     t='(mime="application/pdf") | from~="test"'
     self.assertEqual(g.parse(t), '')
     self.assertTrue(p.parse(t))
     t='(mime="application/pdf") | (from~="test")'
     self.assertEqual(g.parse(t), '')
     self.assertTrue(p.parse(t))
     
     t='(mime="application/pdf" & ! from ~= "siska" & ! cc~="nekdo" & size>100k & size<1M) | (mime="image/png")'
     self.assertEqual(g.parse(t), '')
     self.assertTrue(p.parse(t))
예제 #33
0
 def test_year(self):
     g=IMAPFilterGenerator(unsafe=True)
     ctx={'year':2015}
     p=SimpleEvaluator(ctx)
     
     t='year=2015'
     self.assertEqual(g.parse(t), '(SINCE 1-Jan-2015 BEFORE 1-Jan-2016)')
     self.assertTrue(p.parse(t))
     
     t='year>2015'
     self.assertEqual(g.parse(t), 'SINCE 1-Jan-2016')
     self.assertFalse(p.parse(t))
     
     t='year>=2015'
     self.assertEqual(g.parse(t), 'SINCE 1-Jan-2015')
     self.assertTrue(p.parse(t))
     
     t='year<2016'
     self.assertEqual(g.parse(t), 'BEFORE 1-Jan-2016')
     self.assertTrue(p.parse(t))
     
     t='year<=2016'
     self.assertEqual(g.parse(t), 'BEFORE 1-Jan-2017')
     self.assertTrue(p.parse(t))
예제 #34
0
 def test_1(self):
     p=SimpleEvaluator({'a':'b', 'c':''})
     res = p.parse('a="b"')
     self.assertTrue(res)
     res= p.parse('c="b"')
     self.assertFalse(res)
예제 #35
0
 def test(self):
     p=SimpleEvaluator({'flags':TagList(['quick', 'BROWN', 'fox', 'JUMPS', 'over', 'LAZY', 'dog'])})
     
     self.assertTrue(p.parse('flags = "over" & flags= "brown"'))
     self.assertTrue(p.parse('flags~="row" & flags^="jump" & flags$="zy"'))
예제 #36
0
def main(opts):
    host, port = split_host(opts.host, ssl=not opts.no_ssl)
    ssl = not opts.no_ssl
    if opts.insecure_ssl:
        ssl = 'insecure'
    log.debug('SSL status is %s', ssl)
    # test filter parsing
    eval_parser = SimpleEvaluator(DUMMY_INFO)
    filter = opts.filter  # @ReservedAssignment

    try:
        imap_filter = IMAPFilterGenerator(opts.unsafe_imap_search).parse(
            filter, serialize='string') if not opts.no_imap_search else None
        _ = eval_parser.parse(filter)
    except ParserSyntaxError as e:
        msg = "Invalid syntax of filter: %s" % extract_err_msg(e)
        log.error(msg)
        #        p(msg, file=sys.stderr)
        sys.exit(1)
    except ParserEvalError as e:
        msg = "Invalid semantics of filter: %s" % extract_err_msg(e)
        log.error(msg)
        #p(msg, file=sys.stderr)
        sys.exit(2)

    charset = None
    if imap_filter:
        try:
            imap_filter.encode('ascii')
        except UnicodeEncodeError:
            log.warn(
                'Your search contains non-ascii characters, will try UTF-8, but it may not work on some servers'
            )
            try:
                imap_filter = IMAPFilterGenerator(
                    opts.unsafe_imap_search).parse(filter, serialize='list')
                [part.encode('utf-8') for part in imap_filter]
                charset = 'UTF-8'
            except UnicodeEncodeError as e:
                log.error('Invalid characters in filter: %e', e)
                sys.exit(3)

    log.debug('IMAP filter: %s', imap_filter)

    pool = None
    try:
        c = IMAP_client_factory(host, port, use_ssl=ssl)
        if not c.has_capability('imap4rev1'):
            log.error('This server is not compatible with IMAP4rev1!')
            sys.exit(4)
        try:
            c.login(opts.user, opts.password)
            if not opts.folder:
                folders = ['INBOX']
            else:
                available = c.list_folders()
                folders = matched_folders(normalize_folders(available),
                                          opts.folder)
                if not folders:
                    log.warn('No folders patching %s', opts.folder)

            log.debug('Will process these folders: %s', folders)
            if opts.move and not c.folder_exists(opts.move):
                c.create_folder(opts.move)

            if opts.threads:
                pool = Pool(opts.threads, host, port, ssl, opts.user,
                            opts.password)
            for folder in folders:
                log.info('Processing folder %s', folder)
                process_folder(c, pool, folder, imap_filter, charset,
                               eval_parser, opts)

            if pool:
                if opts.verbose:
                    p('Finished searching, now wait until all parts download in separate threads'
                      )

                def report():
                    while True:
                        log.debug('Pool status - size %d, unfinished %d',
                                  pool._queue.qsize(),
                                  pool._queue.unfinished_tasks)
                        time.sleep(5)

                if logging.getLogger().isEnabledFor(logging.DEBUG):
                    t = Thread(target=report, name='Debug reporting')
                    t.daemon = True
                    t.start()
                pool.wait_finish()
                log.debug('Pool is finished')
        finally:
            if opts.delete or opts.move:
                try:
                    c.expunge()  # last one shoyld be selected
                    for f in folders[:-1]:
                        c.select_folder(f)
                        c.expunge()
                    log.debug("Expunge folders")
                except Exception:
                    log.exception('Expunge Failed!')

            c.logout()

    except Exception:
        log.exception('Runtime Error')
        sys.exit(4)
예제 #37
0
 def test_10(self):
     p=SimpleEvaluator({"number":100, 'date':datetime(2015,11,15), 'adate': datetime(2015,11,15,9,5)})
     
     self.assertFalse(p.parse("number <= 9"))
     self.assertTrue(p.parse("number <= 100"))
     self.assertTrue(p.parse("number <= 200"))
     
     self.assertTrue(p.parse("number > 9"))
     self.assertFalse(p.parse("number > 200"))
     
     self.assertTrue(p.parse("number >= 9"))
     self.assertTrue(p.parse("number >= 100"))
     self.assertFalse(p.parse("number >= 200"))
     
     self.assertFalse(p.parse("date >= 2015-11-15 01:59"))
     self.assertTrue(p.parse("date <= 2015-11-15 01:59"))
예제 #38
0
 def test_7(self):
     p=SimpleEvaluator({'a':'1', 'b':'2', 'dummy':'dummy test', 'd':'', 'c':''}) 
     self.assertTrue(p.parse('(b="2" & dummy="xxx" )|a="1" | c="x"' ))
     
     self.assertTrue(p.parse('b="2" & dummy="xxx" |a="1" | c="x"' )) 
     self.assertFalse(p.parse('a="1" & b="2" &c="3" & dummy ~= "test"'))
예제 #39
0
 def test_5(self):
     p=SimpleEvaluator({'a':'1', 'b':'2', 'dummy':'dummy test', 'unknown':''})
     self.assertTrue(p.parse('a'))
     self.assertFalse(p.parse('unknown'))
     self.assertFalse(p.parse('unknown & a'))
     self.assertTrue(p.parse('unknown | a'))
예제 #40
0
 def test_4(self):
     p=SimpleEvaluator({'a':'1', 'b':'2', 'dummy':'dummy test', 'd':'', 'c':''})
     self.assertTrue(p.parse('(a="1" | d="3") & (a="2" | b="2")'))
     self.assertFalse(p.parse('(a="1" | d="3") & !(a="2" | b="2")'))
     self.assertTrue(p.parse('(a = "1" | (! d="3")) & (a = "2" | b="2")'))
     self.assertFalse(p.parse('a="2" | b="2" & dummy="xxx"' ))
     self.assertTrue(p.parse('a="2" | b="2" & dummy~="test"' ))
     
     self.assertTrue(p.parse('a="1" | b="2" & dummy="xxx" | c="x"' ))
     
     self.assertTrue(p.parse('a="1" | ( b="2" & dummy="xxx"  )| c="x"' ))
     
     self.assertFalse(p.parse('(a="1" | b="2") & dummy="xxx" | c="x"' ))
     self.assertTrue(p.parse('a="1" | b="2" & ( dummy="xxx" | c="x" )' ))
     self.assertTrue(p.parse('a="1" | b="3" & dummy="xxx" | c="x"' ))
     self.assertFalse(p.parse('( a="1" | b="3" ) & dummy="xxx" | c="x"' ))
예제 #41
0
def main(opts):
    host, port= split_host(opts.host, ssl=not opts.no_ssl)
    ssl= not opts.no_ssl
    if opts.insecure_ssl:
        ssl='insecure'
    log.debug('SSL status is %s', ssl)
    # test filter parsing
    eval_parser=SimpleEvaluator(DUMMY_INFO)
    filter=opts.filter  # @ReservedAssignment
    
    try:
        imap_filter=IMAPFilterGenerator(opts.unsafe_imap_search).parse(filter, serialize='string') if not opts.no_imap_search else None
        _ = eval_parser.parse(filter)
    except ParserSyntaxError as e:
        msg = "Invalid syntax of filter: %s" %extract_err_msg(e)
        log.error(msg)
#        p(msg, file=sys.stderr)
        sys.exit(1)
    except ParserEvalError as e:
        msg = "Invalid semantics of filter: %s" % extract_err_msg(e)
        log.error(msg)
        #p(msg, file=sys.stderr)
        sys.exit(2)
    
    charset=None    
    if  imap_filter:
        try:
            imap_filter.encode('ascii')
        except UnicodeEncodeError:
            log.warn('Your search contains non-ascii characters, will try UTF-8, but it may not work on some servers')
            try:
                imap_filter=IMAPFilterGenerator(opts.unsafe_imap_search).parse(filter, serialize='list')
                [part.encode('utf-8') for part in imap_filter]
                charset='UTF-8'
            except UnicodeEncodeError as e:
                log.error('Invalid characters in filter: %e',e)
                sys.exit(3)   
        
        
    log.debug('IMAP filter: %s', imap_filter) 

    pool=None
    try:   
        c=IMAP_client_factory(host,port,use_ssl=ssl)
        if not c.has_capability('imap4rev1'):
            log.error('This server is not compatible with IMAP4rev1!')
            sys.exit(4)
        try:
            c.login(opts.user, opts.password)
            if not opts.folder:
                folders=['INBOX']
            else:
                available=c.list_folders()
                folders= matched_folders(normalize_folders(available), opts.folder)
                if not folders:
                    log.warn('No folders patching %s', opts.folder)
             
            log.debug('Will process these folders: %s', folders)    
            if opts.move and  not c.folder_exists(opts.move):
                c.create_folder(opts.move)
           
            if opts.threads:
                pool=Pool(opts.threads, host, port, ssl, opts.user, opts.password)
            for folder in folders:
                log.info('Processing folder %s', folder)
                process_folder(c, pool, folder, imap_filter, charset, eval_parser, opts)  
            
            if pool:
                if opts.verbose:
                    p('Finished searching, now wait until all parts download in separate threads')
                def report():
                    while True:
                        log.debug('Pool status - size %d, unfinished %d', pool._queue.qsize(), pool._queue.unfinished_tasks)
                        time.sleep(5)
                if logging.getLogger().isEnabledFor(logging.DEBUG):
                    t=Thread(target=report, name='Debug reporting')
                    t.daemon=True
                    t.start()
                pool.wait_finish()   
                log.debug('Pool is finished')
        finally:
            if opts.delete or opts.move:
                try:
                    c.expunge() # last one shoyld be selected
                    for f in folders[:-1]:
                        c.select_folder(f)
                        c.expunge()
                    log.debug("Expunge folders")
                except Exception:
                    log.exception('Expunge Failed!')
                
                
            c.logout()
            
    except Exception:
        log.exception('Runtime Error')     
        sys.exit(4)
예제 #42
0
 def test_3(self):
     p=SimpleEvaluator({'a':'1', 'b':'2', 'dummy':'dummy test'})
     self.assertFalse(p.parse('a="1" & b="3"'))
     self.assertTrue(p.parse('a="2" | b="2"'))
     self.assertTrue(p.parse('a="1" & b="2" & dummy ~= "test"'))