summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorBrian Curtin <brian@python.org>2011-06-13 21:10:32 (GMT)
committerBrian Curtin <brian@python.org>2011-06-13 21:10:32 (GMT)
commita87d586fd6c4a5dfe4ea89fda288ae8eb66b0134 (patch)
tree420fe483c679d2225cc8bd82eefaecf783999268 /Lib
parentd25aef55c8b0025dd2ee7de11b526f34ceed6b66 (diff)
parentcdc751720ee7a13ac163da1eedf3a513386c98d4 (diff)
downloadcpython-a87d586fd6c4a5dfe4ea89fda288ae8eb66b0134.zip
cpython-a87d586fd6c4a5dfe4ea89fda288ae8eb66b0134.tar.gz
cpython-a87d586fd6c4a5dfe4ea89fda288ae8eb66b0134.tar.bz2
branch merge?
Diffstat (limited to 'Lib')
-rw-r--r--Lib/idlelib/config-main.def4
-rw-r--r--Lib/inspect.py8
-rw-r--r--Lib/logging/handlers.py6
-rw-r--r--Lib/netrc.py12
-rw-r--r--Lib/ntpath.py11
-rwxr-xr-xLib/smtplib.py2
-rw-r--r--Lib/test/support.py5
-rw-r--r--Lib/test/test_inspect.py17
-rw-r--r--Lib/test/test_netrc.py131
-rw-r--r--Lib/test/test_smtplib.py15
-rw-r--r--Lib/test/test_zipfile.py18
-rw-r--r--Lib/zipfile.py18
12 files changed, 186 insertions, 61 deletions
diff --git a/Lib/idlelib/config-main.def b/Lib/idlelib/config-main.def
index 5ddd098..9546e2b 100644
--- a/Lib/idlelib/config-main.def
+++ b/Lib/idlelib/config-main.def
@@ -46,8 +46,8 @@
[General]
editor-on-startup= 0
autosave= 0
-print-command-posix=lpr %s
-print-command-win=start /min notepad /p %s
+print-command-posix=lpr %%s
+print-command-win=start /min notepad /p %%s
delete-exitfunc= 1
[EditorWindow]
diff --git a/Lib/inspect.py b/Lib/inspect.py
index 4899cbf..bb46ea6 100644
--- a/Lib/inspect.py
+++ b/Lib/inspect.py
@@ -518,9 +518,13 @@ def findsource(object):
or code object. The source code is returned as a list of all the lines
in the file and the line number indexes a line in that list. An IOError
is raised if the source code cannot be retrieved."""
- file = getsourcefile(object)
- if not file:
+
+ file = getfile(object)
+ sourcefile = getsourcefile(object)
+ if not sourcefile and file[0] + file[-1] != '<>':
raise IOError('source code not available')
+ file = sourcefile if sourcefile else file
+
module = getmodule(object, file)
if module:
lines = linecache.getlines(file, module.__dict__)
diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py
index 306cf86..4a6b959 100644
--- a/Lib/logging/handlers.py
+++ b/Lib/logging/handlers.py
@@ -766,6 +766,8 @@ class SysLogHandler(logging.Handler):
"""
return self.priority_map.get(levelName, "warning")
+ append_nul = True # some old syslog daemons expect a NUL terminator
+
def emit(self, record):
"""
Emit a record.
@@ -773,7 +775,9 @@ class SysLogHandler(logging.Handler):
The record is formatted, and then sent to the syslog server. If
exception information is present, it is NOT sent to the server.
"""
- msg = self.format(record) + '\000'
+ msg = self.format(record)
+ if self.append_nul:
+ msg += '\000'
"""
We need to convert record level to lowercase, maybe this will
change in the future.
diff --git a/Lib/netrc.py b/Lib/netrc.py
index a60b8b7..c96db6f 100644
--- a/Lib/netrc.py
+++ b/Lib/netrc.py
@@ -2,7 +2,7 @@
# Module and documentation by Eric S. Raymond, 21 Dec 1998
-import os, shlex
+import io, os, shlex
__all__ = ["netrc", "NetrcParseError"]
@@ -37,12 +37,14 @@ class netrc:
lexer.commenters = lexer.commenters.replace('#', '')
while 1:
# Look for a machine, default, or macdef top-level keyword
+ saved_lineno = lexer.lineno
toplevel = tt = lexer.get_token()
if not tt:
break
elif tt[0] == '#':
- fp.readline();
- continue;
+ if lexer.lineno == saved_lineno and len(tt) == 1:
+ lexer.instream.readline()
+ continue
elif tt == 'machine':
entryname = lexer.get_token()
elif tt == 'default':
@@ -68,8 +70,8 @@ class netrc:
self.hosts[entryname] = {}
while 1:
tt = lexer.get_token()
- if (tt=='' or tt == 'machine' or
- tt == 'default' or tt =='macdef'):
+ if (tt.startswith('#') or
+ tt in {'', 'machine', 'default', 'macdef'}):
if password:
self.hosts[entryname] = (login, account, password)
lexer.push_token(tt)
diff --git a/Lib/ntpath.py b/Lib/ntpath.py
index ec8a7ab..826be87 100644
--- a/Lib/ntpath.py
+++ b/Lib/ntpath.py
@@ -672,3 +672,14 @@ except ImportError:
def sameopenfile(f1, f2):
"""Test whether two file objects reference the same file"""
return _getfileinformation(f1) == _getfileinformation(f2)
+
+
+try:
+ # The genericpath.isdir implementation uses os.stat and checks the mode
+ # attribute to tell whether or not the path is a directory.
+ # This is overkill on Windows - just pass the path to GetFileAttributes
+ # and check the attribute from there.
+ from nt import _isdir as isdir
+except ImportError:
+ # Use genericpath.isdir as imported above.
+ pass
diff --git a/Lib/smtplib.py b/Lib/smtplib.py
index dbccf48..ce71699 100755
--- a/Lib/smtplib.py
+++ b/Lib/smtplib.py
@@ -162,7 +162,7 @@ def quotedata(data):
re.sub(r'(?:\r\n|\n|\r(?!\n))', CRLF, data))
def _quote_periods(bindata):
- return re.sub(br'(?m)^\.', '..', bindata)
+ return re.sub(br'(?m)^\.', b'..', bindata)
def _fix_eols(data):
return re.sub(r'(?:\r\n|\n|\r(?!\n))', CRLF, data)
diff --git a/Lib/test/support.py b/Lib/test/support.py
index 9c8f6d3..25aab2e 100644
--- a/Lib/test/support.py
+++ b/Lib/test/support.py
@@ -1487,11 +1487,14 @@ def can_symlink():
global _can_symlink
if _can_symlink is not None:
return _can_symlink
+ symlink_path = TESTFN + "can_symlink"
try:
- os.symlink(TESTFN, TESTFN + "can_symlink")
+ os.symlink(TESTFN, symlink_path)
can = True
except (OSError, NotImplementedError, AttributeError):
can = False
+ else:
+ os.remove(symlink_path)
_can_symlink = can
return can
diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py
index f5dff1e..7666fe4 100644
--- a/Lib/test/test_inspect.py
+++ b/Lib/test/test_inspect.py
@@ -298,6 +298,23 @@ class TestRetrievingSourceCode(GetSourceBase):
del sys.modules[name]
inspect.getmodule(compile('a=10','','single'))
+ def test_proceed_with_fake_filename(self):
+ '''doctest monkeypatches linecache to enable inspection'''
+ fn, source = '<test>', 'def x(): pass\n'
+ getlines = linecache.getlines
+ def monkey(filename, module_globals=None):
+ if filename == fn:
+ return source.splitlines(True)
+ else:
+ return getlines(filename, module_globals)
+ linecache.getlines = monkey
+ try:
+ ns = {}
+ exec(compile(source, fn, 'single'), ns)
+ inspect.getsource(ns["x"])
+ finally:
+ linecache.getlines = getlines
+
class TestDecorators(GetSourceBase):
fodderModule = mod2
diff --git a/Lib/test/test_netrc.py b/Lib/test/test_netrc.py
index da7ec05..ef70e37 100644
--- a/Lib/test/test_netrc.py
+++ b/Lib/test/test_netrc.py
@@ -1,54 +1,107 @@
-
-import netrc, os, unittest, sys
+import netrc, os, unittest, sys, textwrap
from test import support
-TEST_NETRC = """
-
- #this is a comment
-#this is a comment
-# this is a comment
-
-machine foo login log1 password pass1 account acct1
-machine bar login log1 password pass# account acct1
-
-macdef macro1
-line1
-line2
-
-macdef macro2
-line3
-line4
-
-default login log2 password pass2
-
-"""
-
temp_filename = support.TESTFN
class NetrcTestCase(unittest.TestCase):
- def setUp(self):
- mode = 'w'
- if sys.platform not in ['cygwin']:
- mode += 't'
- fp = open(temp_filename, mode)
- fp.write(TEST_NETRC)
- fp.close()
- self.nrc = netrc.netrc(temp_filename)
-
def tearDown(self):
os.unlink(temp_filename)
- def test_case_1(self):
- self.assertEqual(self.nrc.hosts['foo'], ('log1', 'acct1', 'pass1'))
- self.assertEqual(self.nrc.hosts['default'], ('log2', None, 'pass2'))
+ def make_nrc(self, test_data):
+ test_data = textwrap.dedent(test_data)
+ mode = 'w'
+ if sys.platform != 'cygwin':
+ mode += 't'
+ with open(temp_filename, mode) as fp:
+ fp.write(test_data)
+ return netrc.netrc(temp_filename)
+
+ def test_default(self):
+ nrc = self.make_nrc("""\
+ machine host1.domain.com login log1 password pass1 account acct1
+ default login log2 password pass2
+ """)
+ self.assertEqual(nrc.hosts['host1.domain.com'],
+ ('log1', 'acct1', 'pass1'))
+ self.assertEqual(nrc.hosts['default'], ('log2', None, 'pass2'))
def test_macros(self):
- self.assertEqual(self.nrc.macros, {'macro1':['line1\n', 'line2\n'],
- 'macro2':['line3\n', 'line4\n']})
+ nrc = self.make_nrc("""\
+ macdef macro1
+ line1
+ line2
+
+ macdef macro2
+ line3
+ line4
+ """)
+ self.assertEqual(nrc.macros, {'macro1': ['line1\n', 'line2\n'],
+ 'macro2': ['line3\n', 'line4\n']})
+
+ def _test_passwords(self, nrc, passwd):
+ nrc = self.make_nrc(nrc)
+ self.assertEqual(nrc.hosts['host.domain.com'], ('log', 'acct', passwd))
+
+ def test_password_with_leading_hash(self):
+ self._test_passwords("""\
+ machine host.domain.com login log password #pass account acct
+ """, '#pass')
+
+ def test_password_with_trailing_hash(self):
+ self._test_passwords("""\
+ machine host.domain.com login log password pass# account acct
+ """, 'pass#')
+
+ def test_password_with_internal_hash(self):
+ self._test_passwords("""\
+ machine host.domain.com login log password pa#ss account acct
+ """, 'pa#ss')
+
+ def _test_comment(self, nrc, passwd='pass'):
+ nrc = self.make_nrc(nrc)
+ self.assertEqual(nrc.hosts['foo.domain.com'], ('bar', None, passwd))
+ self.assertEqual(nrc.hosts['bar.domain.com'], ('foo', None, 'pass'))
+
+ def test_comment_before_machine_line(self):
+ self._test_comment("""\
+ # comment
+ machine foo.domain.com login bar password pass
+ machine bar.domain.com login foo password pass
+ """)
+
+ def test_comment_before_machine_line_no_space(self):
+ self._test_comment("""\
+ #comment
+ machine foo.domain.com login bar password pass
+ machine bar.domain.com login foo password pass
+ """)
+
+ def test_comment_before_machine_line_hash_only(self):
+ self._test_comment("""\
+ #
+ machine foo.domain.com login bar password pass
+ machine bar.domain.com login foo password pass
+ """)
+
+ def test_comment_at_end_of_machine_line(self):
+ self._test_comment("""\
+ machine foo.domain.com login bar password pass # comment
+ machine bar.domain.com login foo password pass
+ """)
+
+ def test_comment_at_end_of_machine_line_no_space(self):
+ self._test_comment("""\
+ machine foo.domain.com login bar password pass #comment
+ machine bar.domain.com login foo password pass
+ """)
+
+ def test_comment_at_end_of_machine_line_pass_has_hash(self):
+ self._test_comment("""\
+ machine foo.domain.com login bar password #pass #comment
+ machine bar.domain.com login foo password pass
+ """, '#pass')
- def test_parses_passwords_with_hash_character(self):
- self.assertEqual(self.nrc.hosts['bar'], ('log1', 'acct1', 'pass#'))
def test_main():
support.run_unittest(NetrcTestCase)
diff --git a/Lib/test/test_smtplib.py b/Lib/test/test_smtplib.py
index 884529f..dd92044 100644
--- a/Lib/test/test_smtplib.py
+++ b/Lib/test/test_smtplib.py
@@ -278,6 +278,21 @@ class DebuggingServerTests(unittest.TestCase):
mexpect = '%s%s\n%s' % (MSG_BEGIN, m.decode('ascii'), MSG_END)
self.assertEqual(self.output.getvalue(), mexpect)
+ def testSendNeedingDotQuote(self):
+ # Issue 12283
+ m = '.A test\n.mes.sage.'
+ smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3)
+ smtp.sendmail('John', 'Sally', m)
+ # XXX (see comment in testSend)
+ time.sleep(0.01)
+ smtp.quit()
+
+ self.client_evt.set()
+ self.serv_evt.wait()
+ self.output.flush()
+ mexpect = '%s%s\n%s' % (MSG_BEGIN, m, MSG_END)
+ self.assertEqual(self.output.getvalue(), mexpect)
+
def testSendMessage(self):
m = email.mime.text.MIMEText('A test message')
smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3)
diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py
index 90aab86..782020c 100644
--- a/Lib/test/test_zipfile.py
+++ b/Lib/test/test_zipfile.py
@@ -351,6 +351,24 @@ class TestsWithSourceFile(unittest.TestCase):
with zipfile.ZipFile(f, "r") as zipfp:
self.assertEqual(zipfp.namelist(), [TESTFN])
+ def test_ignores_newline_at_end(self):
+ with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_STORED) as zipfp:
+ zipfp.write(TESTFN, TESTFN)
+ with open(TESTFN2, 'a') as f:
+ f.write("\r\n\00\00\00")
+ with zipfile.ZipFile(TESTFN2, "r") as zipfp:
+ self.assertIsInstance(zipfp, zipfile.ZipFile)
+
+ def test_ignores_stuff_appended_past_comments(self):
+ with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_STORED) as zipfp:
+ zipfp.comment = b"this is a comment"
+ zipfp.write(TESTFN, TESTFN)
+ with open(TESTFN2, 'a') as f:
+ f.write("abcdef\r\n")
+ with zipfile.ZipFile(TESTFN2, "r") as zipfp:
+ self.assertIsInstance(zipfp, zipfile.ZipFile)
+ self.assertEqual(zipfp.comment, b"this is a comment")
+
def test_write_default_name(self):
"""Check that calling ZipFile.write without arcname specified
produces the expected result."""
diff --git a/Lib/zipfile.py b/Lib/zipfile.py
index 50f4848..5cc7816 100644
--- a/Lib/zipfile.py
+++ b/Lib/zipfile.py
@@ -246,16 +246,14 @@ def _EndRecData(fpin):
# found the magic number; attempt to unpack and interpret
recData = data[start:start+sizeEndCentDir]
endrec = list(struct.unpack(structEndArchive, recData))
- comment = data[start+sizeEndCentDir:]
- # check that comment length is correct
- if endrec[_ECD_COMMENT_SIZE] == len(comment):
- # Append the archive comment and start offset
- endrec.append(comment)
- endrec.append(maxCommentStart + start)
-
- # Try to read the "Zip64 end of central directory" structure
- return _EndRecData64(fpin, maxCommentStart + start - filesize,
- endrec)
+ commentSize = endrec[_ECD_COMMENT_SIZE] #as claimed by the zip file
+ comment = data[start+sizeEndCentDir:start+sizeEndCentDir+commentSize]
+ endrec.append(comment)
+ endrec.append(maxCommentStart + start)
+
+ # Try to read the "Zip64 end of central directory" structure
+ return _EndRecData64(fpin, maxCommentStart + start - filesize,
+ endrec)
# Unable to find a valid end of central directory structure
return