offlineimap rev 506

"Automatic Subversion Change Mailer" <[email protected]> Thu, 17 Jul 2003 11:33:54 -0500 (CDT)
Newsgroups gmane.mail.imap.offlineimap.subversion
Message-ID <[email protected]>
You are receiving this message because
all commits get sent to this address.

Author: jgoerzen
Date: 2003-07-17 11:33:45 -0500 (Thu, 17 Jul 2003)
New Revision: 506

Modified:
  imaplib/head/imap2/parser/Objects.py
  imaplib/head/imap2/parser/grammar.g
  imaplib/head/imap2/parser/grammar.py
  imaplib/head/imap2/parser/grammarTest.py

Log:


Diff:
Modified: imaplib/head/imap2/parser/Objects.py
==============================================================================
--- imaplib/head/imap2/parser/Objects.py	2003-07-17 03:14:29 UTC (rev 505)
+++ imaplib/head/imap2/parser/Objects.py	2003-07-17 16:33:45 UTC (rev 506)
@@ -1,6 +1,5 @@
 # Implementation of grammar from RFC3501
 # $Id: grammar.g 491 2003-07-16 19:38:49Z jgoerzen $
-
 # COPYRIGHT #
 # Copyright (C) 2003 John Goerzen
 #
@@ -144,12 +143,19 @@
         return self.code
 
     def getname(self):
+        """Returns the name for hashing purposes."""
         return "Resp." + self.code.getname()
 
     def getresult(self):
+        """Returns the result code as a string (typically one of OK, NO, BAD)
+
+        Example: obj.getresult() -> 'OK'"""
         return self.result
 
     def gettext(self):
+        """Returns the explanatory human-readable text from the server.
+
+        Examplee: obj.gettext() -> 'SELECT completed'"""
         return self.text
 
     def __repr__(self):

Modified: imaplib/head/imap2/parser/grammar.g
==============================================================================
--- imaplib/head/imap2/parser/grammar.g	2003-07-17 03:14:29 UTC (rev 505)
+++ imaplib/head/imap2/parser/grammar.g	2003-07-17 16:33:45 UTC (rev 506)
@@ -59,7 +59,7 @@
     token base64_char_x2: r'[a-zA-Z0-9+/]{2}'
     token base64_char_x3: r'[a-zA-Z0-9+/]{3}'
     token base64_char_x4: r'[a-zA-Z0-9+/]{4}'
-    token CHAR8: r'[\x01-\xff]'
+    token CHAR_EIGHT: r'[\x01-\xff]'
     token date_day: r'[0-9]{1,2}'
     token date_day_fixed: r'[ 0-9][0-9]'
     token date_month: r'(?i)(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)'
@@ -187,12 +187,12 @@
                           SP string {{ v.append([x, string]) }})*
                          RPAREN ) {{ return v }}
 
-    rule body_type_1part: (body_type_basic {{ v = [body_type_basic] }}
-                           | body_type_msg {{ v = [body_type_msg] }}
-                           | body_type_text {{ v = [body_type_text] }}
-                           )
-                           [SP body_ext_1part {{v.append(body_ext_1part) }} ]
-                           {{ return v}}
+    #rule body_type_1part: (body_type_basic {{ v = [body_type_basic] }}
+    #                       | body_type_msg {{ v = [body_type_msg] }}
+    #                       | body_type_text {{ v = [body_type_text] }}
+    #                       )
+    #                       [SP body_ext_1part {{v.append(body_ext_1part) }} ]
+    #                       {{ return v}}
     rule body_type_basic: media_basic {{ v = {'media_basic': media_basic} }}
                           SP body_fields {{ v['body_fields'] = body_fields }}
                           {{ return v }}
@@ -311,9 +311,17 @@
     rule literal: r'\{' number r'\}' CRLF literal_load<<number>> {{ return literal_load }}
     rule literal_load<<X>>: {{ count = 0 }} {{ data = '' }}
          ( {{ if count == X: break}}
-           CHAR8 {{ count += 1 }} {{ data += CHAR8 }}
+           CHAR_EIGHT {{ count += 1 }} {{ data += CHAR_EIGHT }}
                   )*
          {{ return data }}
+    #rule literal_load<<X>>: {{ if X == 0: return '' }} 
+    #      {{ data = '' }}
+    #     ( CHAR8 {{ data += CHAR8 }}
+    #             {{ if len(data) == X: break }}
+    #              )* CRLF
+    #     {{ return data }}
+    #rule literal_load<<X>>: {{ data = ''}}
+    #      ( CHAR_EIGHT {{ data += CHAR_EIGHT }} )* {{ return data }}
     
     #rule login:
     #rule lsub:
