Author: Maciej Fijalkowski <fij...@gmail.com> Branch: Changeset: r52443:c8ebd9df585a Date: 2012-02-14 12:26 +0200 http://bitbucket.org/pypy/pypy/changeset/c8ebd9df585a/
Log: merge diff --git a/lib_pypy/ctypes_config_cache/pyexpat.ctc.py b/lib_pypy/ctypes_config_cache/pyexpat.ctc.py deleted file mode 100644 --- a/lib_pypy/ctypes_config_cache/pyexpat.ctc.py +++ /dev/null @@ -1,45 +0,0 @@ -""" -'ctypes_configure' source for pyexpat.py. -Run this to rebuild _pyexpat_cache.py. -""" - -import ctypes -from ctypes import c_char_p, c_int, c_void_p, c_char -from ctypes_configure import configure -import dumpcache - - -class CConfigure: - _compilation_info_ = configure.ExternalCompilationInfo( - includes = ['expat.h'], - libraries = ['expat'], - pre_include_lines = [ - '#define XML_COMBINED_VERSION (10000*XML_MAJOR_VERSION+100*XML_MINOR_VERSION+XML_MICRO_VERSION)'], - ) - - XML_Char = configure.SimpleType('XML_Char', c_char) - XML_COMBINED_VERSION = configure.ConstantInteger('XML_COMBINED_VERSION') - for name in ['XML_PARAM_ENTITY_PARSING_NEVER', - 'XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE', - 'XML_PARAM_ENTITY_PARSING_ALWAYS']: - locals()[name] = configure.ConstantInteger(name) - - XML_Encoding = configure.Struct('XML_Encoding',[ - ('data', c_void_p), - ('convert', c_void_p), - ('release', c_void_p), - ('map', c_int * 256)]) - XML_Content = configure.Struct('XML_Content',[ - ('numchildren', c_int), - ('children', c_void_p), - ('name', c_char_p), - ('type', c_int), - ('quant', c_int), - ]) - # this is insanely stupid - XML_FALSE = configure.ConstantInteger('XML_FALSE') - XML_TRUE = configure.ConstantInteger('XML_TRUE') - -config = configure.configure(CConfigure) - -dumpcache.dumpcache2('pyexpat', config) diff --git a/lib_pypy/ctypes_config_cache/test/test_cache.py b/lib_pypy/ctypes_config_cache/test/test_cache.py --- a/lib_pypy/ctypes_config_cache/test/test_cache.py +++ b/lib_pypy/ctypes_config_cache/test/test_cache.py @@ -39,10 +39,6 @@ d = run('resource.ctc.py', '_resource_cache.py') assert 'RLIM_NLIMITS' in d -def test_pyexpat(): - d = run('pyexpat.ctc.py', '_pyexpat_cache.py') - assert 'XML_COMBINED_VERSION' in d - def test_locale(): d = run('locale.ctc.py', '_locale_cache.py') assert 'LC_ALL' in d diff --git a/lib_pypy/datetime.py b/lib_pypy/datetime.py --- a/lib_pypy/datetime.py +++ b/lib_pypy/datetime.py @@ -271,8 +271,9 @@ raise ValueError("%s()=%d, must be in -1439..1439" % (name, offset)) def _check_date_fields(year, month, day): - if not isinstance(year, (int, long)): - raise TypeError('int expected') + for value in [year, day]: + if not isinstance(value, (int, long)): + raise TypeError('int expected') if not MINYEAR <= year <= MAXYEAR: raise ValueError('year must be in %d..%d' % (MINYEAR, MAXYEAR), year) if not 1 <= month <= 12: @@ -282,8 +283,9 @@ raise ValueError('day must be in 1..%d' % dim, day) def _check_time_fields(hour, minute, second, microsecond): - if not isinstance(hour, (int, long)): - raise TypeError('int expected') + for value in [hour, minute, second, microsecond]: + if not isinstance(value, (int, long)): + raise TypeError('int expected') if not 0 <= hour <= 23: raise ValueError('hour must be in 0..23', hour) if not 0 <= minute <= 59: diff --git a/lib_pypy/pyexpat.py b/lib_pypy/pyexpat.py deleted file mode 100644 --- a/lib_pypy/pyexpat.py +++ /dev/null @@ -1,448 +0,0 @@ - -import ctypes -import ctypes.util -from ctypes import c_char_p, c_int, c_void_p, POINTER, c_char, c_wchar_p -import sys - -# load the platform-specific cache made by running pyexpat.ctc.py -from ctypes_config_cache._pyexpat_cache import * - -try: from __pypy__ import builtinify -except ImportError: builtinify = lambda f: f - - -lib = ctypes.CDLL(ctypes.util.find_library('expat')) - - -XML_Content.children = POINTER(XML_Content) -XML_Parser = ctypes.c_void_p # an opaque pointer -assert XML_Char is ctypes.c_char # this assumption is everywhere in -# cpython's expat, let's explode - -def declare_external(name, args, res): - func = getattr(lib, name) - func.args = args - func.restype = res - globals()[name] = func - -declare_external('XML_ParserCreate', [c_char_p], XML_Parser) -declare_external('XML_ParserCreateNS', [c_char_p, c_char], XML_Parser) -declare_external('XML_Parse', [XML_Parser, c_char_p, c_int, c_int], c_int) -currents = ['CurrentLineNumber', 'CurrentColumnNumber', - 'CurrentByteIndex'] -for name in currents: - func = getattr(lib, 'XML_Get' + name) - func.args = [XML_Parser] - func.restype = c_int - -declare_external('XML_SetReturnNSTriplet', [XML_Parser, c_int], None) -declare_external('XML_GetSpecifiedAttributeCount', [XML_Parser], c_int) -declare_external('XML_SetParamEntityParsing', [XML_Parser, c_int], None) -declare_external('XML_GetErrorCode', [XML_Parser], c_int) -declare_external('XML_StopParser', [XML_Parser, c_int], None) -declare_external('XML_ErrorString', [c_int], c_char_p) -declare_external('XML_SetBase', [XML_Parser, c_char_p], None) -if XML_COMBINED_VERSION >= 19505: - declare_external('XML_UseForeignDTD', [XML_Parser, c_int], None) - -declare_external('XML_SetUnknownEncodingHandler', [XML_Parser, c_void_p, - c_void_p], None) -declare_external('XML_FreeContentModel', [XML_Parser, POINTER(XML_Content)], - None) -declare_external('XML_ExternalEntityParserCreate', [XML_Parser,c_char_p, - c_char_p], - XML_Parser) - -handler_names = [ - 'StartElement', - 'EndElement', - 'ProcessingInstruction', - 'CharacterData', - 'UnparsedEntityDecl', - 'NotationDecl', - 'StartNamespaceDecl', - 'EndNamespaceDecl', - 'Comment', - 'StartCdataSection', - 'EndCdataSection', - 'Default', - 'DefaultHandlerExpand', - 'NotStandalone', - 'ExternalEntityRef', - 'StartDoctypeDecl', - 'EndDoctypeDecl', - 'EntityDecl', - 'XmlDecl', - 'ElementDecl', - 'AttlistDecl', - ] -if XML_COMBINED_VERSION >= 19504: - handler_names.append('SkippedEntity') -setters = {} - -for name in handler_names: - if name == 'DefaultHandlerExpand': - newname = 'XML_SetDefaultHandlerExpand' - else: - name += 'Handler' - newname = 'XML_Set' + name - cfunc = getattr(lib, newname) - cfunc.args = [XML_Parser, ctypes.c_void_p] - cfunc.result = ctypes.c_int - setters[name] = cfunc - -class ExpatError(Exception): - def __str__(self): - return self.s - -error = ExpatError - -class XMLParserType(object): - specified_attributes = 0 - ordered_attributes = 0 - returns_unicode = 1 - encoding = 'utf-8' - def __init__(self, encoding, namespace_separator, _hook_external_entity=False): - self.returns_unicode = 1 - if encoding: - self.encoding = encoding - if not _hook_external_entity: - if namespace_separator is None: - self.itself = XML_ParserCreate(encoding) - else: - self.itself = XML_ParserCreateNS(encoding, ord(namespace_separator)) - if not self.itself: - raise RuntimeError("Creating parser failed") - self._set_unknown_encoding_handler() - self.storage = {} - self.buffer = None - self.buffer_size = 8192 - self.character_data_handler = None - self.intern = {} - self.__exc_info = None - - def _flush_character_buffer(self): - if not self.buffer: - return - res = self._call_character_handler(''.join(self.buffer)) - self.buffer = [] - return res - - def _call_character_handler(self, buf): - if self.character_data_handler: - self.character_data_handler(buf) - - def _set_unknown_encoding_handler(self): - def UnknownEncoding(encodingData, name, info_p): - info = info_p.contents - s = ''.join([chr(i) for i in range(256)]) - u = s.decode(self.encoding, 'replace') - for i in range(len(u)): - if u[i] == u'\xfffd': - info.map[i] = -1 - else: - info.map[i] = ord(u[i]) - info.data = None - info.convert = None - info.release = None - return 1 - - CB = ctypes.CFUNCTYPE(c_int, c_void_p, c_char_p, POINTER(XML_Encoding)) - cb = CB(UnknownEncoding) - self._unknown_encoding_handler = (cb, UnknownEncoding) - XML_SetUnknownEncodingHandler(self.itself, cb, None) - - def _set_error(self, code): - e = ExpatError() - e.code = code - lineno = lib.XML_GetCurrentLineNumber(self.itself) - colno = lib.XML_GetCurrentColumnNumber(self.itself) - e.offset = colno - e.lineno = lineno - err = XML_ErrorString(code)[:200] - e.s = "%s: line: %d, column: %d" % (err, lineno, colno) - e.message = e.s - self._error = e - - def Parse(self, data, is_final=0): - res = XML_Parse(self.itself, data, len(data), is_final) - if res == 0: - self._set_error(XML_GetErrorCode(self.itself)) - if self.__exc_info: - exc_info = self.__exc_info - self.__exc_info = None - raise exc_info[0], exc_info[1], exc_info[2] - else: - raise self._error - self._flush_character_buffer() - return res - - def _sethandler(self, name, real_cb): - setter = setters[name] - try: - cb = self.storage[(name, real_cb)] - except KeyError: - cb = getattr(self, 'get_cb_for_%s' % name)(real_cb) - self.storage[(name, real_cb)] = cb - except TypeError: - # weellll... - cb = getattr(self, 'get_cb_for_%s' % name)(real_cb) - setter(self.itself, cb) - - def _wrap_cb(self, cb): - def f(*args): - try: - return cb(*args) - except: - self.__exc_info = sys.exc_info() - XML_StopParser(self.itself, XML_FALSE) - return f - - def get_cb_for_StartElementHandler(self, real_cb): - def StartElement(unused, name, attrs): - # unpack name and attrs - conv = self.conv - self._flush_character_buffer() - if self.specified_attributes: - max = XML_GetSpecifiedAttributeCount(self.itself) - else: - max = 0 - while attrs[max]: - max += 2 # copied - if self.ordered_attributes: - res = [attrs[i] for i in range(max)] - else: - res = {} - for i in range(0, max, 2): - res[conv(attrs[i])] = conv(attrs[i + 1]) - real_cb(conv(name), res) - StartElement = self._wrap_cb(StartElement) - CB = ctypes.CFUNCTYPE(None, c_void_p, c_char_p, POINTER(c_char_p)) - return CB(StartElement) - - def get_cb_for_ExternalEntityRefHandler(self, real_cb): - def ExternalEntity(unused, context, base, sysId, pubId): - self._flush_character_buffer() - conv = self.conv - res = real_cb(conv(context), conv(base), conv(sysId), - conv(pubId)) - if res is None: - return 0 - return res - ExternalEntity = self._wrap_cb(ExternalEntity) - CB = ctypes.CFUNCTYPE(c_int, c_void_p, *([c_char_p] * 4)) - return CB(ExternalEntity) - - def get_cb_for_CharacterDataHandler(self, real_cb): - def CharacterData(unused, s, lgt): - if self.buffer is None: - self._call_character_handler(self.conv(s[:lgt])) - else: - if len(self.buffer) + lgt > self.buffer_size: - self._flush_character_buffer() - if self.character_data_handler is None: - return - if lgt >= self.buffer_size: - self._call_character_handler(s[:lgt]) - self.buffer = [] - else: - self.buffer.append(s[:lgt]) - CharacterData = self._wrap_cb(CharacterData) - CB = ctypes.CFUNCTYPE(None, c_void_p, POINTER(c_char), c_int) - return CB(CharacterData) - - def get_cb_for_NotStandaloneHandler(self, real_cb): - def NotStandaloneHandler(unused): - return real_cb() - NotStandaloneHandler = self._wrap_cb(NotStandaloneHandler) - CB = ctypes.CFUNCTYPE(c_int, c_void_p) - return CB(NotStandaloneHandler) - - def get_cb_for_EntityDeclHandler(self, real_cb): - def EntityDecl(unused, ename, is_param, value, value_len, base, - system_id, pub_id, not_name): - self._flush_character_buffer() - if not value: - value = None - else: - value = value[:value_len] - args = [ename, is_param, value, base, system_id, - pub_id, not_name] - args = [self.conv(arg) for arg in args] - real_cb(*args) - EntityDecl = self._wrap_cb(EntityDecl) - CB = ctypes.CFUNCTYPE(None, c_void_p, c_char_p, c_int, c_char_p, - c_int, c_char_p, c_char_p, c_char_p, c_char_p) - return CB(EntityDecl) - - def _conv_content_model(self, model): - children = tuple([self._conv_content_model(model.children[i]) - for i in range(model.numchildren)]) - return (model.type, model.quant, self.conv(model.name), - children) - - def get_cb_for_ElementDeclHandler(self, real_cb): - def ElementDecl(unused, name, model): - self._flush_character_buffer() - modelobj = self._conv_content_model(model[0]) - real_cb(name, modelobj) - XML_FreeContentModel(self.itself, model) - - ElementDecl = self._wrap_cb(ElementDecl) - CB = ctypes.CFUNCTYPE(None, c_void_p, c_char_p, POINTER(XML_Content)) - return CB(ElementDecl) - - def _new_callback_for_string_len(name, sign): - def get_callback_for_(self, real_cb): - def func(unused, s, len): - self._flush_character_buffer() - arg = self.conv(s[:len]) - real_cb(arg) - func.func_name = name - func = self._wrap_cb(func) - CB = ctypes.CFUNCTYPE(*sign) - return CB(func) - get_callback_for_.func_name = 'get_cb_for_' + name - return get_callback_for_ - - for name in ['DefaultHandlerExpand', - 'DefaultHandler']: - sign = [None, c_void_p, POINTER(c_char), c_int] - name = 'get_cb_for_' + name - locals()[name] = _new_callback_for_string_len(name, sign) - - def _new_callback_for_starargs(name, sign): - def get_callback_for_(self, real_cb): - def func(unused, *args): - self._flush_character_buffer() - args = [self.conv(arg) for arg in args] - real_cb(*args) - func.func_name = name - func = self._wrap_cb(func) - CB = ctypes.CFUNCTYPE(*sign) - return CB(func) - get_callback_for_.func_name = 'get_cb_for_' + name - return get_callback_for_ - - for name, num_or_sign in [ - ('EndElementHandler', 1), - ('ProcessingInstructionHandler', 2), - ('UnparsedEntityDeclHandler', 5), - ('NotationDeclHandler', 4), - ('StartNamespaceDeclHandler', 2), - ('EndNamespaceDeclHandler', 1), - ('CommentHandler', 1), - ('StartCdataSectionHandler', 0), - ('EndCdataSectionHandler', 0), - ('StartDoctypeDeclHandler', [None, c_void_p] + [c_char_p] * 3 + [c_int]), - ('XmlDeclHandler', [None, c_void_p, c_char_p, c_char_p, c_int]), - ('AttlistDeclHandler', [None, c_void_p] + [c_char_p] * 4 + [c_int]), - ('EndDoctypeDeclHandler', 0), - ('SkippedEntityHandler', [None, c_void_p, c_char_p, c_int]), - ]: - if isinstance(num_or_sign, int): - sign = [None, c_void_p] + [c_char_p] * num_or_sign - else: - sign = num_or_sign - name = 'get_cb_for_' + name - locals()[name] = _new_callback_for_starargs(name, sign) - - def conv_unicode(self, s): - if s is None or isinstance(s, int): - return s - return s.decode(self.encoding, "strict") - - def __setattr__(self, name, value): - # forest of ifs... - if name in ['ordered_attributes', - 'returns_unicode', 'specified_attributes']: - if value: - if name == 'returns_unicode': - self.conv = self.conv_unicode - self.__dict__[name] = 1 - else: - if name == 'returns_unicode': - self.conv = lambda s: s - self.__dict__[name] = 0 - elif name == 'buffer_text': - if value: - self.buffer = [] - else: - self._flush_character_buffer() - self.buffer = None - elif name == 'buffer_size': - if not isinstance(value, int): - raise TypeError("Expected int") - if value <= 0: - raise ValueError("Expected positive int") - self.__dict__[name] = value - elif name == 'namespace_prefixes': - XML_SetReturnNSTriplet(self.itself, int(bool(value))) - elif name in setters: - if name == 'CharacterDataHandler': - # XXX we need to flush buffer here - self._flush_character_buffer() - self.character_data_handler = value - #print name - #print value - #print - self._sethandler(name, value) - else: - self.__dict__[name] = value - - def SetParamEntityParsing(self, arg): - XML_SetParamEntityParsing(self.itself, arg) - - if XML_COMBINED_VERSION >= 19505: - def UseForeignDTD(self, arg=True): - if arg: - flag = XML_TRUE - else: - flag = XML_FALSE - XML_UseForeignDTD(self.itself, flag) - - def __getattr__(self, name): - if name == 'buffer_text': - return self.buffer is not None - elif name in currents: - return getattr(lib, 'XML_Get' + name)(self.itself) - elif name == 'ErrorColumnNumber': - return lib.XML_GetCurrentColumnNumber(self.itself) - elif name == 'ErrorLineNumber': - return lib.XML_GetCurrentLineNumber(self.itself) - return self.__dict__[name] - - def ParseFile(self, file): - return self.Parse(file.read(), False) - - def SetBase(self, base): - XML_SetBase(self.itself, base) - - def ExternalEntityParserCreate(self, context, encoding=None): - """ExternalEntityParserCreate(context[, encoding]) - Create a parser for parsing an external entity based on the - information passed to the ExternalEntityRefHandler.""" - new_parser = XMLParserType(encoding, None, True) - new_parser.itself = XML_ExternalEntityParserCreate(self.itself, - context, encoding) - new_parser._set_unknown_encoding_handler() - return new_parser - -@builtinify -def ErrorString(errno): - return XML_ErrorString(errno)[:200] - -@builtinify -def ParserCreate(encoding=None, namespace_separator=None, intern=None): - if (not isinstance(encoding, str) and - not encoding is None): - raise TypeError("ParserCreate() argument 1 must be string or None, not %s" % encoding.__class__.__name__) - if (not isinstance(namespace_separator, str) and - not namespace_separator is None): - raise TypeError("ParserCreate() argument 2 must be string or None, not %s" % namespace_separator.__class__.__name__) - if namespace_separator is not None: - if len(namespace_separator) > 1: - raise ValueError('namespace_separator must be at most one character, omitted, or None') - if len(namespace_separator) == 0: - namespace_separator = None - return XMLParserType(encoding, namespace_separator) diff --git a/lib_pypy/pypy_test/test_pyexpat.py b/lib_pypy/pypy_test/test_pyexpat.py deleted file mode 100644 --- a/lib_pypy/pypy_test/test_pyexpat.py +++ /dev/null @@ -1,665 +0,0 @@ -# XXX TypeErrors on calling handlers, or on bad return values from a -# handler, are obscure and unhelpful. - -from __future__ import absolute_import -import StringIO, sys -import unittest, py - -from lib_pypy.ctypes_config_cache import rebuild -rebuild.rebuild_one('pyexpat.ctc.py') - -from lib_pypy import pyexpat -#from xml.parsers import expat -expat = pyexpat - -from test.test_support import sortdict, run_unittest - - -class TestSetAttribute: - def setup_method(self, meth): - self.parser = expat.ParserCreate(namespace_separator='!') - self.set_get_pairs = [ - [0, 0], - [1, 1], - [2, 1], - [0, 0], - ] - - def test_returns_unicode(self): - for x, y in self.set_get_pairs: - self.parser.returns_unicode = x - assert self.parser.returns_unicode == y - - def test_ordered_attributes(self): - for x, y in self.set_get_pairs: - self.parser.ordered_attributes = x - assert self.parser.ordered_attributes == y - - def test_specified_attributes(self): - for x, y in self.set_get_pairs: - self.parser.specified_attributes = x - assert self.parser.specified_attributes == y - - -data = '''\ -<?xml version="1.0" encoding="iso-8859-1" standalone="no"?> -<?xml-stylesheet href="stylesheet.css"?> -<!-- comment data --> -<!DOCTYPE quotations SYSTEM "quotations.dtd" [ -<!ELEMENT root ANY> -<!ATTLIST root attr1 CDATA #REQUIRED attr2 CDATA #IMPLIED> -<!NOTATION notation SYSTEM "notation.jpeg"> -<!ENTITY acirc "â"> -<!ENTITY external_entity SYSTEM "entity.file"> -<!ENTITY unparsed_entity SYSTEM "entity.file" NDATA notation> -%unparsed_entity; -]> - -<root attr1="value1" attr2="value2ὀ"> -<myns:subelement xmlns:myns="http://www.python.org/namespace"> - Contents of subelements -</myns:subelement> -<sub2><![CDATA[contents of CDATA section]]></sub2> -&external_entity; -&skipped_entity; -</root> -''' - - -# Produce UTF-8 output -class TestParse: - class Outputter: - def __init__(self): - self.out = [] - - def StartElementHandler(self, name, attrs): - self.out.append('Start element: ' + repr(name) + ' ' + - sortdict(attrs)) - - def EndElementHandler(self, name): - self.out.append('End element: ' + repr(name)) - - def CharacterDataHandler(self, data): - data = data.strip() - if data: - self.out.append('Character data: ' + repr(data)) - - def ProcessingInstructionHandler(self, target, data): - self.out.append('PI: ' + repr(target) + ' ' + repr(data)) - - def StartNamespaceDeclHandler(self, prefix, uri): - self.out.append('NS decl: ' + repr(prefix) + ' ' + repr(uri)) - - def EndNamespaceDeclHandler(self, prefix): - self.out.append('End of NS decl: ' + repr(prefix)) - - def StartCdataSectionHandler(self): - self.out.append('Start of CDATA section') - - def EndCdataSectionHandler(self): - self.out.append('End of CDATA section') - - def CommentHandler(self, text): - self.out.append('Comment: ' + repr(text)) - - def NotationDeclHandler(self, *args): - name, base, sysid, pubid = args - self.out.append('Notation declared: %s' %(args,)) - - def UnparsedEntityDeclHandler(self, *args): - entityName, base, systemId, publicId, notationName = args - self.out.append('Unparsed entity decl: %s' %(args,)) - - def NotStandaloneHandler(self): - self.out.append('Not standalone') - return 1 - - def ExternalEntityRefHandler(self, *args): - context, base, sysId, pubId = args - self.out.append('External entity ref: %s' %(args[1:],)) - return 1 - - def StartDoctypeDeclHandler(self, *args): - self.out.append(('Start doctype', args)) - return 1 - - def EndDoctypeDeclHandler(self): - self.out.append("End doctype") - return 1 - - def EntityDeclHandler(self, *args): - self.out.append(('Entity declaration', args)) - return 1 - - def XmlDeclHandler(self, *args): - self.out.append(('XML declaration', args)) - return 1 - - def ElementDeclHandler(self, *args): - self.out.append(('Element declaration', args)) - return 1 - - def AttlistDeclHandler(self, *args): - self.out.append(('Attribute list declaration', args)) - return 1 - - def SkippedEntityHandler(self, *args): - self.out.append(("Skipped entity", args)) - return 1 - - def DefaultHandler(self, userData): - pass - - def DefaultHandlerExpand(self, userData): - pass - - handler_names = [ - 'StartElementHandler', 'EndElementHandler', 'CharacterDataHandler', - 'ProcessingInstructionHandler', 'UnparsedEntityDeclHandler', - 'NotationDeclHandler', 'StartNamespaceDeclHandler', - 'EndNamespaceDeclHandler', 'CommentHandler', - 'StartCdataSectionHandler', 'EndCdataSectionHandler', 'DefaultHandler', - 'DefaultHandlerExpand', 'NotStandaloneHandler', - 'ExternalEntityRefHandler', 'StartDoctypeDeclHandler', - 'EndDoctypeDeclHandler', 'EntityDeclHandler', 'XmlDeclHandler', - 'ElementDeclHandler', 'AttlistDeclHandler', 'SkippedEntityHandler', - ] - - def test_utf8(self): - - out = self.Outputter() - parser = expat.ParserCreate(namespace_separator='!') - for name in self.handler_names: - setattr(parser, name, getattr(out, name)) - parser.returns_unicode = 0 - parser.Parse(data, 1) - - # Verify output - operations = out.out - expected_operations = [ - ('XML declaration', (u'1.0', u'iso-8859-1', 0)), - 'PI: \'xml-stylesheet\' \'href="stylesheet.css"\'', - "Comment: ' comment data '", - "Not standalone", - ("Start doctype", ('quotations', 'quotations.dtd', None, 1)), - ('Element declaration', (u'root', (2, 0, None, ()))), - ('Attribute list declaration', ('root', 'attr1', 'CDATA', None, - 1)), - ('Attribute list declaration', ('root', 'attr2', 'CDATA', None, - 0)), - "Notation declared: ('notation', None, 'notation.jpeg', None)", - ('Entity declaration', ('acirc', 0, '\xc3\xa2', None, None, None, None)), - ('Entity declaration', ('external_entity', 0, None, None, - 'entity.file', None, None)), - "Unparsed entity decl: ('unparsed_entity', None, 'entity.file', None, 'notation')", - "Not standalone", - "End doctype", - "Start element: 'root' {'attr1': 'value1', 'attr2': 'value2\\xe1\\xbd\\x80'}", - "NS decl: 'myns' 'http://www.python.org/namespace'", - "Start element: 'http://www.python.org/namespace!subelement' {}", - "Character data: 'Contents of subelements'", - "End element: 'http://www.python.org/namespace!subelement'", - "End of NS decl: 'myns'", - "Start element: 'sub2' {}", - 'Start of CDATA section', - "Character data: 'contents of CDATA section'", - 'End of CDATA section', - "End element: 'sub2'", - "External entity ref: (None, 'entity.file', None)", - ('Skipped entity', ('skipped_entity', 0)), - "End element: 'root'", - ] - for operation, expected_operation in zip(operations, expected_operations): - assert operation == expected_operation - - def test_unicode(self): - # Try the parse again, this time producing Unicode output - out = self.Outputter() - parser = expat.ParserCreate(namespace_separator='!') - parser.returns_unicode = 1 - for name in self.handler_names: - setattr(parser, name, getattr(out, name)) - - parser.Parse(data, 1) - - operations = out.out - expected_operations = [ - ('XML declaration', (u'1.0', u'iso-8859-1', 0)), - 'PI: u\'xml-stylesheet\' u\'href="stylesheet.css"\'', - "Comment: u' comment data '", - "Not standalone", - ("Start doctype", ('quotations', 'quotations.dtd', None, 1)), - ('Element declaration', (u'root', (2, 0, None, ()))), - ('Attribute list declaration', ('root', 'attr1', 'CDATA', None, - 1)), - ('Attribute list declaration', ('root', 'attr2', 'CDATA', None, - 0)), - "Notation declared: (u'notation', None, u'notation.jpeg', None)", - ('Entity declaration', (u'acirc', 0, u'\xe2', None, None, None, - None)), - ('Entity declaration', (u'external_entity', 0, None, None, - u'entity.file', None, None)), - "Unparsed entity decl: (u'unparsed_entity', None, u'entity.file', None, u'notation')", - "Not standalone", - "End doctype", - "Start element: u'root' {u'attr1': u'value1', u'attr2': u'value2\\u1f40'}", - "NS decl: u'myns' u'http://www.python.org/namespace'", - "Start element: u'http://www.python.org/namespace!subelement' {}", - "Character data: u'Contents of subelements'", - "End element: u'http://www.python.org/namespace!subelement'", - "End of NS decl: u'myns'", - "Start element: u'sub2' {}", - 'Start of CDATA section', - "Character data: u'contents of CDATA section'", - 'End of CDATA section', - "End element: u'sub2'", - "External entity ref: (None, u'entity.file', None)", - ('Skipped entity', ('skipped_entity', 0)), - "End element: u'root'", - ] - for operation, expected_operation in zip(operations, expected_operations): - assert operation == expected_operation - - def test_parse_file(self): - # Try parsing a file - out = self.Outputter() - parser = expat.ParserCreate(namespace_separator='!') - parser.returns_unicode = 1 - for name in self.handler_names: - setattr(parser, name, getattr(out, name)) - file = StringIO.StringIO(data) - - parser.ParseFile(file) - - operations = out.out - expected_operations = [ - ('XML declaration', (u'1.0', u'iso-8859-1', 0)), - 'PI: u\'xml-stylesheet\' u\'href="stylesheet.css"\'', - "Comment: u' comment data '", - "Not standalone", - ("Start doctype", ('quotations', 'quotations.dtd', None, 1)), - ('Element declaration', (u'root', (2, 0, None, ()))), - ('Attribute list declaration', ('root', 'attr1', 'CDATA', None, - 1)), - ('Attribute list declaration', ('root', 'attr2', 'CDATA', None, - 0)), - "Notation declared: (u'notation', None, u'notation.jpeg', None)", - ('Entity declaration', ('acirc', 0, u'\xe2', None, None, None, None)), - ('Entity declaration', (u'external_entity', 0, None, None, u'entity.file', None, None)), - "Unparsed entity decl: (u'unparsed_entity', None, u'entity.file', None, u'notation')", - "Not standalone", - "End doctype", - "Start element: u'root' {u'attr1': u'value1', u'attr2': u'value2\\u1f40'}", - "NS decl: u'myns' u'http://www.python.org/namespace'", - "Start element: u'http://www.python.org/namespace!subelement' {}", - "Character data: u'Contents of subelements'", - "End element: u'http://www.python.org/namespace!subelement'", - "End of NS decl: u'myns'", - "Start element: u'sub2' {}", - 'Start of CDATA section', - "Character data: u'contents of CDATA section'", - 'End of CDATA section', - "End element: u'sub2'", - "External entity ref: (None, u'entity.file', None)", - ('Skipped entity', ('skipped_entity', 0)), - "End element: u'root'", - ] - for operation, expected_operation in zip(operations, expected_operations): - assert operation == expected_operation - - -class TestNamespaceSeparator: - def test_legal(self): - # Tests that make sure we get errors when the namespace_separator value - # is illegal, and that we don't for good values: - expat.ParserCreate() - expat.ParserCreate(namespace_separator=None) - expat.ParserCreate(namespace_separator=' ') - - def test_illegal(self): - try: - expat.ParserCreate(namespace_separator=42) - raise AssertionError - except TypeError, e: - assert str(e) == ( - 'ParserCreate() argument 2 must be string or None, not int') - - try: - expat.ParserCreate(namespace_separator='too long') - raise AssertionError - except ValueError, e: - assert str(e) == ( - 'namespace_separator must be at most one character, omitted, or None') - - def test_zero_length(self): - # ParserCreate() needs to accept a namespace_separator of zero length - # to satisfy the requirements of RDF applications that are required - # to simply glue together the namespace URI and the localname. Though - # considered a wart of the RDF specifications, it needs to be supported. - # - # See XML-SIG mailing list thread starting with - # http://mail.python.org/pipermail/xml-sig/2001-April/005202.html - # - expat.ParserCreate(namespace_separator='') # too short - - -class TestInterning: - def test(self): - py.test.skip("Not working") - # Test the interning machinery. - p = expat.ParserCreate() - L = [] - def collector(name, *args): - L.append(name) - p.StartElementHandler = collector - p.EndElementHandler = collector - p.Parse("<e> <e/> <e></e> </e>", 1) - tag = L[0] - assert len(L) == 6 - for entry in L: - # L should have the same string repeated over and over. - assert tag is entry - - -class TestBufferText: - def setup_method(self, meth): - self.stuff = [] - self.parser = expat.ParserCreate() - self.parser.buffer_text = 1 - self.parser.CharacterDataHandler = self.CharacterDataHandler - - def check(self, expected, label): - assert self.stuff == expected, ( - "%s\nstuff = %r\nexpected = %r" - % (label, self.stuff, map(unicode, expected))) - - def CharacterDataHandler(self, text): - self.stuff.append(text) - - def StartElementHandler(self, name, attrs): - self.stuff.append("<%s>" % name) - bt = attrs.get("buffer-text") - if bt == "yes": - self.parser.buffer_text = 1 - elif bt == "no": - self.parser.buffer_text = 0 - - def EndElementHandler(self, name): - self.stuff.append("</%s>" % name) - - def CommentHandler(self, data): - self.stuff.append("<!--%s-->" % data) - - def setHandlers(self, handlers=[]): - for name in handlers: - setattr(self.parser, name, getattr(self, name)) - - def test_default_to_disabled(self): - parser = expat.ParserCreate() - assert not parser.buffer_text - - def test_buffering_enabled(self): - # Make sure buffering is turned on - assert self.parser.buffer_text - self.parser.Parse("<a>1<b/>2<c/>3</a>", 1) - assert self.stuff == ['123'], ( - "buffered text not properly collapsed") - - def test1(self): - # XXX This test exposes more detail of Expat's text chunking than we - # XXX like, but it tests what we need to concisely. - self.setHandlers(["StartElementHandler"]) - self.parser.Parse("<a>1<b buffer-text='no'/>2\n3<c buffer-text='yes'/>4\n5</a>", 1) - assert self.stuff == ( - ["<a>", "1", "<b>", "2", "\n", "3", "<c>", "4\n5"]), ( - "buffering control not reacting as expected") - - def test2(self): - self.parser.Parse("<a>1<b/><2><c/> \n 3</a>", 1) - assert self.stuff == ["1<2> \n 3"], ( - "buffered text not properly collapsed") - - def test3(self): - self.setHandlers(["StartElementHandler"]) - self.parser.Parse("<a>1<b/>2<c/>3</a>", 1) - assert self.stuff == ["<a>", "1", "<b>", "2", "<c>", "3"], ( - "buffered text not properly split") - - def test4(self): - self.setHandlers(["StartElementHandler", "EndElementHandler"]) - self.parser.CharacterDataHandler = None - self.parser.Parse("<a>1<b/>2<c/>3</a>", 1) - assert self.stuff == ( - ["<a>", "<b>", "</b>", "<c>", "</c>", "</a>"]) - - def test5(self): - self.setHandlers(["StartElementHandler", "EndElementHandler"]) - self.parser.Parse("<a>1<b></b>2<c/>3</a>", 1) - assert self.stuff == ( - ["<a>", "1", "<b>", "</b>", "2", "<c>", "</c>", "3", "</a>"]) - - def test6(self): - self.setHandlers(["CommentHandler", "EndElementHandler", - "StartElementHandler"]) - self.parser.Parse("<a>1<b/>2<c></c>345</a> ", 1) - assert self.stuff == ( - ["<a>", "1", "<b>", "</b>", "2", "<c>", "</c>", "345", "</a>"]), ( - "buffered text not properly split") - - def test7(self): - self.setHandlers(["CommentHandler", "EndElementHandler", - "StartElementHandler"]) - self.parser.Parse("<a>1<b/>2<c></c>3<!--abc-->4<!--def-->5</a> ", 1) - assert self.stuff == ( - ["<a>", "1", "<b>", "</b>", "2", "<c>", "</c>", "3", - "<!--abc-->", "4", "<!--def-->", "5", "</a>"]), ( - "buffered text not properly split") - - -# Test handling of exception from callback: -class TestHandlerException: - def StartElementHandler(self, name, attrs): - raise RuntimeError(name) - - def test(self): - parser = expat.ParserCreate() - parser.StartElementHandler = self.StartElementHandler - try: - parser.Parse("<a><b><c/></b></a>", 1) - raise AssertionError - except RuntimeError, e: - assert e.args[0] == 'a', ( - "Expected RuntimeError for element 'a', but" + \ - " found %r" % e.args[0]) - - -# Test Current* members: -class TestPosition: - def StartElementHandler(self, name, attrs): - self.check_pos('s') - - def EndElementHandler(self, name): - self.check_pos('e') - - def check_pos(self, event): - pos = (event, - self.parser.CurrentByteIndex, - self.parser.CurrentLineNumber, - self.parser.CurrentColumnNumber) - assert self.upto < len(self.expected_list) - expected = self.expected_list[self.upto] - assert pos == expected, ( - 'Expected position %s, got position %s' %(pos, expected)) - self.upto += 1 - - def test(self): - self.parser = expat.ParserCreate() - self.parser.StartElementHandler = self.StartElementHandler - self.parser.EndElementHandler = self.EndElementHandler - self.upto = 0 - self.expected_list = [('s', 0, 1, 0), ('s', 5, 2, 1), ('s', 11, 3, 2), - ('e', 15, 3, 6), ('e', 17, 4, 1), ('e', 22, 5, 0)] - - xml = '<a>\n <b>\n <c/>\n </b>\n</a>' - self.parser.Parse(xml, 1) - - -class Testsf1296433: - def test_parse_only_xml_data(self): - # http://python.org/sf/1296433 - # - xml = "<?xml version='1.0' encoding='iso8859'?><s>%s</s>" % ('a' * 1025) - # this one doesn't crash - #xml = "<?xml version='1.0'?><s>%s</s>" % ('a' * 10000) - - class SpecificException(Exception): - pass - - def handler(text): - raise SpecificException - - parser = expat.ParserCreate() - parser.CharacterDataHandler = handler - - py.test.raises(Exception, parser.Parse, xml) - -class TestChardataBuffer: - """ - test setting of chardata buffer size - """ - - def test_1025_bytes(self): - assert self.small_buffer_test(1025) == 2 - - def test_1000_bytes(self): - assert self.small_buffer_test(1000) == 1 - - def test_wrong_size(self): - parser = expat.ParserCreate() - parser.buffer_text = 1 - def f(size): - parser.buffer_size = size - - py.test.raises(TypeError, f, sys.maxint+1) - py.test.raises(ValueError, f, -1) - py.test.raises(ValueError, f, 0) - - def test_unchanged_size(self): - xml1 = ("<?xml version='1.0' encoding='iso8859'?><s>%s" % ('a' * 512)) - xml2 = 'a'*512 + '</s>' - parser = expat.ParserCreate() - parser.CharacterDataHandler = self.counting_handler - parser.buffer_size = 512 - parser.buffer_text = 1 - - # Feed 512 bytes of character data: the handler should be called - # once. - self.n = 0 - parser.Parse(xml1) - assert self.n == 1 - - # Reassign to buffer_size, but assign the same size. - parser.buffer_size = parser.buffer_size - assert self.n == 1 - - # Try parsing rest of the document - parser.Parse(xml2) - assert self.n == 2 - - - def test_disabling_buffer(self): - xml1 = "<?xml version='1.0' encoding='iso8859'?><a>%s" % ('a' * 512) - xml2 = ('b' * 1024) - xml3 = "%s</a>" % ('c' * 1024) - parser = expat.ParserCreate() - parser.CharacterDataHandler = self.counting_handler - parser.buffer_text = 1 - parser.buffer_size = 1024 - assert parser.buffer_size == 1024 - - # Parse one chunk of XML - self.n = 0 - parser.Parse(xml1, 0) - assert parser.buffer_size == 1024 - assert self.n == 1 - - # Turn off buffering and parse the next chunk. - parser.buffer_text = 0 - assert not parser.buffer_text - assert parser.buffer_size == 1024 - for i in range(10): - parser.Parse(xml2, 0) - assert self.n == 11 - - parser.buffer_text = 1 - assert parser.buffer_text - assert parser.buffer_size == 1024 - parser.Parse(xml3, 1) - assert self.n == 12 - - - - def make_document(self, bytes): - return ("<?xml version='1.0'?><tag>" + bytes * 'a' + '</tag>') - - def counting_handler(self, text): - self.n += 1 - - def small_buffer_test(self, buffer_len): - xml = "<?xml version='1.0' encoding='iso8859'?><s>%s</s>" % ('a' * buffer_len) - parser = expat.ParserCreate() - parser.CharacterDataHandler = self.counting_handler - parser.buffer_size = 1024 - parser.buffer_text = 1 - - self.n = 0 - parser.Parse(xml) - return self.n - - def test_change_size_1(self): - xml1 = "<?xml version='1.0' encoding='iso8859'?><a><s>%s" % ('a' * 1024) - xml2 = "aaa</s><s>%s</s></a>" % ('a' * 1025) - parser = expat.ParserCreate() - parser.CharacterDataHandler = self.counting_handler - parser.buffer_text = 1 - parser.buffer_size = 1024 - assert parser.buffer_size == 1024 - - self.n = 0 - parser.Parse(xml1, 0) - parser.buffer_size *= 2 - assert parser.buffer_size == 2048 - parser.Parse(xml2, 1) - assert self.n == 2 - - def test_change_size_2(self): - xml1 = "<?xml version='1.0' encoding='iso8859'?><a>a<s>%s" % ('a' * 1023) - xml2 = "aaa</s><s>%s</s></a>" % ('a' * 1025) - parser = expat.ParserCreate() - parser.CharacterDataHandler = self.counting_handler - parser.buffer_text = 1 - parser.buffer_size = 2048 - assert parser.buffer_size == 2048 - - self.n=0 - parser.Parse(xml1, 0) - parser.buffer_size /= 2 - assert parser.buffer_size == 1024 - parser.Parse(xml2, 1) - assert self.n == 4 - - def test_segfault(self): - py.test.raises(TypeError, expat.ParserCreate, 1234123123) - -def test_invalid_data(): - parser = expat.ParserCreate() - parser.Parse('invalid.xml', 0) - try: - parser.Parse("", 1) - except expat.ExpatError, e: - assert e.code == 2 # XXX is this reliable? - assert e.lineno == 1 - assert e.message.startswith('syntax error') - else: - py.test.fail("Did not raise") - diff --git a/pypy/doc/config/objspace.usemodules.pyexpat.txt b/pypy/doc/config/objspace.usemodules.pyexpat.txt --- a/pypy/doc/config/objspace.usemodules.pyexpat.txt +++ b/pypy/doc/config/objspace.usemodules.pyexpat.txt @@ -1,2 +1,1 @@ -Use (experimental) pyexpat module written in RPython, instead of CTypes -version which is used by default. +Use the pyexpat module, written in RPython. diff --git a/pypy/module/cpyext/api.py b/pypy/module/cpyext/api.py --- a/pypy/module/cpyext/api.py +++ b/pypy/module/cpyext/api.py @@ -23,6 +23,7 @@ from pypy.interpreter.function import StaticMethod from pypy.objspace.std.sliceobject import W_SliceObject from pypy.module.__builtin__.descriptor import W_Property +from pypy.module.__builtin__.interp_classobj import W_ClassObject from pypy.module.__builtin__.interp_memoryview import W_MemoryView from pypy.rlib.entrypoint import entrypoint from pypy.rlib.unroll import unrolling_iterable @@ -397,6 +398,7 @@ 'Module': 'space.gettypeobject(Module.typedef)', 'Property': 'space.gettypeobject(W_Property.typedef)', 'Slice': 'space.gettypeobject(W_SliceObject.typedef)', + 'Class': 'space.gettypeobject(W_ClassObject.typedef)', 'StaticMethod': 'space.gettypeobject(StaticMethod.typedef)', 'CFunction': 'space.gettypeobject(cpyext.methodobject.W_PyCFunctionObject.typedef)', 'WrapperDescr': 'space.gettypeobject(cpyext.methodobject.W_PyCMethodObject.typedef)' diff --git a/pypy/module/cpyext/test/test_classobject.py b/pypy/module/cpyext/test/test_classobject.py --- a/pypy/module/cpyext/test/test_classobject.py +++ b/pypy/module/cpyext/test/test_classobject.py @@ -1,4 +1,5 @@ from pypy.module.cpyext.test.test_api import BaseApiTest +from pypy.module.cpyext.test.test_cpyext import AppTestCpythonExtensionBase from pypy.interpreter.function import Function, Method class TestClassObject(BaseApiTest): @@ -51,3 +52,14 @@ assert api.PyInstance_Check(w_instance) assert space.is_true(space.call_method(space.builtin, "isinstance", w_instance, w_class)) + +class AppTestStringObject(AppTestCpythonExtensionBase): + def test_class_type(self): + module = self.import_extension('foo', [ + ("get_classtype", "METH_NOARGS", + """ + Py_INCREF(&PyClass_Type); + return &PyClass_Type; + """)]) + class C: pass + assert module.get_classtype() is type(C) diff --git a/pypy/module/test_lib_pypy/test_datetime.py b/pypy/module/test_lib_pypy/test_datetime.py --- a/pypy/module/test_lib_pypy/test_datetime.py +++ b/pypy/module/test_lib_pypy/test_datetime.py @@ -1,7 +1,10 @@ """Additional tests for datetime.""" +import py + import time import datetime +import copy import os def test_utcfromtimestamp(): @@ -26,3 +29,18 @@ def test_utcfromtimestamp_microsecond(): dt = datetime.datetime.utcfromtimestamp(0) assert isinstance(dt.microsecond, int) + + +def test_integer_args(): + with py.test.raises(TypeError): + datetime.datetime(10, 10, 10.) + with py.test.raises(TypeError): + datetime.datetime(10, 10, 10, 10, 10.) + with py.test.raises(TypeError): + datetime.datetime(10, 10, 10, 10, 10, 10.) + +def test_utcnow_microsecond(): + dt = datetime.datetime.utcnow() + assert type(dt.microsecond) is int + + copy.copy(dt) \ No newline at end of file diff --git a/pypy/rlib/libffi.py b/pypy/rlib/libffi.py --- a/pypy/rlib/libffi.py +++ b/pypy/rlib/libffi.py @@ -238,7 +238,7 @@ self = jit.promote(self) if argchain.numargs != len(self.argtypes): raise TypeError, 'Wrong number of arguments: %d expected, got %d' %\ - (argchain.numargs, len(self.argtypes)) + (len(self.argtypes), argchain.numargs) ll_args = self._prepare() i = 0 arg = argchain.first _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit