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)