@@ -363,7 +371,7 @@
 
     rule message_data: nz_number SP 
                        (r'(?i)EXPUNGE' {{ v = Message_Data_Expunge(nz_number)  }}
-                        | r'(?i)FETCH' SP msg_att {{ v = Message_Data_Fetch(nz_number, msg_att }} 
+                        | r'(?i)FETCH' SP msg_att {{ v = Message_Data_Fetch(nz_number, msg_att) }} 
                         ) {{ return v }}
     rule msg_att: LPAREN {{ v = {} }}
         (msg_att_dynamic {{ v.update(msg_att_dynamic) }}
@@ -410,11 +418,12 @@
     # Q
     ##############################
 
-    rule quoted: "\"" {{v = ''}}
+    rule quoted: DQUOTE {{v = ''}}
                  ( QUOTED_CHAR {{ v += QUOTED_CHAR}} )* 
-                 "\"" {{ return v }}
-    rule QUOTED_CHAR: QUOTED_CHAR_TOK {{ return QUOTED_CHAR_TOK }}
-         | ( "\\\\" quoted_specials {{ return quoted_specials}} )
+                 DQUOTE {{ return v }}
+    rule QUOTED_CHAR: (  BACKSLASH quoted_specials {{ v = quoted_specials}}
+                        | QUOTED_CHAR_TOK {{ v = QUOTED_CHAR_TOK }} )
+         {{ return v }}
 
     ##############################
     # R
@@ -544,3 +553,5 @@
     ##################################################
 
     rule test_capability_data: capability_data END {{ return capability_data }}
+    rule test_nstring: nstring END {{ return nstring }}
+

Modified: imaplib/head/imap2/parser/grammar.py
==============================================================================
--- imaplib/head/imap2/parser/grammar.py	2003-07-17 03:14:29 UTC (rev 505)
+++ imaplib/head/imap2/parser/grammar.py	2003-07-17 16:33:45 UTC (rev 506)
@@ -1,5 +1,5 @@
 # Implementation of grammar from RFC3501
-# $Id: grammar.g 504 2003-07-16 21:56:06Z jgoerzen $
+# $Id: grammar.g 504 2003-07-17 03:14:29Z jgoerzen $
 
 # COPYRIGHT #
 # Copyright (C) 2003 John Goerzen
@@ -41,8 +41,6 @@
         ("r'(?i)BADCHARSET'", re.compile('(?i)BADCHARSET')),
         ("r'(?i)ALERT'", re.compile('(?i)ALERT')),
         ("r'(?i)BYE'", re.compile('(?i)BYE')),
-        ('"\\\\\\\\"', re.compile('\\\\')),
-        ('"\\""', re.compile('"')),
         ("r'(?i)NIL'", re.compile('(?i)NIL')),
         ("r'(?i)UID'", re.compile('(?i)UID')),
         ("r'(?i)BODY'", re.compile('(?i)BODY')),
@@ -93,7 +91,7 @@
         ('base64_char_x2', re.compile('[a-zA-Z0-9+/]{2}')),
         ('base64_char_x3', re.compile('[a-zA-Z0-9+/]{3}')),
         ('base64_char_x4', re.compile('[a-zA-Z0-9+/]{4}')),
-        ('CHAR8', re.compile('[\\x01-\\xff]')),
+        ('CHAR_EIGHT', re.compile('[\\x01-\\xff]')),
         ('date_day', re.compile('[0-9]{1,2}')),
         ('date_day_fixed', re.compile('[ 0-9][0-9]')),
         ('date_month', re.compile('(?i)(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)')),
@@ -163,7 +161,7 @@
         return nstring
 
     def astring(self):
-        _token_ = self._peek('"\\""', "r'\\{'", 'ATOM_CHAR', 'resp_specials')
+        _token_ = self._peek('DQUOTE', "r'\\{'", 'ATOM_CHAR', 'resp_specials')
         if _token_ not in ['ATOM_CHAR', 'resp_specials']:
             string = self.string()
             return string
@@ -251,17 +249,13 @@
 
     def body(self):
         LPAREN = self._scan('LPAREN')
-        _token_ = self._peek('LPAREN', 'media_message', 'DQUOTE', '"\\""', "r'\\{'")
-        if _token_ != 'LPAREN':
-            body_type_1part = self.body_type_1part()
-            return body_type_1part
-        else: # == 'LPAREN'
-            body_type_mpart = self.body_type_mpart()
-            return body_type_mpart
+        _token_ = self._peek('LPAREN')
+        body_type_mpart = self.body_type_mpart()
+        return body_type_mpart
         RPAREN = self._scan('RPAREN')
 
     def body_extension(self):
-        _token_ = self._peek('LPAREN', "r'(?i)NIL'", 'number_tok', '"\\""', "r'\\{'")
+        _token_ = self._peek('LPAREN', "r'(?i)NIL'", 'number_tok', 'DQUOTE', "r'\\{'")
         if _token_ not in ['LPAREN', 'number_tok']:
             nstring = self.nstring()
             v = nstring
@@ -281,19 +275,19 @@
     def body_ext_1part(self):
         body_fld_md5 = self.body_fld_md5()
         v = {'md5': body_fld_md5, 'extension': []}
-        if self._peek('SP', 'RPAREN') == 'SP':
+        if 1:
             SP = self._scan('SP')
             body_fld_dsp = self.body_fld_dsp()
             v['dsp'] = body_fld_dsp
-            if self._peek('SP', 'RPAREN') == 'SP':
+            if 1:
                 SP = self._scan('SP')
                 body_fld_lang = self.body_fld_lang()
                 v['lang'] = body_fld_lang
-                if self._peek('SP', 'RPAREN') == 'SP':
+                if 1:
                     SP = self._scan('SP')
                     body_fld_loc = self.body_fld_loc()
                     v['loc'] = body_fld_loc
-                    while self._peek('SP', 'RPAREN') == 'SP':
+                    while 1:
                         SP = self._scan('SP')
                         body_extension = self.body_extension()
                         v['extension'].append(body_extension)
@@ -359,7 +353,7 @@
         return nstring
 
     def body_fld_lang(self):
-        _token_ = self._peek('LPAREN', "r'(?i)NIL'", '"\\""', "r'\\{'")
+        _token_ = self._peek('LPAREN', "r'(?i)NIL'", 'DQUOTE', "r'\\{'")
         if _token_ != 'LPAREN':
             nstring = self.nstring()
             v = [nstring]
@@ -412,23 +406,6 @@
             RPAREN = self._scan('RPAREN')
         return v
 
-    def body_type_1part(self):
-        _token_ = self._peek('media_message', 'DQUOTE', '"\\""', "r'\\{'")
-        if _token_ not in ['media_message', 'DQUOTE']:
-            body_type_basic = self.body_type_basic()
-            v = [body_type_basic]
-        elif _token_ == 'media_message':
-            body_type_msg = self.body_type_msg()
-            v = [body_type_msg]
-        else: # == 'DQUOTE'
-            body_type_text = self.body_type_text()
-            v = [body_type_text]
-        if self._peek('SP', 'RPAREN') == 'SP':
-            SP = self._scan('SP')
-            body_ext_1part = self.body_ext_1part()
-            v.append(body_ext_1part)
-        return v
-
     def body_type_basic(self):
         media_basic = self.media_basic()
         v = {'media_basic': media_basic}
@@ -720,19 +697,19 @@
     def literal_load(self, X):
         count = 0
         data = ''
-        while self._peek('CHAR8', 'SP', 'RPAREN', 'CRLF') == 'CHAR8':
+        while self._peek('CHAR_EIGHT', 'SP', 'RPAREN', 'END', 'CRLF') == 'CHAR_EIGHT':
             if count == X: break
-            self._scan('CHAR8')
+            CHAR_EIGHT = self._scan('CHAR_EIGHT')
             count += 1
-            data += CHAR8
+            data += CHAR_EIGHT
         return data
 
     def mailbox(self):
-        _token_ = self._peek('"INBOX"', '"\\""', "r'\\{'", 'ATOM_CHAR', 'resp_specials')
+        _token_ = self._peek('"INBOX"', 'DQUOTE', "r'\\{'", 'ATOM_CHAR', 'resp_specials')
         if _token_ == '"INBOX"':
             self._scan('"INBOX"')
             v = "INBOX"
-        else: # in ['"\\""', "r'\\{'", 'ATOM_CHAR', 'resp_specials']
+        else: # in ['DQUOTE', "r'\\{'", 'ATOM_CHAR', 'resp_specials']
             astring = self.astring()
             v = astring
         return v
@@ -843,16 +820,15 @@
     def message_data(self):
         nz_number = self.nz_number()
         SP = self._scan('SP')
-        v = [nz_number]
         _token_ = self._peek("r'(?i)EXPUNGE'", "r'(?i)FETCH'")
         if _token_ == "r'(?i)EXPUNGE'":
             self._scan("r'(?i)EXPUNGE'")
-            v.append('EXPUNGE')
+            v = Message_Data_Expunge(nz_number)
         else: # == "r'(?i)FETCH'"
             self._scan("r'(?i)FETCH'")
             SP = self._scan('SP')
             msg_att = self.msg_att()
-            v.extend(['FETCH', msg_att])
+            v = Message_Data_Fetch(nz_number, msg_att)
         return v
 
     def msg_att(self):
@@ -950,7 +926,7 @@
         return None
 
     def nstring(self):
-        _token_ = self._peek("r'(?i)NIL'", '"\\""', "r'\\{'")
+        _token_ = self._peek("r'(?i)NIL'", 'DQUOTE', "r'\\{'")
         if _token_ != "r'(?i)NIL'":
             string = self.string()
             v = string
@@ -972,23 +948,24 @@
         return astring
 
     def quoted(self):
-        self._scan('"\\""')
+        DQUOTE = self._scan('DQUOTE')
         v = ''
-        while self._peek('"\\""', 'QUOTED_CHAR_TOK', '"\\\\\\\\"') != '"\\""':
+        while self._peek('DQUOTE', 'BACKSLASH', 'QUOTED_CHAR_TOK') != 'DQUOTE':
             QUOTED_CHAR = self.QUOTED_CHAR()
             v += QUOTED_CHAR
-        self._scan('"\\""')
+        DQUOTE = self._scan('DQUOTE')
         return v
 
     def QUOTED_CHAR(self):
-        _token_ = self._peek('QUOTED_CHAR_TOK', '"\\\\\\\\"')
-        if _token_ == 'QUOTED_CHAR_TOK':
-            QUOTED_CHAR_TOK = self._scan('QUOTED_CHAR_TOK')
-            return QUOTED_CHAR_TOK
-        else: # == '"\\\\\\\\"'
-            self._scan('"\\\\\\\\"')
+        _token_ = self._peek('BACKSLASH', 'QUOTED_CHAR_TOK')
+        if _token_ == 'BACKSLASH':
+            BACKSLASH = self._scan('BACKSLASH')
             quoted_specials = self._scan('quoted_specials')
-            return quoted_specials
+            v = quoted_specials
+        else: # == 'QUOTED_CHAR_TOK'
+            QUOTED_CHAR_TOK = self._scan('QUOTED_CHAR_TOK')
+            v = QUOTED_CHAR_TOK
+        return v
 
     def response(self):
         v = []
@@ -1222,8 +1199,8 @@
         return v
 
     def string(self):
-        _token_ = self._peek('"\\""', "r'\\{'")
-        if _token_ == '"\\""':
+        _token_ = self._peek('DQUOTE', "r'\\{'")
+        if _token_ == 'DQUOTE':
             quoted = self.quoted()
             v = quoted
         else: # == "r'\\{'"
@@ -1285,7 +1262,12 @@
         END = self._scan('END')
         return capability_data
 
+    def test_nstring(self):
+        nstring = self.nstring()
+        END = self._scan('END')
+        return nstring
 
+
 def parse(rule, text):
     P = IMAP(IMAPScanner(text))
     return wrap_error_reporter(P, rule)

Modified: imaplib/head/imap2/parser/grammarTest.py
==============================================================================
--- imaplib/head/imap2/parser/grammarTest.py	2003-07-17 03:14:29 UTC (rev 505)
+++ imaplib/head/imap2/parser/grammarTest.py	2003-07-17 16:33:45 UTC (rev 506)
@@ -69,4 +69,17 @@
         result = parse("CAPABILITY IMAP4rev1 CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE AUTH=PLAIN", "test_capability_data")
         self.assertEquals(repr(result),
                           "<Capabilities ['IMAP4rev1', 'CHILDREN', 'NAMESPACE', 'THREAD=ORDEREDSUBJECT', 'THREAD=REFERENCES', 'SORT', 'QUOTA', 'IDLE', 'AUTH=PLAIN']>")
-        
+
+    def test_string(self):
+        tests = (
+            ('"Basic Quoted"', 'Basic Quoted'),
+            ('NIL', None),
+            ("{5}\r\nTest1", "Test1"),
+            ('""', ""),
+            ("{0}\r\n", ""),
+            #(r'"Quoted with \"Quotes\""', 'Quoted with "Quotes"'),
+            (r'"Quoted with \"', r'Quoted with \\'))
+
+        for test, expected in tests:
+            actual = parse(test, 'test_nstring')
+            self.assertEquals(actual, expected)