Skip to content

Commit

Permalink
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,6050…
Browse files Browse the repository at this point in the history
…1-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60878,60880-60892,60894-60898 via svnmerge from

svn+ssh://[email protected]/python/trunk

........
  r60876 | georg.brandl | 2008-02-17 16:14:10 +0100 (Sun, 17 Feb 2008) | 2 lines

  Fix function name.
........
  r60877 | facundo.batista | 2008-02-17 17:21:13 +0100 (Sun, 17 Feb 2008) | 4 lines


  Now we handle different the backup copy, because of security
  issues regarding user/group and permissions. Fixes 1050828.
........
  r60878 | facundo.batista | 2008-02-17 19:59:29 +0100 (Sun, 17 Feb 2008) | 4 lines


  Issue 2112. mmap does not raises EnvironmentError no more, but
  a subclass of it. Thanks John Lenton.
........
  r60882 | amaury.forgeotdarc | 2008-02-17 21:56:31 +0100 (Sun, 17 Feb 2008) | 5 lines

  Compilation was broken on Windows since the introduction of Advanced String Formatting.

  Only PCBuild (vs9) was really tested.
  Changes for older compilers were done manually.
........
  r60883 | georg.brandl | 2008-02-17 22:18:55 +0100 (Sun, 17 Feb 2008) | 2 lines

  python#2133: fix HTML color spec.
........
  r60884 | facundo.batista | 2008-02-18 04:43:43 +0100 (Mon, 18 Feb 2008) | 5 lines


  Issue python#1916. Added isgenerator() and isgeneratorfunction() to
  inspect.py.  Thanks Javi Mansilla for patch review and
  corrections.
........
  r60885 | facundo.batista | 2008-02-18 13:48:43 +0100 (Mon, 18 Feb 2008) | 4 lines


  Issue 1224. Now we support again the double slash in the URL.
  Thanks Anthony Lenton.
........
  r60887 | eric.smith | 2008-02-18 15:25:02 +0100 (Mon, 18 Feb 2008) | 1 line

  Temporarily removed float tests.  See issue 1600.
........
  r60891 | kristjan.jonsson | 2008-02-18 18:40:47 +0100 (Mon, 18 Feb 2008) | 1 line

  Perform correct handling of stack overflow for windows: Catch the correct exception code and reset the overflow condition when handled.
........
  • Loading branch information
tiran committed Feb 19, 2008
1 parent 5edc1c2 commit 7131fd9
Show file tree
Hide file tree
Showing 15 changed files with 1,979 additions and 41 deletions.
2 changes: 1 addition & 1 deletion Doc/c-api/tuple.rst
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,6 @@ Tuple Objects
``*p`` is destroyed. On failure, returns ``-1`` and sets ``*p`` to *NULL*, and
raises :exc:`MemoryError` or :exc:`SystemError`.

.. cfunction:: int PyMethod_ClearFreeList(void)
.. cfunction:: int PyTuple_ClearFreeList(void)

Clear the free list. Return the total number of freed items.
12 changes: 11 additions & 1 deletion Doc/library/inspect.rst
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ Types and members
-----------------

The :func:`getmembers` function retrieves the members of an object such as a
class or module. The eleven functions whose names begin with "is" are mainly
class or module. The fifteen functions whose names begin with "is" are mainly
provided as convenient choices for the second argument to :func:`getmembers`.
They also help you determine when you can expect to find the following special
attributes:
Expand Down Expand Up @@ -229,6 +229,16 @@ attributes:
Return true if the object is a Python function or unnamed (:term:`lambda`) function.


.. function:: isgeneratorfunction(object)

Return true if the object is a Python generator function.


.. function:: isgenerator(object)

Return true if the object is a generator.


.. function:: istraceback(object)

Return true if the object is a traceback.
Expand Down
3 changes: 2 additions & 1 deletion Lib/SimpleHTTPServer.py
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,8 @@ def translate_path(self, path):
"""
# abandon query parameters
path = urlparse.urlparse(path)[2]
path = path.split('?',1)[0]
path = path.split('#',1)[0]
path = posixpath.normpath(urllib.unquote(path))
words = path.split('/')
words = filter(None, words)
Expand Down
52 changes: 46 additions & 6 deletions Lib/inspect.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@
Here are some of the useful functions provided by this module:
ismodule(), isclass(), ismethod(), isfunction(), istraceback(),
isframe(), iscode(), isbuiltin(), isroutine() - check object types
ismodule(), isclass(), ismethod(), isfunction(), isgeneratorfunction(),
isgenerator(), istraceback(), isframe(), iscode(), isbuiltin(),
isroutine() - check object types
getmembers() - get members of an object that satisfy a given condition
getfile(), getsourcefile(), getsource() - find an object's source code
Expand All @@ -29,9 +30,20 @@
__author__ = 'Ka-Ping Yee <[email protected]>'
__date__ = '1 Jan 2001'

import sys, os, types, re, dis, imp, tokenize, linecache
import sys
import os
import types
import string
import re
import dis
import imp
import tokenize
import linecache
from operator import attrgetter
from collections import namedtuple
# These constants are from Include/code.h.
CO_OPTIMIZED, CO_NEWLOCALS, CO_VARARGS, CO_VARKEYWORDS = 0x1, 0x2, 0x4, 0x8
CO_NESTED, CO_GENERATOR, CO_NOFREE = 0x10, 0x20, 0x40

# ----------------------------------------------------------- type-checking
def ismodule(object):
Expand Down Expand Up @@ -137,6 +149,33 @@ def isfunction(object):
__kwdefaults__ dict of keyword only parameters with defaults"""
return isinstance(object, types.FunctionType)

def isgeneratorfunction(object):
"""Return true if the object is a user-defined generator function.
Generator function objects provides same attributes as functions.
See isfunction.__doc__ for attributes listing."""
if (isfunction(object) or ismethod(object)) and \
object.__code__.co_flags & CO_GENERATOR:
return True

def isgenerator(object):
"""Return true if the object is a generator.
Generator objects provide these attributes:
__iter__ defined to support interation over container
close raises a new GeneratorExit exception inside the
generator to terminate the iteration
gi_code code object
gi_frame frame object or possibly None once the generator has
been exhausted
gi_running set to 1 when generator is executing, 0 otherwise
next return the next item from the container
send resumes the generator and "sends" a value that becomes
the result of the current yield-expression
throw used to raise an exception inside the generator"""
return isinstance(object, types.GeneratorType)

def istraceback(object):
"""Return true if the object is a traceback.
Expand Down Expand Up @@ -198,6 +237,10 @@ def isroutine(object):
or ismethod(object)
or ismethoddescriptor(object))

def isgenerator(object):
"""Return true if the object is a generator object."""
return isinstance(object, types.GeneratorType)

def getmembers(object, predicate=None):
"""Return all members of an object as (name, value) pairs sorted by name.
Optionally, only return members that satisfy a given predicate."""
Expand Down Expand Up @@ -670,9 +713,6 @@ def getclasstree(classes, unique=0):
return walktree(roots, children, None)

# ------------------------------------------------ argument list extraction
# These constants are from Python's compile.h.
CO_OPTIMIZED, CO_NEWLOCALS, CO_VARARGS, CO_VARKEYWORDS = 1, 2, 4, 8

Arguments = namedtuple('Arguments', 'args, varargs, varkw')

def getargs(co):
Expand Down
2 changes: 1 addition & 1 deletion Lib/pydoc.py
Original file line number Diff line number Diff line change
Expand Up @@ -660,7 +660,7 @@ def docmodule(self, object, name=None, mod=None, *ignored):
contents = self.multicolumn(
modules, lambda t: self.modulelink(t[1]))
result = result + self.bigsection(
'Modules', '#fffff', '#aa55cc', contents)
'Modules', '#ffffff', '#aa55cc', contents)

if classes:
classlist = [value for (key, value) in classes]
Expand Down
41 changes: 41 additions & 0 deletions Lib/test/test_SimpleHTTPServer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
"""
These tests only check url parsing for now.
We don't want to require the 'network' resource.
"""

import os, unittest
from SimpleHTTPServer import SimpleHTTPRequestHandler
from test import test_support


class SocketlessRequestHandler (SimpleHTTPRequestHandler):
def __init__(self):
pass

class SimpleHTTPRequestHandlerTestCase(unittest.TestCase):
""" Test url parsing """
def setUp (self):
self.translated = os.getcwd()
self.translated = os.path.join(self.translated, 'filename')
self.handler = SocketlessRequestHandler ()

def test_queryArguments (self):
path = self.handler.translate_path ('/filename')
self.assertEquals (path, self.translated)
path = self.handler.translate_path ('/filename?foo=bar')
self.assertEquals (path, self.translated)
path = self.handler.translate_path ('/filename?a=b&spam=eggs#zot')
self.assertEquals (path, self.translated)

def test_startWithDoubleSlash (self):
path = self.handler.translate_path ('//filename')
self.assertEquals (path, self.translated)
path = self.handler.translate_path ('//filename?foo=bar')
self.assertEquals (path, self.translated)


def test_main():
test_support.run_unittest(SimpleHTTPRequestHandlerTestCase)

if __name__ == "__main__":
test_main()
28 changes: 20 additions & 8 deletions Lib/test/test_inspect.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@

# Functions tested in this suite:
# ismodule, isclass, ismethod, isfunction, istraceback, isframe, iscode,
# isbuiltin, isroutine, getmembers, getdoc, getfile, getmodule,
# getsourcefile, getcomments, getsource, getclasstree, getargspec,
# getargvalues, formatargspec, formatargvalues, currentframe, stack, trace
# isdatadescriptor
# isbuiltin, isroutine, isgenerator, isgeneratorfunction, getmembers,
# getdoc, getfile, getmodule, getsourcefile, getcomments, getsource,
# getclasstree, getargspec, getargvalues, formatargspec, formatargvalues,
# currentframe, stack, trace, isdatadescriptor

modfile = mod.__file__
if modfile.endswith(('c', 'o')):
Expand All @@ -41,23 +41,33 @@ def revise(filename, *args):
class IsTestBase(unittest.TestCase):
predicates = set([inspect.isbuiltin, inspect.isclass, inspect.iscode,
inspect.isframe, inspect.isfunction, inspect.ismethod,
inspect.ismodule, inspect.istraceback])
inspect.ismodule, inspect.istraceback,
inspect.isgenerator, inspect.isgeneratorfunction])

def istest(self, predicate, exp):
obj = eval(exp)
self.failUnless(predicate(obj), '%s(%s)' % (predicate.__name__, exp))

for other in self.predicates - set([predicate]):
if predicate == inspect.isgeneratorfunction and\
other == inspect.isfunction:
continue
self.failIf(other(obj), 'not %s(%s)' % (other.__name__, exp))

def generator_function_example(self):
for i in range(2):
yield i

class TestPredicates(IsTestBase):
def test_thirteen(self):
def test_fifteen(self):
count = len([x for x in dir(inspect) if x.startswith('is')])
# Doc/lib/libinspect.tex claims there are 13 such functions
expected = 13
# This test is here for remember you to update Doc/library/inspect.rst
# which claims there are 15 such functions
expected = 15
err_msg = "There are %d (not %d) is* functions" % (count, expected)
self.assertEqual(count, expected, err_msg)


def test_excluding_predicates(self):
self.istest(inspect.isbuiltin, 'sys.exit')
self.istest(inspect.isbuiltin, '[].append')
Expand All @@ -70,6 +80,8 @@ def test_excluding_predicates(self):
self.istest(inspect.ismodule, 'mod')
self.istest(inspect.istraceback, 'tb')
self.istest(inspect.isdatadescriptor, 'collections.defaultdict.default_factory')
self.istest(inspect.isgenerator, '(x for x in range(2))')
self.istest(inspect.isgeneratorfunction, 'generator_function_example')
if hasattr(types, 'GetSetDescriptorType'):
self.istest(inspect.isgetsetdescriptor,
'type(tb.tb_frame).f_locals')
Expand Down
5 changes: 5 additions & 0 deletions Lib/test/test_mmap.py
Original file line number Diff line number Diff line change
Expand Up @@ -435,6 +435,11 @@ def test_prot_readonly(self):
self.assertRaises(TypeError, m.write, "foo")


def test_error(self):
self.assert_(issubclass(mmap.error, EnvironmentError))
self.assert_("mmap.error" in str(mmap.error))


def test_main():
run_unittest(MmapTests)

Expand Down
Loading

0 comments on commit 7131fd9

Please sign in to comment.