From lxml-checkins at codespeak.net Sat Nov 1 08:07:49 2008 From: lxml-checkins at codespeak.net (VIAGRA INC) Date: Sat, 1 Nov 2008 08:07:49 +0100 (CET) Subject: [Lxml-checkins] SALE 89% OFF Message-ID: <20081101-50605.28056.qmail@c3nat.acxiom.com> An HTML attachment was scrubbed... URL: http://codespeak.net/pipermail/lxml-checkins/attachments/20081101/0eaa9e11/attachment-0001.htm From scoder at codespeak.net Tue Nov 4 07:38:13 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Tue, 4 Nov 2008 07:38:13 +0100 (CET) Subject: [Lxml-checkins] r59714 - in lxml/trunk: . src/lxml Message-ID: <20081104063813.2FD05169F9B@codespeak.net> Author: scoder Date: Tue Nov 4 07:38:11 2008 New Revision: 59714 Modified: lxml/trunk/ (props changed) lxml/trunk/src/lxml/xmlerror.pxi Log: r4831 at delle: sbehnel | 2008-11-04 07:37:20 +0100 fix an ignored UnicodeDecodeError when reporting parser encoding errors of non-UTF8 input Modified: lxml/trunk/src/lxml/xmlerror.pxi ============================================================================== --- lxml/trunk/src/lxml/xmlerror.pxi (original) +++ lxml/trunk/src/lxml/xmlerror.pxi Tue Nov 4 07:38:11 2008 @@ -53,7 +53,11 @@ size = cstd.strlen(error.message) if size > 0 and error.message[size-1] == c'\n': size = size - 1 # strip EOL - self.message = python.PyUnicode_DecodeUTF8(error.message, size, NULL) + try: + self.message = python.PyUnicode_DecodeUTF8( + error.message, size, NULL) + except: + self.message = repr(error.message) if error.file is NULL: self.filename = u'' else: From scoder at codespeak.net Thu Nov 6 22:17:43 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 6 Nov 2008 22:17:43 +0100 (CET) Subject: [Lxml-checkins] r59750 - lxml/trunk Message-ID: <20081106211743.050C616849E@codespeak.net> Author: scoder Date: Thu Nov 6 22:17:42 2008 New Revision: 59750 Added: lxml/trunk/buildlibxml.py Modified: lxml/trunk/ (props changed) lxml/trunk/setup.py lxml/trunk/setupinfo.py Log: r4835 at delle: sbehnel | 2008-11-06 22:16:35 +0100 new setup.py option '--static-deps' to trigger a complete download+build of libxml2/xslt as part the static build Added: lxml/trunk/buildlibxml.py ============================================================================== --- (empty file) +++ lxml/trunk/buildlibxml.py Thu Nov 6 22:17:42 2008 @@ -0,0 +1,199 @@ +import os, re +from distutils import log + +## Routines to download and build libxml2/xslt: + +LIBXML2_LOCATION = 'ftp://xmlsoft.org/libxml2/' +match_libfile_version = re.compile('^[^-]*-([.0-9-]+)[.].*').match + +def ftp_listdir(url): + import ftplib, urlparse, posixpath + scheme, netloc, path, qs, fragment = urlparse.urlsplit(url) + assert scheme.lower() == 'ftp' + server = ftplib.FTP(netloc) + server.login() + files = [posixpath.basename(fn) for fn in server.nlst(path)] + return files + +def tryint(s): + try: + return int(s) + except ValueError: + return s + +def download_libxml2(dest_dir, version=None): + """Downloads libxml2, returning the filename where the library was downloaded""" + version_re = re.compile(r'^LATEST_LIBXML2_IS_(.*)$') + filename = 'libxml2-%s.tar.gz' + return download_library(dest_dir, LIBXML2_LOCATION, 'libxml2', + version_re, filename, version=version) + +def download_libxslt(dest_dir, version=None): + """Downloads libxslt, returning the filename where the library was downloaded""" + version_re = re.compile(r'^LATEST_LIBXSLT_IS_(.*)$') + filename = 'libxslt-%s.tar.gz' + return download_library(dest_dir, LIBXML2_LOCATION, 'libxslt', + version_re, filename, version=version) + +def download_library(dest_dir, location, name, version_re, filename, + version=None): + import urllib, urlparse + if version is None: + try: + fns = ftp_listdir(location) + for fn in fns: + match = version_re.search(fn) + if match: + version = match.group(1) + print('Latest version of %s is %s' % (name, version)) + break + else: + raise Exception( + "Could not find the most current version of the %s from the files: %s" + % (name, fns)) + filename = filename % version + except IOError: + # network failure - maybe we have the files already? + latest = (0,0,0) + fns = os.listdir(dest_dir) + for fn in fns: + if fn.startswith(name+'-'): + match = match_libfile_version(fn) + if match: + version = tuple(map(tryint, match.group(1).split('.'))) + if version > latest: + latest = version + filename = fn + break + else: + raise + full_url = urlparse.urljoin(location, filename) + dest_filename = os.path.join(dest_dir, filename) + if os.path.exists(dest_filename): + print('Using existing %s downloaded into %s (delete this file if you want to re-download the package)' + % (name, dest_filename)) + else: + print('Downloading %s into %s' % (name, dest_filename)) + urllib.urlretrieve(full_url, dest_filename) + return dest_filename + +## Backported method of tarfile.TarFile.extractall (doesn't exist in 2.4): +def _extractall(self, path=".", members=None): + """Extract all members from the archive to the current working + directory and set owner, modification time and permissions on + directories afterwards. `path' specifies a different directory + to extract to. `members' is optional and must be a subset of the + list returned by getmembers(). + """ + import copy + is_ignored_file = re.compile( + r'''[\\/]((test|results?)[\\/] + |doc[\\/].*(Log|[.](out|imp|err|png|ent|gif|tif|pdf))$ + |tests[\\/](.*[\\/])?(?!Makefile)[^\\/]*$ + |python[\\/].*[.]py$ + ) + ''', re.X).search + + directories = [] + + if members is None: + members = self + + for tarinfo in members: + if is_ignored_file(tarinfo.name): + continue + if tarinfo.isdir(): + # Extract directories with a safe mode. + directories.append((tarinfo.name, tarinfo)) + tarinfo = copy.copy(tarinfo) + tarinfo.mode = 0700 + self.extract(tarinfo, path) + + # Reverse sort directories. + directories.sort() + directories.reverse() + + # Set correct owner, mtime and filemode on directories. + for name, tarinfo in directories: + dirpath = os.path.join(path, name) + try: + self.chown(tarinfo, dirpath) + self.utime(tarinfo, dirpath) + self.chmod(tarinfo, dirpath) + except ExtractError, e: + if self.errorlevel > 1: + raise + else: + self._dbg(1, "tarfile: %s" % e) + +def unpack_tarball(tar_filename, dest): + import tarfile + print('Unpacking %s into %s' % (os.path.basename(tar_filename), dest)) + tar = tarfile.open(tar_filename) + base_dir = None + for member in tar: + base_name = member.name.split('/')[0] + if base_dir is None: + base_dir = base_name + else: + if base_dir != base_name: + print('Unexpected path in %s: %s' % (tar_filename, base_name)) + _extractall(tar, dest) + tar.close() + return os.path.join(dest, base_dir) + +def call_subprocess(cmd, **kw): + import subprocess + cwd = kw.get('cwd', '.') + cmd_desc = ' '.join(cmd) + log.info('Running "%s" in %s' % (cmd_desc, cwd)) + returncode = subprocess.call(cmd, **kw) + if returncode: + raise Exception('Command "%s" returned code %s' % (cmd_desc, returncode)) + +def safe_mkdir(dir): + if not os.path.exists(dir): + os.makedirs(dir) + +def build_libxml2xslt(download_dir, build_dir, + static_include_dirs, static_library_dirs, + static_cflags, static_binaries, + libxml2_version=None, libxslt_version=None): + safe_mkdir(download_dir) + safe_mkdir(build_dir) + libxml2_dir = unpack_tarball(download_libxml2(download_dir, libxml2_version), build_dir) + libxslt_dir = unpack_tarball(download_libxslt(download_dir, libxslt_version), build_dir) + prefix = os.path.join(os.path.abspath(build_dir), 'libxml2') + safe_mkdir(prefix) + + configure_cmd = ['./configure', '--without-python', + '--disable-shared', '--prefix=%s' % prefix] + call_subprocess(configure_cmd, cwd=libxml2_dir) + call_subprocess( + ['make'], cwd=libxml2_dir) + call_subprocess( + ['make', 'install'], cwd=libxml2_dir) + + libxslt_configure_cmd = configure_cmd + ['--with-libxml2-src=%s' % libxml2_dir] + call_subprocess(libxslt_configure_cmd, cwd=libxslt_dir) + call_subprocess( + ['make'], cwd=libxslt_dir) + call_subprocess( + ['make', 'install'], cwd=libxslt_dir) + + xslt_config = os.path.join(prefix, 'bin', 'xslt-config') + xml2_config = os.path.join(prefix, 'bin', 'xml2-config') + + lib_dir = os.path.join(prefix, 'lib') + static_include_dirs.extend([ + os.path.join(prefix, 'include', 'libxml2'), + os.path.join(prefix, 'include', 'libxslt'), + os.path.join(prefix, 'include', 'libexslt')]) + static_library_dirs.append(lib_dir) + + for filename in os.listdir(lib_dir): + if [l for l in ['libxml2', 'libxslt', 'libexslt'] if l in filename]: + if [ext for ext in ['.a'] if filename.endswith(ext)]: + static_binaries.append(os.path.join(lib_dir,filename)) + + return (xml2_config, xslt_config) Modified: lxml/trunk/setup.py ============================================================================== --- lxml/trunk/setup.py (original) +++ lxml/trunk/setup.py Thu Nov 6 22:17:42 2008 @@ -33,7 +33,7 @@ STATIC_INCLUDE_DIRS = [] STATIC_LIBRARY_DIRS = [] STATIC_CFLAGS = [] - +STATIC_BINARIES = [] # create lxml-version.h file svn_version = versioninfo.svn_version() @@ -103,7 +103,8 @@ package_dir = {'': 'src'}, packages = ['lxml', 'lxml.html'], ext_modules = setupinfo.ext_modules( - STATIC_INCLUDE_DIRS, STATIC_LIBRARY_DIRS, STATIC_CFLAGS), + STATIC_INCLUDE_DIRS, STATIC_LIBRARY_DIRS, + STATIC_CFLAGS, STATIC_BINARIES), **extra_options ) Modified: lxml/trunk/setupinfo.py ============================================================================== --- lxml/trunk/setupinfo.py (original) +++ lxml/trunk/setupinfo.py Thu Nov 6 22:17:42 2008 @@ -1,7 +1,8 @@ import sys, os, os.path from distutils.core import Extension - +from distutils.errors import DistutilsOptionError from versioninfo import get_base_dir, split_version +from buildlibxml import build_libxml2xslt try: from Cython.Distutils import build_ext as build_pyx @@ -26,14 +27,23 @@ def decode_input(data): return data -def env_var(name): +def env_var(name, sep=None): value = os.getenv(name) if value: - return decode_input(value).split(os.pathsep) + return decode_input(value).split(sep) else: return [] -def ext_modules(static_include_dirs, static_library_dirs, static_cflags): +def ext_modules(static_include_dirs, static_library_dirs, + static_cflags, static_binaries): + global XML2_CONFIG, XSLT_CONFIG + if OPTION_BUILD_LIBXML2XSLT: + XML2_CONFIG, XSLT_CONFIG = build_libxml2xslt( + 'libs', 'build/tmp', + static_include_dirs, static_library_dirs, + static_cflags, static_binaries, + libxml2_version=OPTION_LIBXML2_VERSION, + libxslt_version=OPTION_LIBXSLT_VERSION) if CYTHON_INSTALLED: source_extension = ".pyx" print("Building with Cython %s." % Cython.Compiler.Version.version) @@ -76,7 +86,7 @@ runtime_library_dirs = _library_dirs else: runtime_library_dirs = [] - + result = [] for module in modules: main_module_source = PACKAGE_PATH + module + source_extension @@ -86,6 +96,7 @@ module, sources = [main_module_source] + dependencies, extra_compile_args = ['-w'] + _cflags, + extra_objects = static_binaries, define_macros = _define_macros, include_dirs = _include_dirs, library_dirs = _library_dirs, @@ -128,14 +139,13 @@ def libraries(): if sys.platform in ('win32',): - libs = ['libxslt', 'libexslt', 'libxml2', 'iconv'] + libs = ['libxslt', 'libexslt', 'libxml2', 'iconv', 'zlib', 'WS2_32'] + if OPTION_STATIC: + libs = ['%s_a' % lib for lib in libs] + elif OPTION_STATIC: + libs = ['z', 'm'] else: libs = ['xslt', 'exslt', 'xml2', 'z', 'm'] - if OPTION_STATIC: - if sys.platform in ('win32',): - libs = ['%s_a' % lib for lib in libs] - if sys.platform in ('win32',): - libs.extend(['zlib', 'WS2_32']) return libs def library_dirs(static_library_dirs): @@ -270,6 +280,8 @@ XSLT_CONFIG = os.getenv('XSLT_CONFIG', 'xslt-config') return XSLT_CONFIG +## Option handling: + def has_option(name): try: sys.argv.remove('--%s' % name) @@ -282,6 +294,22 @@ return True return False +def option_value(name): + for index, option in enumerate(sys.argv): + if option == '--' + name: + if index+1 >= len(sys.argv): + raise DistutilsOptionError( + 'The option %s requires a value' % option) + value = sys.argv[index+1] + sys.argv[index:index+2] = [] + return value + if option.startswith('--' + name + '='): + value = option[len(name)+3:] + sys.argv[index:index+1] = [] + return value + env_val = os.getenv(name.upper().replace('-', '_')) + return env_val + # pick up any commandline options OPTION_WITHOUT_OBJECTIFY = has_option('without-objectify') OPTION_WITHOUT_ASSERT = has_option('without-assert') @@ -289,3 +317,8 @@ OPTION_STATIC = has_option('static') OPTION_DEBUG_GCC = has_option('debug-gcc') OPTION_AUTO_RPATH = has_option('auto-rpath') +OPTION_BUILD_LIBXML2XSLT = has_option('static-deps') +if OPTION_BUILD_LIBXML2XSLT: + OPTION_STATIC = True +OPTION_LIBXML2_VERSION = option_value('libxml2-version') +OPTION_LIBXSLT_VERSION = option_value('libxslt-version') From scoder at codespeak.net Fri Nov 7 16:35:59 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 7 Nov 2008 16:35:59 +0100 (CET) Subject: [Lxml-checkins] r59765 - in lxml/trunk: . src/lxml Message-ID: <20081107153559.CFE2A16852C@codespeak.net> Author: scoder Date: Fri Nov 7 16:35:59 2008 New Revision: 59765 Modified: lxml/trunk/ (props changed) lxml/trunk/src/lxml/lxml.etree.pyx Log: r4842 at delle: sbehnel | 2008-11-07 16:35:08 +0100 compile fix Modified: lxml/trunk/src/lxml/lxml.etree.pyx ============================================================================== --- lxml/trunk/src/lxml/lxml.etree.pyx (original) +++ lxml/trunk/src/lxml/lxml.etree.pyx Fri Nov 7 16:35:59 2008 @@ -233,68 +233,9 @@ raise type, value, traceback -cdef class QName: - u"""QName(text_or_uri, tag=None) - - QName wrapper for qualified XML names. - - Pass a tag name by itself or a namespace URI and a tag name to - create a qualified name. - - The ``text`` property holds the qualified name in - ``{namespace}tagname`` notation. The ``namespace`` and - ``localname`` properties hold the respective parts of the tag - name. - - You can pass QName objects wherever a tag name is expected. Also, - setting Element text from a QName will resolve the namespace - prefix and set a qualified text value. - """ - cdef readonly object text - cdef readonly object localname - cdef readonly object namespace - def __init__(self, text_or_uri_or_element, tag=None): - if not _isString(text_or_uri_or_element): - if isinstance(text_or_uri_or_element, _Element): - text_or_uri_or_element = (<_Element>text_or_uri_or_element).tag - if not _isString(text_or_uri_or_element): - raise ValueError, ("Invalid input tag of type %r" % - type(text_or_uri_or_element)) - elif isinstance(text_or_uri_or_element, QName): - text_or_uri_or_element = (text_or_uri_or_element).text - else: - text_or_uri_or_element = unicode(text_or_uri_or_element) - - ns_utf, tag_utf = _getNsTag(text_or_uri_or_element) - if tag is not None: - # either ('ns', 'tag') or ('{ns}oldtag', 'newtag') - if ns_utf is None: - ns_utf = tag_utf # case 1: namespace ended up as tag name - tag_utf = _utf8(tag) - _tagValidOrRaise(tag_utf) - self.localname = python.PyUnicode_FromEncodedObject( - tag_utf, 'UTF-8', NULL) - if ns_utf is None: - self.namespace = None - self.text = self.localname - else: - self.namespace = python.PyUnicode_FromEncodedObject( - ns_utf, 'UTF-8', NULL) - self.text = u"{%s}%s" % (self.namespace, self.localname) - def __str__(self): - return self.text - def __hash__(self): - return self.text.__hash__() - def __richcmp__(one, other, int op): - if not _isString(one): - one = unicode(one) - if not _isString(other): - other = unicode(other) - return python.PyObject_RichCompare(one, other, op) - - # forward declaration of _BaseParser, see parser.pxi cdef class _BaseParser +cdef class QName ctypedef public xmlNode* (*_node_to_node_function)(xmlNode*) @@ -1507,6 +1448,66 @@ return u"&%s;" % self.name +cdef class QName: + u"""QName(text_or_uri, tag=None) + + QName wrapper for qualified XML names. + + Pass a tag name by itself or a namespace URI and a tag name to + create a qualified name. + + The ``text`` property holds the qualified name in + ``{namespace}tagname`` notation. The ``namespace`` and + ``localname`` properties hold the respective parts of the tag + name. + + You can pass QName objects wherever a tag name is expected. Also, + setting Element text from a QName will resolve the namespace + prefix and set a qualified text value. + """ + cdef readonly object text + cdef readonly object localname + cdef readonly object namespace + def __init__(self, text_or_uri_or_element, tag=None): + if not _isString(text_or_uri_or_element): + if isinstance(text_or_uri_or_element, _Element): + text_or_uri_or_element = (<_Element>text_or_uri_or_element).tag + if not _isString(text_or_uri_or_element): + raise ValueError, ("Invalid input tag of type %r" % + type(text_or_uri_or_element)) + elif isinstance(text_or_uri_or_element, QName): + text_or_uri_or_element = (text_or_uri_or_element).text + else: + text_or_uri_or_element = unicode(text_or_uri_or_element) + + ns_utf, tag_utf = _getNsTag(text_or_uri_or_element) + if tag is not None: + # either ('ns', 'tag') or ('{ns}oldtag', 'newtag') + if ns_utf is None: + ns_utf = tag_utf # case 1: namespace ended up as tag name + tag_utf = _utf8(tag) + _tagValidOrRaise(tag_utf) + self.localname = python.PyUnicode_FromEncodedObject( + tag_utf, 'UTF-8', NULL) + if ns_utf is None: + self.namespace = None + self.text = self.localname + else: + self.namespace = python.PyUnicode_FromEncodedObject( + ns_utf, 'UTF-8', NULL) + self.text = u"{%s}%s" % (self.namespace, self.localname) + def __str__(self): + return self.text + def __hash__(self): + return self.text.__hash__() + def __richcmp__(one, other, int op): + if not _isString(one): + one = unicode(one) + if not _isString(other): + other = unicode(other) + return python.PyObject_RichCompare(one, other, op) + + cdef public class _ElementTree [ type LxmlElementTreeType, object LxmlElementTree ]: cdef _Document _doc From scoder at codespeak.net Fri Nov 7 16:54:51 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 7 Nov 2008 16:54:51 +0100 (CET) Subject: [Lxml-checkins] r59766 - lxml/trunk Message-ID: <20081107155451.26AE01684FC@codespeak.net> Author: scoder Date: Fri Nov 7 16:54:49 2008 New Revision: 59766 Modified: lxml/trunk/ (props changed) lxml/trunk/setupinfo.py Log: r4844 at delle: sbehnel | 2008-11-07 16:54:01 +0100 quick trial-and-error build fix Modified: lxml/trunk/setupinfo.py ============================================================================== --- lxml/trunk/setupinfo.py (original) +++ lxml/trunk/setupinfo.py Fri Nov 7 16:54:49 2008 @@ -2,7 +2,6 @@ from distutils.core import Extension from distutils.errors import DistutilsOptionError from versioninfo import get_base_dir, split_version -from buildlibxml import build_libxml2xslt try: from Cython.Distutils import build_ext as build_pyx @@ -38,6 +37,7 @@ static_cflags, static_binaries): global XML2_CONFIG, XSLT_CONFIG if OPTION_BUILD_LIBXML2XSLT: + from buildlibxml import build_libxml2xslt XML2_CONFIG, XSLT_CONFIG = build_libxml2xslt( 'libs', 'build/tmp', static_include_dirs, static_library_dirs, @@ -143,7 +143,7 @@ if OPTION_STATIC: libs = ['%s_a' % lib for lib in libs] elif OPTION_STATIC: - libs = ['z', 'm'] + libs = ['iconv', 'z', 'm'] else: libs = ['xslt', 'exslt', 'xml2', 'z', 'm'] return libs From scoder at codespeak.net Fri Nov 7 20:46:58 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 7 Nov 2008 20:46:58 +0100 (CET) Subject: [Lxml-checkins] r59771 - lxml/trunk Message-ID: <20081107194658.40A5716850C@codespeak.net> Author: scoder Date: Fri Nov 7 20:46:55 2008 New Revision: 59771 Modified: lxml/trunk/ (props changed) lxml/trunk/buildlibxml.py Log: r4846 at delle: sbehnel | 2008-11-07 20:46:04 +0100 another fix for the static build Modified: lxml/trunk/buildlibxml.py ============================================================================== --- lxml/trunk/buildlibxml.py (original) +++ lxml/trunk/buildlibxml.py Fri Nov 7 20:46:55 2008 @@ -174,7 +174,7 @@ call_subprocess( ['make', 'install'], cwd=libxml2_dir) - libxslt_configure_cmd = configure_cmd + ['--with-libxml2-src=%s' % libxml2_dir] + libxslt_configure_cmd = configure_cmd + ['--with-libxml-prefix=%s' % prefix] call_subprocess(libxslt_configure_cmd, cwd=libxslt_dir) call_subprocess( ['make'], cwd=libxslt_dir) From scoder at codespeak.net Fri Nov 7 21:53:28 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 7 Nov 2008 21:53:28 +0100 (CET) Subject: [Lxml-checkins] r59772 - lxml/trunk Message-ID: <20081107205328.A033D1684C5@codespeak.net> Author: scoder Date: Fri Nov 7 21:53:26 2008 New Revision: 59772 Modified: lxml/trunk/ (props changed) lxml/trunk/setupinfo.py Log: r4848 at delle: sbehnel | 2008-11-07 21:52:38 +0100 moved unused lib back out Modified: lxml/trunk/setupinfo.py ============================================================================== --- lxml/trunk/setupinfo.py (original) +++ lxml/trunk/setupinfo.py Fri Nov 7 21:53:26 2008 @@ -143,7 +143,7 @@ if OPTION_STATIC: libs = ['%s_a' % lib for lib in libs] elif OPTION_STATIC: - libs = ['iconv', 'z', 'm'] + libs = ['z', 'm'] else: libs = ['xslt', 'exslt', 'xml2', 'z', 'm'] return libs From scoder at codespeak.net Sun Nov 9 16:27:08 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 9 Nov 2008 16:27:08 +0100 (CET) Subject: [Lxml-checkins] r59832 - in lxml/trunk: . doc Message-ID: <20081109152708.64387168410@codespeak.net> Author: scoder Date: Sun Nov 9 16:27:06 2008 New Revision: 59832 Modified: lxml/trunk/ (props changed) lxml/trunk/doc/build.txt Log: r4850 at delle: sbehnel | 2008-11-09 15:35:51 +0100 require Cython 0.10 officially Modified: lxml/trunk/doc/build.txt ============================================================================== --- lxml/trunk/doc/build.txt (original) +++ lxml/trunk/doc/build.txt Sun Nov 9 16:27:06 2008 @@ -44,10 +44,10 @@ want to be an lxml developer, then you do need a working Cython installation. You can use EasyInstall_ to install it:: - easy_install Cython==0.9.8 + easy_install Cython==0.10 -lxml currently requires Cython 0.9.8, later versions were not -tested. +lxml currently requires Cython 0.10, later versions were not +necessarily tested but should work as well. Subversion From scoder at codespeak.net Sun Nov 9 16:27:14 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 9 Nov 2008 16:27:14 +0100 (CET) Subject: [Lxml-checkins] r59833 - in lxml/trunk: . src/lxml src/lxml/tests Message-ID: <20081109152714.0DDA1168411@codespeak.net> Author: scoder Date: Sun Nov 9 16:27:14 2008 New Revision: 59833 Modified: lxml/trunk/ (props changed) lxml/trunk/CHANGES.txt lxml/trunk/src/lxml/extensions.pxi lxml/trunk/src/lxml/tests/test_xslt.py Log: r4851 at delle: sbehnel | 2008-11-09 16:24:50 +0100 support for result tree fragments in XPath/XSLT extension functions Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Sun Nov 9 16:27:14 2008 @@ -8,6 +8,9 @@ Features added -------------- +* Support for XSLT result tree fragments in XPath/XSLT extension + functions. + * QName objects have new properties ``namespace`` and ``localname``. * New options for exclusive C14N and C14N without comments. Modified: lxml/trunk/src/lxml/extensions.pxi ============================================================================== --- lxml/trunk/src/lxml/extensions.pxi (original) +++ lxml/trunk/src/lxml/extensions.pxi Sun Nov 9 16:27:14 2008 @@ -490,7 +490,7 @@ if xpathObj.type == xpath.XPATH_UNDEFINED: raise XPathResultError, u"Undefined xpath result" elif xpathObj.type == xpath.XPATH_NODESET: - return _createNodeSetResult(xpathObj, doc, smart_string) + return _createNodeSetResult(xpathObj, doc, smart_string, 0) elif xpathObj.type == xpath.XPATH_BOOLEAN: return xpathObj.boolval elif xpathObj.type == xpath.XPATH_NUMBER: @@ -502,62 +502,77 @@ stringval, None, 0, 0) return stringval elif xpathObj.type == xpath.XPATH_POINT: - raise NotImplementedError + raise NotImplementedError, u"XPATH_POINT" elif xpathObj.type == xpath.XPATH_RANGE: - raise NotImplementedError + raise NotImplementedError, u"XPATH_RANGE" elif xpathObj.type == xpath.XPATH_LOCATIONSET: - raise NotImplementedError + raise NotImplementedError, u"XPATH_LOCATIONSET" elif xpathObj.type == xpath.XPATH_USERS: - raise NotImplementedError + raise NotImplementedError, u"XPATH_USERS" elif xpathObj.type == xpath.XPATH_XSLT_TREE: - raise NotImplementedError + return _createNodeSetResult(xpathObj, doc, smart_string, 1) else: raise XPathResultError, u"Unknown xpath result %s" % unicode(xpathObj.type) -cdef object _createNodeSetResult(xpath.xmlXPathObject* xpathObj, - _Document doc, bint smart_string): +cdef object _createNodeSetResult(xpath.xmlXPathObject* xpathObj, _Document doc, + bint smart_string, bint is_fragment): cdef xmlNode* c_node - cdef char* s cdef int i + cdef list result result = [] if xpathObj.nodesetval is NULL: return result for i from 0 <= i < xpathObj.nodesetval.nodeNr: c_node = xpathObj.nodesetval.nodeTab[i] - if _isElement(c_node): - if c_node.doc != doc._c_doc and c_node.doc._private is NULL: - # XXX: works, but maybe not always the right thing to do? - # XPath: only runs when extensions create or copy trees - # -> we store Python refs to these, so that is OK - # XSLT: can it leak when merging trees from multiple sources? - c_node = tree.xmlDocCopyNode(c_node, doc._c_doc, 1) - value = _fakeDocElementFactory(doc, c_node) - elif c_node.type == tree.XML_TEXT_NODE or \ - c_node.type == tree.XML_ATTRIBUTE_NODE: - value = _buildElementStringResult(doc, c_node, smart_string) - elif c_node.type == tree.XML_NAMESPACE_DECL: - s = (c_node).href - if s is NULL: - href = None - else: - href = funicode(s) - s = (c_node).prefix - if s is NULL: - prefix = None - else: - prefix = funicode(s) - value = (prefix, href) - elif c_node.type == tree.XML_DOCUMENT_NODE or \ - c_node.type == tree.XML_HTML_DOCUMENT_NODE or \ - c_node.type == tree.XML_XINCLUDE_START or \ - c_node.type == tree.XML_XINCLUDE_END: - continue - else: - raise NotImplementedError, \ - u"Not yet implemented result node type: %d" % unicode(c_node.type) - python.PyList_Append(result, value) + _unpackNodeSetEntry(result, c_node, doc, + smart_string, is_fragment) return result +cdef _unpackNodeSetEntry(list results, xmlNode* c_node, _Document doc, + bint smart_string, bint is_fragment): + cdef xmlNode* c_child + cdef char* s + if _isElement(c_node): + if c_node.doc != doc._c_doc and c_node.doc._private is NULL: + # XXX: works, but maybe not always the right thing to do? + # XPath: only runs when extensions create or copy trees + # -> we store Python refs to these, so that is OK + # XSLT: can it leak when merging trees from multiple sources? + c_node = tree.xmlDocCopyNode(c_node, doc._c_doc, 1) + results.append( + _fakeDocElementFactory(doc, c_node)) + elif c_node.type == tree.XML_TEXT_NODE or \ + c_node.type == tree.XML_ATTRIBUTE_NODE: + results.append( + _buildElementStringResult(doc, c_node, smart_string)) + elif c_node.type == tree.XML_NAMESPACE_DECL: + s = (c_node).href + if s is NULL: + href = None + else: + href = funicode(s) + s = (c_node).prefix + if s is NULL: + prefix = None + else: + prefix = funicode(s) + results.append( (prefix, href) ) + elif c_node.type == tree.XML_DOCUMENT_NODE or \ + c_node.type == tree.XML_HTML_DOCUMENT_NODE: + # ignored for everything but result tree fragments + if is_fragment: + c_child = c_node.children + while c_child is not NULL: + _unpackNodeSetEntry(results, c_child, doc, + smart_string, is_fragment) + c_child = c_child.next + elif c_node.type == tree.XML_XINCLUDE_START or \ + c_node.type == tree.XML_XINCLUDE_END: + pass + else: + raise NotImplementedError, \ + u"Not yet implemented result node type: %d" % unicode(c_node.type) + cdef void _freeXPathObject(xpath.xmlXPathObject* xpathObj): u"""Free the XPath object, but *never* free the *content* of node sets. Python dealloc will do that for us. Modified: lxml/trunk/src/lxml/tests/test_xslt.py ============================================================================== --- lxml/trunk/src/lxml/tests/test_xslt.py (original) +++ lxml/trunk/src/lxml/tests/test_xslt.py Sun Nov 9 16:27:14 2008 @@ -647,6 +647,37 @@ self.assertEquals(self._rootstring(result), _bytes('X')) + def test_extensions3(self): + tree = self.parse('B') + style = self.parse('''\ + + + + + + + + BBB +''') + + def mytext(ctxt, values): + for value in values: + self.assert_(hasattr(value, 'tag'), + "%s is not an Element" % type(value)) + self.assertEquals(value.tag, 'b') + self.assertEquals(value.text, 'BBB') + return 'X'.join([el.tag for el in values]) + + namespace = etree.FunctionNamespace('testns') + namespace['mytext'] = mytext + + result = tree.xslt(style) + self.assertEquals(self._rootstring(result), + _bytes('bXb')) + def test_extension_element(self): tree = self.parse('B') style = self.parse('''\ From scoder at codespeak.net Sun Nov 9 16:27:20 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 9 Nov 2008 16:27:20 +0100 (CET) Subject: [Lxml-checkins] r59834 - in lxml/trunk: . src/lxml Message-ID: <20081109152720.BA2EB168426@codespeak.net> Author: scoder Date: Sun Nov 9 16:27:20 2008 New Revision: 59834 Modified: lxml/trunk/ (props changed) lxml/trunk/src/lxml/lxml.etree.pyx lxml/trunk/src/lxml/lxml.objectify.pyx Log: r4852 at delle: sbehnel | 2008-11-09 16:26:10 +0100 leave set/Set import to Cython 0.10 Modified: lxml/trunk/src/lxml/lxml.etree.pyx ============================================================================== --- lxml/trunk/src/lxml/lxml.etree.pyx (original) +++ lxml/trunk/src/lxml/lxml.etree.pyx Sun Nov 9 16:27:20 2008 @@ -17,12 +17,6 @@ # Python 3 import builtins as __builtin__ -cdef object set -try: - set = __builtin__.set -except AttributeError: - from sets import Set as set - cdef object _unicode try: _unicode = __builtin__.unicode Modified: lxml/trunk/src/lxml/lxml.objectify.pyx ============================================================================== --- lxml/trunk/src/lxml/lxml.objectify.pyx (original) +++ lxml/trunk/src/lxml/lxml.objectify.pyx Sun Nov 9 16:27:20 2008 @@ -21,21 +21,6 @@ cdef object re import re -try: - import __builtin__ -except ImportError: - # Python 3 - import builtins as __builtin__ - -cdef object set -try: - set = __builtin__.set -except AttributeError: - # Python 2.3 - from sets import Set as set - -del __builtin__ - cdef object IGNORABLE_ERRORS IGNORABLE_ERRORS = (ValueError, TypeError) From scoder at codespeak.net Sun Nov 9 16:35:01 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 9 Nov 2008 16:35:01 +0100 (CET) Subject: [Lxml-checkins] r59835 - in lxml/trunk: . src/lxml/tests Message-ID: <20081109153501.B082716840E@codespeak.net> Author: scoder Date: Sun Nov 9 16:35:01 2008 New Revision: 59835 Modified: lxml/trunk/ (props changed) lxml/trunk/src/lxml/tests/test_xslt.py Log: r4856 at delle: sbehnel | 2008-11-09 16:34:11 +0100 renamed test Modified: lxml/trunk/src/lxml/tests/test_xslt.py ============================================================================== --- lxml/trunk/src/lxml/tests/test_xslt.py (original) +++ lxml/trunk/src/lxml/tests/test_xslt.py Sun Nov 9 16:35:01 2008 @@ -647,7 +647,7 @@ self.assertEquals(self._rootstring(result), _bytes('X')) - def test_extensions3(self): + def test_variable_result_tree_fragment(self): tree = self.parse('B') style = self.parse('''\ An HTML attachment was scrubbed... URL: http://codespeak.net/pipermail/lxml-checkins/attachments/20081110/a61d3427/attachment.htm From lxml-checkins at codespeak.net Tue Nov 11 07:52:45 2008 From: lxml-checkins at codespeak.net (lxml-checkins at codespeak.net) Date: Tue, 11 Nov 2008 07:52:45 +0100 (CET) Subject: [Lxml-checkins] Doctor Q&A Terrance Stiles Message-ID: <20081111065245.60508168503@codespeak.net> An HTML attachment was scrubbed... URL: http://codespeak.net/pipermail/lxml-checkins/attachments/20081111/8dbbb990/attachment.htm From lxml-checkins at codespeak.net Tue Nov 11 20:08:56 2008 From: lxml-checkins at codespeak.net (lxml-checkins at codespeak.net) Date: Tue, 11 Nov 2008 20:08:56 +0100 (CET) Subject: [Lxml-checkins] Who framed Barak Message-ID: <20081111190856.1BC23168533@codespeak.net> An HTML attachment was scrubbed... URL: http://codespeak.net/pipermail/lxml-checkins/attachments/20081111/0501175f/attachment.htm From scoder at codespeak.net Tue Nov 11 23:06:22 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Tue, 11 Nov 2008 23:06:22 +0100 (CET) Subject: [Lxml-checkins] r59879 - lxml/trunk Message-ID: <20081111220622.5F9B7169E03@codespeak.net> Author: scoder Date: Tue Nov 11 23:06:20 2008 New Revision: 59879 Modified: lxml/trunk/ (props changed) lxml/trunk/buildlibxml.py Log: r4858 at delle: sbehnel | 2008-11-11 23:05:25 +0100 try-and-error fix for universally built MacOS Python platforms Modified: lxml/trunk/buildlibxml.py ============================================================================== --- lxml/trunk/buildlibxml.py (original) +++ lxml/trunk/buildlibxml.py Tue Nov 11 23:06:20 2008 @@ -1,6 +1,5 @@ import os, re -from distutils import log - +from distutils import log, sysconfig ## Routines to download and build libxml2/xslt: LIBXML2_LOCATION = 'ftp://xmlsoft.org/libxml2/' @@ -167,6 +166,7 @@ safe_mkdir(prefix) configure_cmd = ['./configure', '--without-python', + '--disable-dependency-tracking', '--disable-shared', '--prefix=%s' % prefix] call_subprocess(configure_cmd, cwd=libxml2_dir) call_subprocess( @@ -191,6 +191,11 @@ os.path.join(prefix, 'include', 'libexslt')]) static_library_dirs.append(lib_dir) + unisdk_dir = sysconfig.get_config_var('UNIVERSALSDK') + if unisdk_dir: + static_cflags.extend(['-isysroot', unisdk_dir, + '-arch', '-i386', '-arch', 'ppc']) + for filename in os.listdir(lib_dir): if [l for l in ['libxml2', 'libxslt', 'libexslt'] if l in filename]: if [ext for ext in ['.a'] if filename.endswith(ext)]: From scoder at codespeak.net Sun Nov 16 09:16:33 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 16 Nov 2008 09:16:33 +0100 (CET) Subject: [Lxml-checkins] r59941 - lxml/trunk Message-ID: <20081116081633.5E5AF1683DD@codespeak.net> Author: scoder Date: Sun Nov 16 09:16:31 2008 New Revision: 59941 Modified: lxml/trunk/ (props changed) lxml/trunk/buildlibxml.py Log: r4860 at delle: sbehnel | 2008-11-14 10:47:45 +0100 fixed undefined name Modified: lxml/trunk/buildlibxml.py ============================================================================== --- lxml/trunk/buildlibxml.py (original) +++ lxml/trunk/buildlibxml.py Sun Nov 16 09:16:31 2008 @@ -119,7 +119,7 @@ self.chown(tarinfo, dirpath) self.utime(tarinfo, dirpath) self.chmod(tarinfo, dirpath) - except ExtractError, e: + except tarfile.ExtractError, e: if self.errorlevel > 1: raise else: From scoder at codespeak.net Sun Nov 16 09:16:37 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 16 Nov 2008 09:16:37 +0100 (CET) Subject: [Lxml-checkins] r59942 - in lxml/trunk: . src/lxml src/lxml/html tools Message-ID: <20081116081637.390BF1683DF@codespeak.net> Author: scoder Date: Sun Nov 16 09:16:36 2008 New Revision: 59942 Modified: lxml/trunk/ (props changed) lxml/trunk/src/lxml/cssselect.py lxml/trunk/src/lxml/html/formfill.py lxml/trunk/src/lxml/html/html5parser.py lxml/trunk/tools/xpathgrep.py Log: r4861 at delle: sbehnel | 2008-11-14 10:52:38 +0100 fixed missing imports and name errors Modified: lxml/trunk/src/lxml/cssselect.py ============================================================================== --- lxml/trunk/src/lxml/cssselect.py (original) +++ lxml/trunk/src/lxml/cssselect.py Sun Nov 16 09:16:36 2008 @@ -635,6 +635,7 @@ try: return parse_selector_group(stream) except SelectorSyntaxError: + import sys e = sys.exc_info()[1] e.args = tuple(["%s at %s -> %s" % ( e, stream.used, list(stream))]) @@ -900,6 +901,7 @@ try: result = result.encode('ASCII', 'backslashreplace').decode('unicode_escape') except UnicodeDecodeError: + import sys e = sys.exc_info()[1] raise SelectorSyntaxError( "Bad symbol %r: %s" % (result, e)) Modified: lxml/trunk/src/lxml/html/formfill.py ============================================================================== --- lxml/trunk/src/lxml/html/formfill.py (original) +++ lxml/trunk/src/lxml/html/formfill.py Sun Nov 16 09:16:36 2008 @@ -2,6 +2,7 @@ from lxml.html import fromstring, tostring, XHTML_NAMESPACE from lxml.html import _forms_xpath, _options_xpath, _nons, _transform_result from lxml.html import defs +import copy try: basestring = __builtins__["basestring"] except (KeyError, NameError): Modified: lxml/trunk/src/lxml/html/html5parser.py ============================================================================== --- lxml/trunk/src/lxml/html/html5parser.py (original) +++ lxml/trunk/src/lxml/html/html5parser.py Sun Nov 16 09:16:36 2008 @@ -99,7 +99,7 @@ result = children[0] if result.tail and result.tail.strip(): - raise etree.ParserError('Element followed by text: %r' % el.tail) + raise etree.ParserError('Element followed by text: %r' % result.tail) result.tail = None return result @@ -157,7 +157,7 @@ fp = urllib.urlopen(filename_url_or_file) else: fp = filename_url_or_file - return parser.parse(html, useChardet=guess_charset) + return parser.parse(fp, useChardet=guess_charset) html_parser = HTMLParser() Modified: lxml/trunk/tools/xpathgrep.py ============================================================================== --- lxml/trunk/tools/xpathgrep.py (original) +++ lxml/trunk/tools/xpathgrep.py Sun Nov 16 09:16:36 2008 @@ -3,6 +3,7 @@ try: import lxml.etree as et except ImportError, e: + import sys print >> sys.stderr, "ERR: %s." % e sys.exit(5) From scoder at codespeak.net Sun Nov 16 09:16:40 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 16 Nov 2008 09:16:40 +0100 (CET) Subject: [Lxml-checkins] r59943 - lxml/trunk Message-ID: <20081116081640.BBF981683E0@codespeak.net> Author: scoder Date: Sun Nov 16 09:16:39 2008 New Revision: 59943 Modified: lxml/trunk/ (props changed) lxml/trunk/buildlibxml.py Log: r4862 at delle: sbehnel | 2008-11-16 09:15:33 +0100 Mac build fixes by Michael Guntsche Modified: lxml/trunk/buildlibxml.py ============================================================================== --- lxml/trunk/buildlibxml.py (original) +++ lxml/trunk/buildlibxml.py Sun Nov 16 09:16:39 2008 @@ -165,17 +165,42 @@ prefix = os.path.join(os.path.abspath(build_dir), 'libxml2') safe_mkdir(prefix) - configure_cmd = ['./configure', '--without-python', + call_setup = {} + env_setup = None + if sys.platform in ('darwin',): + # We compile Universal if we are on a machine > 10.3 + major_version = int(os.uname()[2].split('.')[0]) + if major_version > 7: + call_setup['env'] = { + 'CFLAGS' : "-arch ppc -arch i386 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -O2", + 'LDFLAGS' : "-arch ppc -arch i386 -isysroot /Developer/SDKs/MacOSX10.4u.sdk", + 'MACOSX_DEPLOYMENT_TARGET' : "10.3" + } + + # We may loose the link to iconv, so make sure it's there + static_binaries.append('-liconv') + + configure_cmd = ['./configure', + '--without-python', '--disable-dependency-tracking', - '--disable-shared', '--prefix=%s' % prefix] - call_subprocess(configure_cmd, cwd=libxml2_dir) + '--disable-shared', + '--prefix=%s' % prefix, + ] + call_subprocess(configure_cmd, cwd=libxml2_dir, **call_setup) call_subprocess( ['make'], cwd=libxml2_dir) call_subprocess( ['make', 'install'], cwd=libxml2_dir) - libxslt_configure_cmd = configure_cmd + ['--with-libxml-prefix=%s' % prefix] - call_subprocess(libxslt_configure_cmd, cwd=libxslt_dir) + libxslt_configure_cmd = configure_cmd + [ + '--with-libxml-prefix=%s' % prefix, + ] + if sys.platform in ('darwin',): + libxslt_configure_cmd += [ + '--without-crypto', + ] + + call_subprocess(libxslt_configure_cmd, cwd=libxslt_dir, **call_setup) call_subprocess( ['make'], cwd=libxslt_dir) call_subprocess( @@ -191,11 +216,6 @@ os.path.join(prefix, 'include', 'libexslt')]) static_library_dirs.append(lib_dir) - unisdk_dir = sysconfig.get_config_var('UNIVERSALSDK') - if unisdk_dir: - static_cflags.extend(['-isysroot', unisdk_dir, - '-arch', '-i386', '-arch', 'ppc']) - for filename in os.listdir(lib_dir): if [l for l in ['libxml2', 'libxslt', 'libexslt'] if l in filename]: if [ext for ext in ['.a'] if filename.endswith(ext)]: From scoder at codespeak.net Sun Nov 16 09:21:52 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 16 Nov 2008 09:21:52 +0100 (CET) Subject: [Lxml-checkins] r59944 - lxml/trunk Message-ID: <20081116082152.014AE1683DF@codespeak.net> Author: scoder Date: Sun Nov 16 09:21:52 2008 New Revision: 59944 Modified: lxml/trunk/ (props changed) lxml/trunk/buildlibxml.py Log: r4866 at delle: sbehnel | 2008-11-16 09:20:52 +0100 missing import Modified: lxml/trunk/buildlibxml.py ============================================================================== --- lxml/trunk/buildlibxml.py (original) +++ lxml/trunk/buildlibxml.py Sun Nov 16 09:21:52 2008 @@ -1,4 +1,4 @@ -import os, re +import os, re, sys from distutils import log, sysconfig ## Routines to download and build libxml2/xslt: From scoder at codespeak.net Mon Nov 17 19:36:34 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 17 Nov 2008 19:36:34 +0100 (CET) Subject: [Lxml-checkins] r59958 - lxml/trunk Message-ID: <20081117183634.72B6C1683DD@codespeak.net> Author: scoder Date: Mon Nov 17 19:36:32 2008 New Revision: 59958 Modified: lxml/trunk/ (props changed) lxml/trunk/buildlibxml.py Log: r4868 at delle: sbehnel | 2008-11-17 19:35:01 +0100 pass build flags also to make, not only to configure Modified: lxml/trunk/buildlibxml.py ============================================================================== --- lxml/trunk/buildlibxml.py (original) +++ lxml/trunk/buildlibxml.py Mon Nov 17 19:36:32 2008 @@ -188,9 +188,9 @@ ] call_subprocess(configure_cmd, cwd=libxml2_dir, **call_setup) call_subprocess( - ['make'], cwd=libxml2_dir) + ['make'], cwd=libxml2_dir, **call_setup) call_subprocess( - ['make', 'install'], cwd=libxml2_dir) + ['make', 'install'], cwd=libxml2_dir, **call_setup) libxslt_configure_cmd = configure_cmd + [ '--with-libxml-prefix=%s' % prefix, @@ -202,9 +202,9 @@ call_subprocess(libxslt_configure_cmd, cwd=libxslt_dir, **call_setup) call_subprocess( - ['make'], cwd=libxslt_dir) + ['make'], cwd=libxslt_dir, **call_setup) call_subprocess( - ['make', 'install'], cwd=libxslt_dir) + ['make', 'install'], cwd=libxslt_dir, **call_setup) xslt_config = os.path.join(prefix, 'bin', 'xslt-config') xml2_config = os.path.join(prefix, 'bin', 'xml2-config') From scoder at codespeak.net Mon Nov 17 21:00:12 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 17 Nov 2008 21:00:12 +0100 (CET) Subject: [Lxml-checkins] r59959 - lxml/branch/lxml-2.0 Message-ID: <20081117200012.66BD81683DB@codespeak.net> Author: scoder Date: Mon Nov 17 21:00:11 2008 New Revision: 59959 Modified: lxml/branch/lxml-2.0/CHANGES.txt Log: changelog Modified: lxml/branch/lxml-2.0/CHANGES.txt ============================================================================== --- lxml/branch/lxml-2.0/CHANGES.txt (original) +++ lxml/branch/lxml-2.0/CHANGES.txt Mon Nov 17 21:00:11 2008 @@ -2,6 +2,17 @@ lxml changelog ============== +2.0.10 (2008-11-17) +=================== + +Bugs fixed +---------- + +* Ref-count leaks when lxml enters a try-except statement while an + outside exception lives in sys.exc_*(). This was due to a problem in + Cython, not lxml itself. + + 2.0.9 (2008-09-05) ================== From scoder at codespeak.net Mon Nov 17 21:07:32 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 17 Nov 2008 21:07:32 +0100 (CET) Subject: [Lxml-checkins] r59960 - in lxml/branch/lxml-2.0: . doc Message-ID: <20081117200732.B7FA01683E3@codespeak.net> Author: scoder Date: Mon Nov 17 21:07:30 2008 New Revision: 59960 Modified: lxml/branch/lxml-2.0/doc/main.txt lxml/branch/lxml-2.0/version.txt Log: prepare release of 2.0.10 Modified: lxml/branch/lxml-2.0/doc/main.txt ============================================================================== --- lxml/branch/lxml-2.0/doc/main.txt (original) +++ lxml/branch/lxml-2.0/doc/main.txt Mon Nov 17 21:07:30 2008 @@ -146,8 +146,8 @@ source release. If you can't wait, consider trying a less recent release version first. -The latest version is `lxml 2.0.9`_, released 2008-09-05 -(`changes for 2.0.9`_). `Older versions`_ are listed below. +The latest version is `lxml 2.0.10`_, released 2008-11-17 +(`changes for 2.0.10`_). `Older versions`_ are listed below. Please take a look at the `installation instructions`_! @@ -215,7 +215,9 @@ Old Versions ------------ -.. _`PDF documentation`: lxmldoc-2.0.9.pdf +.. _`PDF documentation`: lxmldoc-2.0.10.pdf + +* `lxml 2.0.9`_, released 2008-09-05 (`changes for 2.0.9`_) * `lxml 2.0.8`_, released 2008-07-24 (`changes for 2.0.8`_) @@ -285,6 +287,7 @@ * `lxml 0.5`_, released 2005-04-08 +.. _`lxml 2.0.10`: lxml-2.0.10.tgz .. _`lxml 2.0.9`: lxml-2.0.9.tgz .. _`lxml 2.0.8`: lxml-2.0.8.tgz .. _`lxml 2.0.7`: lxml-2.0.7.tgz @@ -320,6 +323,7 @@ .. _`lxml 0.5.1`: lxml-0.5.1.tgz .. _`lxml 0.5`: lxml-0.5.tgz +.. _`changes for 2.0.10`: changes-2.0.10.html .. _`changes for 2.0.9`: changes-2.0.9.html .. _`changes for 2.0.8`: changes-2.0.8.html .. _`changes for 2.0.7`: changes-2.0.7.html Modified: lxml/branch/lxml-2.0/version.txt ============================================================================== --- lxml/branch/lxml-2.0/version.txt (original) +++ lxml/branch/lxml-2.0/version.txt Mon Nov 17 21:07:30 2008 @@ -1 +1 @@ -2.0.9 +2.0.10 From scoder at codespeak.net Mon Nov 17 21:13:41 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 17 Nov 2008 21:13:41 +0100 (CET) Subject: [Lxml-checkins] r59961 - in lxml/trunk: . src/lxml Message-ID: <20081117201341.4D9411683E6@codespeak.net> Author: scoder Date: Mon Nov 17 21:13:38 2008 New Revision: 59961 Modified: lxml/trunk/ (props changed) lxml/trunk/src/lxml/xmlerror.pxd lxml/trunk/src/lxml/xmlerror.pxi Log: r4870 at delle: sbehnel | 2008-11-17 21:09:27 +0100 updated error constants to libxml2 2.7.2 Modified: lxml/trunk/src/lxml/xmlerror.pxd ============================================================================== --- lxml/trunk/src/lxml/xmlerror.pxd (original) +++ lxml/trunk/src/lxml/xmlerror.pxd Mon Nov 17 21:13:38 2008 @@ -150,11 +150,14 @@ XML_ERR_NOTATION_PROCESSING = 105 # 105 XML_WAR_NS_COLUMN = 106 # 106 XML_WAR_ENTITY_REDEFINED = 107 # 107 + XML_ERR_UNKNOWN_VERSION = 108 # 108 + XML_ERR_VERSION_MISMATCH = 109 # 109 XML_NS_ERR_XML_NAMESPACE = 200 XML_NS_ERR_UNDEFINED_NAMESPACE = 201 # 201 XML_NS_ERR_QNAME = 202 # 202 XML_NS_ERR_ATTRIBUTE_REDEFINED = 203 # 203 XML_NS_ERR_EMPTY = 204 # 204 + XML_NS_ERR_COLON = 205 # 205 XML_DTD_ATTRIBUTE_DEFAULT = 500 XML_DTD_ATTRIBUTE_REDEFINED = 501 # 501 XML_DTD_ATTRIBUTE_VALUE = 502 # 502 @@ -196,6 +199,7 @@ XML_DTD_STANDALONE_DEFAULTED = 538 # 538 XML_DTD_XMLID_VALUE = 539 # 539 XML_DTD_XMLID_TYPE = 540 # 540 + XML_DTD_DUP_TOKEN = 541 # 541 XML_HTML_STRUCURE_ERROR = 800 XML_HTML_UNKNOWN_TAG = 801 # 801 XML_RNGP_ANYNAME_ATTR_ANCESTOR = 1000 Modified: lxml/trunk/src/lxml/xmlerror.pxi ============================================================================== --- lxml/trunk/src/lxml/xmlerror.pxi (original) +++ lxml/trunk/src/lxml/xmlerror.pxi Mon Nov 17 21:13:38 2008 @@ -703,11 +703,14 @@ ERR_NOTATION_PROCESSING=105 WAR_NS_COLUMN=106 WAR_ENTITY_REDEFINED=107 +ERR_UNKNOWN_VERSION=108 +ERR_VERSION_MISMATCH=109 NS_ERR_XML_NAMESPACE=200 NS_ERR_UNDEFINED_NAMESPACE=201 NS_ERR_QNAME=202 NS_ERR_ATTRIBUTE_REDEFINED=203 NS_ERR_EMPTY=204 +NS_ERR_COLON=205 DTD_ATTRIBUTE_DEFAULT=500 DTD_ATTRIBUTE_REDEFINED=501 DTD_ATTRIBUTE_VALUE=502 @@ -749,18 +752,19 @@ DTD_STANDALONE_DEFAULTED=538 DTD_XMLID_VALUE=539 DTD_XMLID_TYPE=540 +DTD_DUP_TOKEN=541 HTML_STRUCURE_ERROR=800 HTML_UNKNOWN_TAG=801 RNGP_ANYNAME_ATTR_ANCESTOR=1000 RNGP_ATTR_CONFLICT=1001 RNGP_ATTRIBUTE_CHILDREN=1002 RNGP_ATTRIBUTE_CONTENT=1003 +""", +u"""\ RNGP_ATTRIBUTE_EMPTY=1004 RNGP_ATTRIBUTE_NOOP=1005 RNGP_CHOICE_CONTENT=1006 RNGP_CHOICE_EMPTY=1007 -""", -u"""\ RNGP_CREATE_FAILURE=1008 RNGP_DATA_CONTENT=1009 RNGP_DEF_CHOICE_AND_INTERLEAVE=1010 @@ -828,12 +832,12 @@ RNGP_PAT_DATA_EXCEPT_GROUP=1072 RNGP_PAT_DATA_EXCEPT_INTERLEAVE=1073 RNGP_PAT_DATA_EXCEPT_LIST=1074 +""", +u"""\ RNGP_PAT_DATA_EXCEPT_ONEMORE=1075 RNGP_PAT_DATA_EXCEPT_REF=1076 RNGP_PAT_DATA_EXCEPT_TEXT=1077 RNGP_PAT_LIST_ATTR=1078 -""", -u"""\ RNGP_PAT_LIST_ELEM=1079 RNGP_PAT_LIST_INTERLEAVE=1080 RNGP_PAT_LIST_LIST=1081 @@ -903,13 +907,13 @@ TREE_INVALID_HEX=1300 TREE_INVALID_DEC=1301 TREE_UNTERMINATED_ENTITY=1302 +""", +u"""\ TREE_NOT_UTF8=1303 SAVE_NOT_UTF8=1400 SAVE_CHAR_INVALID=1401 SAVE_NO_DOCTYPE=1402 SAVE_UNKNOWN_ENCODING=1403 -""", -u"""\ REGEXP_COMPILE_ERROR=1450 IO_UNKNOWN=1500 IO_EACCES=1501 @@ -999,11 +1003,11 @@ SCHEMAP_COMPLEXTYPE_NONAME_NOREF=1704 SCHEMAP_ELEMFORMDEFAULT_VALUE=1705 SCHEMAP_ELEM_NONAME_NOREF=1706 +""", +u"""\ SCHEMAP_EXTENSION_NO_BASE=1707 SCHEMAP_FACET_NO_VALUE=1708 SCHEMAP_FAILED_BUILD_IMPORT=1709 -""", -u"""\ SCHEMAP_GROUP_NONAME_NOREF=1710 SCHEMAP_IMPORT_NAMESPACE_NOT_URI=1711 SCHEMAP_IMPORT_REDEFINE_NSNAME=1712 @@ -1062,11 +1066,11 @@ SCHEMAP_REDEFINED_NOTATION=1765 SCHEMAP_FAILED_PARSE=1766 SCHEMAP_UNKNOWN_PREFIX=1767 +""", +u"""\ SCHEMAP_DEF_AND_PREFIX=1768 SCHEMAP_UNKNOWN_INCLUDE_CHILD=1769 SCHEMAP_INCLUDE_SCHEMA_NOT_URI=1770 -""", -u"""\ SCHEMAP_INCLUDE_SCHEMA_NO_URI=1771 SCHEMAP_NOT_SCHEMA=1772 SCHEMAP_UNKNOWN_MEMBER_TYPE=1773 @@ -1127,11 +1131,11 @@ SCHEMAV_CVC_TYPE_3_1_2=1828 SCHEMAV_CVC_FACET_VALID=1829 SCHEMAV_CVC_LENGTH_VALID=1830 +""", +u"""\ SCHEMAV_CVC_MINLENGTH_VALID=1831 SCHEMAV_CVC_MAXLENGTH_VALID=1832 SCHEMAV_CVC_MININCLUSIVE_VALID=1833 -""", -u"""\ SCHEMAV_CVC_MAXINCLUSIVE_VALID=1834 SCHEMAV_CVC_MINEXCLUSIVE_VALID=1835 SCHEMAV_CVC_MAXEXCLUSIVE_VALID=1836 @@ -1199,10 +1203,10 @@ SCHEMAP_SRC_SIMPLE_TYPE_2=3001 SCHEMAP_SRC_SIMPLE_TYPE_3=3002 SCHEMAP_SRC_SIMPLE_TYPE_4=3003 -SCHEMAP_SRC_RESOLVE=3004 -SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE=3005 """, u"""\ +SCHEMAP_SRC_RESOLVE=3004 +SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE=3005 SCHEMAP_SRC_LIST_ITEMTYPE_OR_SIMPLETYPE=3006 SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES=3007 SCHEMAP_ST_PROPS_CORRECT_1=3008 @@ -1259,11 +1263,11 @@ SCHEMAP_COS_VALID_DEFAULT_2_1=3059 SCHEMAP_COS_VALID_DEFAULT_2_2_1=3060 SCHEMAP_COS_VALID_DEFAULT_2_2_2=3061 +""", +u"""\ SCHEMAP_CVC_SIMPLE_TYPE=3062 SCHEMAP_COS_CT_EXTENDS_1_1=3063 SCHEMAP_SRC_IMPORT_1_1=3064 -""", -u"""\ SCHEMAP_SRC_IMPORT_1_2=3065 SCHEMAP_SRC_IMPORT_2=3066 SCHEMAP_SRC_IMPORT_2_1=3067 @@ -1337,6 +1341,8 @@ I18N_NO_HANDLER=6001 I18N_EXCESS_HANDLER=6002 I18N_CONV_FAILED=6003 +""", +u"""\ I18N_NO_OUTPUT=6004 CHECK_=6005 CHECK_X=6006 From scoder at codespeak.net Mon Nov 17 21:21:46 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 17 Nov 2008 21:21:46 +0100 (CET) Subject: [Lxml-checkins] r59962 - in lxml/branch/lxml-2.1: src/lxml src/lxml/html tools Message-ID: <20081117202146.36C5916802E@codespeak.net> Author: scoder Date: Mon Nov 17 21:21:45 2008 New Revision: 59962 Modified: lxml/branch/lxml-2.1/src/lxml/cssselect.py lxml/branch/lxml-2.1/src/lxml/html/formfill.py lxml/branch/lxml-2.1/tools/xpathgrep.py Log: trunk fix: missing imports and name errors Modified: lxml/branch/lxml-2.1/src/lxml/cssselect.py ============================================================================== --- lxml/branch/lxml-2.1/src/lxml/cssselect.py (original) +++ lxml/branch/lxml-2.1/src/lxml/cssselect.py Mon Nov 17 21:21:45 2008 @@ -635,6 +635,7 @@ try: return parse_selector_group(stream) except SelectorSyntaxError: + import sys e = sys.exc_info()[1] e.args = tuple(["%s at %s -> %s" % ( e, stream.used, list(stream))]) @@ -900,6 +901,7 @@ try: result = result.encode('ASCII', 'backslashreplace').decode('unicode_escape') except UnicodeDecodeError: + import sys e = sys.exc_info()[1] raise SelectorSyntaxError( "Bad symbol %r: %s" % (result, e)) Modified: lxml/branch/lxml-2.1/src/lxml/html/formfill.py ============================================================================== --- lxml/branch/lxml-2.1/src/lxml/html/formfill.py (original) +++ lxml/branch/lxml-2.1/src/lxml/html/formfill.py Mon Nov 17 21:21:45 2008 @@ -2,6 +2,7 @@ from lxml.html import fromstring, tostring, XHTML_NAMESPACE from lxml.html import _forms_xpath, _options_xpath, _nons, _transform_result from lxml.html import defs +import copy try: basestring = __builtins__["basestring"] except (KeyError, NameError): Modified: lxml/branch/lxml-2.1/tools/xpathgrep.py ============================================================================== --- lxml/branch/lxml-2.1/tools/xpathgrep.py (original) +++ lxml/branch/lxml-2.1/tools/xpathgrep.py Mon Nov 17 21:21:45 2008 @@ -3,6 +3,7 @@ try: import lxml.etree as et except ImportError, e: + import sys print >> sys.stderr, "ERR: %s." % e sys.exit(5) From scoder at codespeak.net Mon Nov 17 21:28:46 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 17 Nov 2008 21:28:46 +0100 (CET) Subject: [Lxml-checkins] r59963 - lxml/branch/lxml-2.1/src/lxml/html Message-ID: <20081117202846.810181683E7@codespeak.net> Author: scoder Date: Mon Nov 17 21:28:44 2008 New Revision: 59963 Modified: lxml/branch/lxml-2.1/src/lxml/html/__init__.py Log: note that 'include_meta_content_type' is currently useless in lxml.html.tostring() Modified: lxml/branch/lxml-2.1/src/lxml/html/__init__.py ============================================================================== --- lxml/branch/lxml-2.1/src/lxml/html/__init__.py (original) +++ lxml/branch/lxml-2.1/src/lxml/html/__init__.py Mon Nov 17 21:28:44 2008 @@ -1375,11 +1375,9 @@ def tostring(doc, pretty_print=False, include_meta_content_type=False, encoding=None, method="html"): """Return an HTML string representation of the document. - - Note: if include_meta_content_type is true this will create a - ```` tag in the head; - regardless of the value of include_meta_content_type any existing - ```` tag will be removed + + Note: the 'include_meta_content_type' argument exists purely for + compatibility and does not serve any purpose. The ``encoding`` argument controls the output encoding (defauts to ASCII, with &#...; character references for any characters outside From scoder at codespeak.net Mon Nov 17 21:34:43 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 17 Nov 2008 21:34:43 +0100 (CET) Subject: [Lxml-checkins] r59964 - in lxml/branch/lxml-2.1: . doc Message-ID: <20081117203443.4513D1683EA@codespeak.net> Author: scoder Date: Mon Nov 17 21:34:42 2008 New Revision: 59964 Modified: lxml/branch/lxml-2.1/CHANGES.txt lxml/branch/lxml-2.1/doc/main.txt lxml/branch/lxml-2.1/version.txt Log: prepare release of lxml 2.1.3 Modified: lxml/branch/lxml-2.1/CHANGES.txt ============================================================================== --- lxml/branch/lxml-2.1/CHANGES.txt (original) +++ lxml/branch/lxml-2.1/CHANGES.txt Mon Nov 17 21:34:42 2008 @@ -2,8 +2,8 @@ lxml changelog ============== -Under development -================= +2.1.3 (2008-11-17) +================== Features added -------------- @@ -11,6 +11,16 @@ Bugs fixed ---------- +* Ref-count leaks when lxml enters a try-except statement while an + outside exception lives in sys.exc_*(). This was due to a problem in + Cython, not lxml itself. + +* Internal DTD subsets that did not specify a system or public ID were + not serialised and did not appear in the docinfo property of + ElementTrees. + +* Fix a pre-Py3k warning when parsing from a gzip file in Py2.6. + * Test suite fixes for libxml2 2.7. * Resolver.resolve_string() did not work for non-ASCII byte strings. Modified: lxml/branch/lxml-2.1/doc/main.txt ============================================================================== --- lxml/branch/lxml-2.1/doc/main.txt (original) +++ lxml/branch/lxml-2.1/doc/main.txt Mon Nov 17 21:34:42 2008 @@ -147,8 +147,8 @@ source release. If you can't wait, consider trying a less recent release version first. -The latest version is `lxml 2.1.2`_, released 2008-09-05 -(`changes for 2.1.2`_). `Older versions`_ are listed below. +The latest version is `lxml 2.1.3`_, released 2008-11-17 +(`changes for 2.1.3`_). `Older versions`_ are listed below. Please take a look at the `installation instructions`_! @@ -220,7 +220,9 @@ `2.0 `_ and the `current in-development version `_. -.. _`PDF documentation`: lxmldoc-2.1.2.pdf +.. _`PDF documentation`: lxmldoc-2.1.3.pdf + +* `lxml 2.1.2`_, released 2008-09-05 (`changes for 2.1.2`_) * `lxml 2.1.1`_, released 2008-07-24 (`changes for 2.1.1`_) @@ -304,6 +306,7 @@ * `lxml 0.5`_, released 2005-04-08 +.. _`lxml 2.1.3`: lxml-2.1.3.tgz .. _`lxml 2.1.2`: lxml-2.1.2.tgz .. _`lxml 2.1.1`: lxml-2.1.1.tgz .. _`lxml 2.1`: lxml-2.1.tgz @@ -346,6 +349,7 @@ .. _`lxml 0.5.1`: lxml-0.5.1.tgz .. _`lxml 0.5`: lxml-0.5.tgz +.. _`changes for 2.1.3`: changes-2.1.3.html .. _`changes for 2.1.2`: changes-2.1.2.html .. _`changes for 2.1.1`: changes-2.1.1.html .. _`changes for 2.1`: changes-2.1.html Modified: lxml/branch/lxml-2.1/version.txt ============================================================================== --- lxml/branch/lxml-2.1/version.txt (original) +++ lxml/branch/lxml-2.1/version.txt Mon Nov 17 21:34:42 2008 @@ -1 +1 @@ -2.1.2 +2.1.3 From scoder at codespeak.net Mon Nov 17 21:50:42 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 17 Nov 2008 21:50:42 +0100 (CET) Subject: [Lxml-checkins] r59967 - lxml/branch/lxml-2.1/src/lxml Message-ID: <20081117205042.6412D1683E9@codespeak.net> Author: scoder Date: Mon Nov 17 21:50:41 2008 New Revision: 59967 Modified: lxml/branch/lxml-2.1/src/lxml/xmlerror.pxi Log: trunk fix: fix an ignored UnicodeDecodeError when reporting parser encoding errors of non-UTF8 input Modified: lxml/branch/lxml-2.1/src/lxml/xmlerror.pxi ============================================================================== --- lxml/branch/lxml-2.1/src/lxml/xmlerror.pxi (original) +++ lxml/branch/lxml-2.1/src/lxml/xmlerror.pxi Mon Nov 17 21:50:41 2008 @@ -53,7 +53,11 @@ size = cstd.strlen(error.message) if size > 0 and error.message[size-1] == c'\n': size = size - 1 # strip EOL - self.message = python.PyUnicode_DecodeUTF8(error.message, size, NULL) + try: + self.message = python.PyUnicode_DecodeUTF8( + error.message, size, NULL) + except: + self.message = repr(error.message) if error.file is NULL: self.filename = u'' else: From scoder at codespeak.net Mon Nov 17 21:50:50 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 17 Nov 2008 21:50:50 +0100 (CET) Subject: [Lxml-checkins] r59968 - lxml/branch/lxml-2.1 Message-ID: <20081117205050.3B14D1683F0@codespeak.net> Author: scoder Date: Mon Nov 17 21:50:49 2008 New Revision: 59968 Modified: lxml/branch/lxml-2.1/CHANGES.txt Log: changelog Modified: lxml/branch/lxml-2.1/CHANGES.txt ============================================================================== --- lxml/branch/lxml-2.1/CHANGES.txt (original) +++ lxml/branch/lxml-2.1/CHANGES.txt Mon Nov 17 21:50:49 2008 @@ -15,6 +15,11 @@ outside exception lives in sys.exc_*(). This was due to a problem in Cython, not lxml itself. +* Parser Unicode decoding errors could get swallowed by other + exceptions. + +* Name/import errors in some Python modules. + * Internal DTD subsets that did not specify a system or public ID were not serialised and did not appear in the docinfo property of ElementTrees. From scoder at codespeak.net Mon Nov 17 22:16:19 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 17 Nov 2008 22:16:19 +0100 (CET) Subject: [Lxml-checkins] r59970 - lxml/branch/lxml-2.1/src/lxml Message-ID: <20081117211619.9C72B168058@codespeak.net> Author: scoder Date: Mon Nov 17 22:16:19 2008 New Revision: 59970 Modified: lxml/branch/lxml-2.1/src/lxml/serializer.pxi Log: copied missing DTD serialisation fix from trunk Modified: lxml/branch/lxml-2.1/src/lxml/serializer.pxi ============================================================================== --- lxml/branch/lxml-2.1/src/lxml/serializer.pxi (original) +++ lxml/branch/lxml-2.1/src/lxml/serializer.pxi Mon Nov 17 22:16:19 2008 @@ -192,19 +192,21 @@ return tree.xmlOutputBufferWrite(c_buffer, 10, "\n') + tree.xmlOutputBufferWrite(c_buffer, 2, '>\n') return - tree.xmlOutputBufferWrite(c_buffer, 4, '" [\n') + tree.xmlOutputBufferWrite(c_buffer, 3, ' [\n') if c_dtd.notations != NULL: tree.xmlDumpNotationTable(c_buffer.buffer, c_dtd.notations) From scoder at codespeak.net Mon Nov 17 22:39:25 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 17 Nov 2008 22:39:25 +0100 (CET) Subject: [Lxml-checkins] r59971 - lxml/branch/lxml-2.1/doc Message-ID: <20081117213925.B2B381683E9@codespeak.net> Author: scoder Date: Mon Nov 17 22:39:24 2008 New Revision: 59971 Modified: lxml/branch/lxml-2.1/doc/main.txt Log: post release cleanup Modified: lxml/branch/lxml-2.1/doc/main.txt ============================================================================== --- lxml/branch/lxml-2.1/doc/main.txt (original) +++ lxml/branch/lxml-2.1/doc/main.txt Mon Nov 17 22:39:24 2008 @@ -236,6 +236,8 @@ * `lxml 2.1alpha1`_, released 2008-03-27 (`changes for 2.1alpha1`_) +* `lxml 2.0.10`_, released 2008-11-17 (`changes for 2.0.10`_) + * `lxml 2.0.9`_, released 2008-09-05 (`changes for 2.0.9`_) * `lxml 2.0.8`_, released 2008-07-24 (`changes for 2.0.8`_) @@ -314,6 +316,7 @@ .. _`lxml 2.1beta2`: lxml-2.1beta2.tgz .. _`lxml 2.1beta1`: lxml-2.1beta1.tgz .. _`lxml 2.1alpha1`: lxml-2.1alpha1.tgz +.. _`lxml 2.0.10`: lxml-2.0.10.tgz .. _`lxml 2.0.9`: lxml-2.0.9.tgz .. _`lxml 2.0.8`: lxml-2.0.8.tgz .. _`lxml 2.0.7`: lxml-2.0.7.tgz @@ -357,6 +360,7 @@ .. _`changes for 2.1beta2`: changes-2.1beta2.html .. _`changes for 2.1beta1`: changes-2.1beta1.html .. _`changes for 2.1alpha1`: changes-2.1alpha1.html +.. _`changes for 2.0.10`: changes-2.0.10.html .. _`changes for 2.0.9`: changes-2.0.9.html .. _`changes for 2.0.8`: changes-2.0.8.html .. _`changes for 2.0.7`: changes-2.0.7.html From scoder at codespeak.net Mon Nov 17 23:23:34 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 17 Nov 2008 23:23:34 +0100 (CET) Subject: [Lxml-checkins] r59972 - in lxml/trunk: . doc Message-ID: <20081117222334.7F0E21683DB@codespeak.net> Author: scoder Date: Mon Nov 17 23:23:34 2008 New Revision: 59972 Modified: lxml/trunk/ (props changed) lxml/trunk/CHANGES.txt lxml/trunk/doc/main.txt Log: r4874 at delle: sbehnel | 2008-11-17 22:41:04 +0100 post release cleanup Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Mon Nov 17 23:23:34 2008 @@ -20,6 +20,35 @@ Bugs fixed ---------- +* 0-bytes could slip through the API when used inside of Unicode + strings. + +* With ``lxml.html.clean.autolink``, links with balanced parenthesis, + that end in a parenthesis, will be linked in their entirety (typical + with Wikipedia links). + +Other changes +------------- + + +2.1.3 (2008-11-17) +================== + +Features added +-------------- + +Bugs fixed +---------- + +* Ref-count leaks when lxml enters a try-except statement while an + outside exception lives in sys.exc_*(). This was due to a problem in + Cython, not lxml itself. + +* Parser Unicode decoding errors could get swallowed by other + exceptions. + +* Name/import errors in some Python modules. + * Internal DTD subsets that did not specify a system or public ID were not serialised and did not appear in the docinfo property of ElementTrees. @@ -30,19 +59,25 @@ * Resolver.resolve_string() did not work for non-ASCII byte strings. -* Overriding the parser encoding didn't work for many encodings. +* Resolver.resolve_file() was broken. -* 0-bytes could slip through the API when used inside of Unicode - strings. - -* With ``lxml.html.clean.autolink``, links with balanced parenthesis, - that end in a parenthesis, will be linked in their entirety (typical - with Wikipedia links). +* Overriding the parser encoding didn't work for many encodings. Other changes ------------- +2.0.10 (2008-11-17) +=================== + +Bugs fixed +---------- + +* Ref-count leaks when lxml enters a try-except statement while an + outside exception lives in sys.exc_*(). This was due to a problem in + Cython, not lxml itself. + + 2.1.2 (2008-09-05) ================== Modified: lxml/trunk/doc/main.txt ============================================================================== --- lxml/trunk/doc/main.txt (original) +++ lxml/trunk/doc/main.txt Mon Nov 17 23:23:34 2008 @@ -147,8 +147,8 @@ source release. If you can't wait, consider trying a less recent release version first. -The latest version is `lxml 2.1.2`_, released 2008-09-05 -(`changes for 2.1.2`_). `Older versions`_ are listed below. +The latest version is `lxml 2.1.3`_, released 2008-11-17 +(`changes for 2.1.3`_). `Older versions`_ are listed below. Please take a look at the `installation instructions`_! @@ -222,12 +222,16 @@ .. _`PDF documentation`: lxmldoc-2.1.2.pdf +* `lxml 2.1.3`_, released 2008-11-17 (`changes for 2.1.3`_) + * `lxml 2.1.2`_, released 2008-09-05 (`changes for 2.1.2`_) * `lxml 2.1.1`_, released 2008-07-24 (`changes for 2.1.1`_) * `lxml 2.1`_, released 2008-07-09 (`changes for 2.1`_) +* `lxml 2.0.10`_, released 2008-11-17 (`changes for 2.0.10`_) + * `lxml 2.0.9`_, released 2008-09-05 (`changes for 2.0.9`_) * `lxml 2.0.8`_, released 2008-07-24 (`changes for 2.0.8`_) @@ -298,9 +302,11 @@ * `lxml 0.5`_, released 2005-04-08 +.. _`lxml 2.1.3`: lxml-2.1.3.tgz .. _`lxml 2.1.2`: lxml-2.1.2.tgz .. _`lxml 2.1.1`: lxml-2.1.1.tgz .. _`lxml 2.1`: lxml-2.1.tgz +.. _`lxml 2.0.10`: lxml-2.0.10.tgz .. _`lxml 2.0.9`: lxml-2.0.9.tgz .. _`lxml 2.0.8`: lxml-2.0.8.tgz .. _`lxml 2.0.7`: lxml-2.0.7.tgz @@ -336,9 +342,11 @@ .. _`lxml 0.5.1`: lxml-0.5.1.tgz .. _`lxml 0.5`: lxml-0.5.tgz +.. _`changes for 2.1.3`: changes-2.1.3.html .. _`changes for 2.1.2`: changes-2.1.2.html .. _`changes for 2.1.1`: changes-2.1.1.html .. _`changes for 2.1`: changes-2.1.html +.. _`changes for 2.0.10`: changes-2.0.10.html .. _`changes for 2.0.9`: changes-2.0.9.html .. _`changes for 2.0.8`: changes-2.0.8.html .. _`changes for 2.0.7`: changes-2.0.7.html From scoder at codespeak.net Mon Nov 17 23:23:46 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 17 Nov 2008 23:23:46 +0100 (CET) Subject: [Lxml-checkins] r59973 - in lxml/trunk: . src/lxml Message-ID: <20081117222346.791791683E6@codespeak.net> Author: scoder Date: Mon Nov 17 23:23:45 2008 New Revision: 59973 Modified: lxml/trunk/ (props changed) lxml/trunk/src/lxml/apihelpers.pxi lxml/trunk/src/lxml/extensions.pxi lxml/trunk/src/lxml/iterparse.pxi lxml/trunk/src/lxml/lxml.etree.pyx lxml/trunk/src/lxml/lxml.objectify.pyx lxml/trunk/src/lxml/nsclasses.pxi lxml/trunk/src/lxml/objectpath.pxi lxml/trunk/src/lxml/parser.pxi lxml/trunk/src/lxml/python.pxd lxml/trunk/src/lxml/readonlytree.pxi lxml/trunk/src/lxml/saxparser.pxi lxml/trunk/src/lxml/xmlerror.pxi lxml/trunk/src/lxml/xmlid.pxi lxml/trunk/src/lxml/xpath.pxi lxml/trunk/src/lxml/xslt.pxi lxml/trunk/src/lxml/xsltext.pxi Log: r4875 at delle: sbehnel | 2008-11-17 23:22:34 +0100 code cleanup: use list.append() instead of PyList_Append() and let Cython do the rest Modified: lxml/trunk/src/lxml/apihelpers.pxi ============================================================================== --- lxml/trunk/src/lxml/apihelpers.pxi (original) +++ lxml/trunk/src/lxml/apihelpers.pxi Mon Nov 17 23:23:45 2008 @@ -214,6 +214,7 @@ cdef xmlNs* c_ns cdef char* c_prefix cdef char* c_href + cdef list nsdefs if not nsmap: if node_ns_utf is not None: doc._setNodeNs(c_node, _cstr(node_ns_utf)) @@ -703,13 +704,13 @@ cdef _collectChildren(_Element element): cdef xmlNode* c_node - result = [] + cdef list result = [] c_node = element._c_node.children if c_node is not NULL: if not _isElement(c_node): c_node = _nextElement(c_node) while c_node is not NULL: - python.PyList_Append(result, _elementFactory(element._doc, c_node)) + result.append(_elementFactory(element._doc, c_node)) c_node = _nextElement(c_node) return result Modified: lxml/trunk/src/lxml/extensions.pxi ============================================================================== --- lxml/trunk/src/lxml/extensions.pxi (original) +++ lxml/trunk/src/lxml/extensions.pxi Mon Nov 17 23:23:45 2008 @@ -31,12 +31,12 @@ cdef class _BaseContext: cdef xpath.xmlXPathContext* _xpathCtxt cdef _Document _doc - cdef object _extensions - cdef object _namespaces - cdef object _global_namespaces - cdef object _utf_refs - cdef object _function_cache - cdef object _eval_context_dict + cdef dict _extensions + cdef list _namespaces + cdef list _global_namespaces + cdef dict _utf_refs + cdef dict _function_cache + cdef dict _eval_context_dict cdef bint _build_smart_strings # for exception handling and temporary reference keeping: cdef _TempStore _temp_refs @@ -45,6 +45,7 @@ def __init__(self, namespaces, extensions, enable_regexp, build_smart_strings): cdef _ExsltRegExp _regexp + cdef list ns self._utf_refs = {} self._global_namespaces = [] self._function_cache = {} @@ -80,7 +81,7 @@ u"setting default namespace is not supported in XPath" prefix_utf = self._to_utf(prefix) ns_uri_utf = self._to_utf(ns_uri) - python.PyList_Append(ns, (prefix_utf, ns_uri_utf)) + ns.append( (prefix_utf, ns_uri_utf) ) namespaces = ns else: namespaces = None @@ -141,6 +142,7 @@ # namespaces (internal UTF-8 methods with leading '_') cdef addNamespace(self, prefix, ns_uri): + cdef list namespaces if prefix is None: raise TypeError, u"empty prefix is not supported in XPath" prefix_utf = self._to_utf(prefix) @@ -154,9 +156,9 @@ if item[0] == prefix_utf: item = new_item new_item = None - python.PyList_Append(namespaces, item) + namespaces.append(item) if new_item is not None: - python.PyList_Append(namespaces, new_item) + namespaces.append(new_item) self._namespaces = namespaces if self._xpathCtxt is not NULL: xpath.xmlXPathRegisterNs( @@ -167,7 +169,7 @@ raise TypeError, u"empty prefix is not supported in XPath" prefix_utf = self._to_utf(prefix) ns_uri_utf = self._to_utf(ns_uri) - python.PyList_Append(self._global_namespaces, prefix_utf) + self._global_namespaces.append(prefix_utf) xpath.xmlXPathRegisterNs(self._xpathCtxt, _cstr(prefix_utf), _cstr(ns_uri_utf)) @@ -182,7 +184,7 @@ ns_prefixes = _find_all_extension_prefixes() if python.PyList_GET_SIZE(ns_prefixes) > 0: for prefix_utf, ns_uri_utf in ns_prefixes: - python.PyList_Append(self._global_namespaces, prefix_utf) + self._global_namespaces.append(prefix_utf) xpath.xmlXPathRegisterNs( self._xpathCtxt, _cstr(prefix_utf), _cstr(ns_uri_utf)) @@ -411,6 +413,7 @@ return True def match(self, ctxt, s, rexp, flags=u''): + cdef list result_list flags = self._make_string(flags) s = self._make_string(s) rexpc = self._compile(rexp, u'i' in flags) @@ -432,7 +435,7 @@ s_match = join_groups(s_match) elem = SubElement(root, u'match') elem.text = s_match - python.PyList_Append(result_list, elem) + result_list.append(elem) return result_list def replace(self, ctxt, s, rexp, flags, replacement): @@ -672,6 +675,7 @@ cdef _Document doc cdef xpath.xmlXPathObject* obj cdef int i + cdef list args doc = context._doc try: args = [] @@ -679,8 +683,8 @@ obj = xpath.valuePop(ctxt) o = _unwrapXPathObject(obj, doc, context._build_smart_strings) _freeXPathObject(obj) - python.PyList_Append(args, o) - python.PyList_Reverse(args) + args.append(o) + args.reverse() res = function(context, *args) # wrap result for XPath consumption Modified: lxml/trunk/src/lxml/iterparse.pxi ============================================================================== --- lxml/trunk/src/lxml/iterparse.pxi (original) +++ lxml/trunk/src/lxml/iterparse.pxi Mon Nov 17 23:23:45 2008 @@ -40,7 +40,7 @@ c_ns = c_ns.next return count -cdef int _appendStartNsEvents(xmlNode* c_node, event_list): +cdef int _appendStartNsEvents(xmlNode* c_node, list event_list): cdef xmlNs* c_ns cdef int count count = 0 @@ -54,7 +54,7 @@ else: prefix = funicode(c_ns.prefix) ns_tuple = (prefix, funicode(c_ns.href)) - python.PyList_Append(event_list, (u"start-ns", ns_tuple)) + event_list.append( (u"start-ns", ns_tuple) ) count = count + 1 c_ns = c_ns.next return count @@ -69,13 +69,13 @@ cdef _Element _root cdef _Document _doc cdef int _event_filter - cdef object _events + cdef list _events cdef int _event_index - cdef object _ns_stack + cdef list _ns_stack cdef object _pop_ns - cdef object _node_stack + cdef list _node_stack cdef object _pop_node - cdef object _tag_tuple + cdef tuple _tag_tuple cdef char* _tag_href cdef char* _tag_name @@ -146,7 +146,7 @@ elif self._event_filter & ITERPARSE_FILTER_END_NS: ns_count = _countNsDefs(c_node) if self._event_filter & ITERPARSE_FILTER_END_NS: - python.PyList_Append(self._ns_stack, ns_count) + self._ns_stack.append(ns_count) if self._root is None: if self._doc is None: self._doc = _documentFactory(c_node.doc, None) @@ -155,9 +155,9 @@ _tagMatches(c_node, self._tag_href, self._tag_name): node = _elementFactory(self._doc, c_node) if self._event_filter & ITERPARSE_FILTER_END: - python.PyList_Append(self._node_stack, node) + self._node_stack.append(node) if self._event_filter & ITERPARSE_FILTER_START: - python.PyList_Append(self._events, (u"start", node)) + self._events.append( (u"start", node) ) return 0 cdef int endNode(self, xmlNode* c_node) except -1: @@ -176,14 +176,14 @@ self._doc = _documentFactory(c_node.doc, None) self._root = self._doc.getroot() node = _elementFactory(self._doc, c_node) - python.PyList_Append(self._events, (u"end", node)) + self._events.append( (u"end", node) ) if self._event_filter & ITERPARSE_FILTER_END_NS: ns_count = self._pop_ns() if ns_count > 0: event = (u"end-ns", None) for i from 0 <= i < ns_count: - python.PyList_Append(self._events, event) + self._events.append(event) return 0 cdef int pushEvent(self, event, xmlNode* c_node) except -1: @@ -194,7 +194,7 @@ if root is not None and root._c_node.type == tree.XML_ELEMENT_NODE: self._root = root node = _elementFactory(self._doc, c_node) - python.PyList_Append(self._events, (event, node)) + self._events.append( (event, node) ) return 0 cdef void _assureDocGetsFreed(self): @@ -526,13 +526,13 @@ A tree walker that generates events from an existing tree as if it was parsing XML data with ``iterparse()``. """ - cdef object _node_stack + cdef list _node_stack cdef object _pop_node cdef int _index - cdef object _events + cdef list _events cdef object _pop_event cdef int _event_filter - cdef object _tag_tuple + cdef tuple _tag_tuple cdef char* _tag_href cdef char* _tag_name @@ -550,7 +550,7 @@ if self._event_filter != 0: self._index = 0 ns_count = self._start_node(root) - python.PyList_Append(self._node_stack, (root, ns_count)) + self._node_stack.append( (root, ns_count) ) else: self._index = -1 @@ -607,7 +607,7 @@ ns_count = self._start_node(next_node) elif self._event_filter & ITERPARSE_FILTER_END_NS: ns_count = _countNsDefs(next_node._c_node) - python.PyList_Append(self._node_stack, (next_node, ns_count)) + self._node_stack.append( (next_node, ns_count) ) self._index = self._index + 1 if python.PyList_GET_SIZE(self._events): return self._pop_event(0) @@ -624,7 +624,7 @@ if self._event_filter & ITERPARSE_FILTER_START: if self._tag_tuple is None or \ _tagMatches(node._c_node, self._tag_href, self._tag_name): - python.PyList_Append(self._events, (u"start", node)) + self._events.append( (u"start", node) ) return ns_count cdef _Element _end_node(self): @@ -634,9 +634,9 @@ if self._event_filter & ITERPARSE_FILTER_END: if self._tag_tuple is None or \ _tagMatches(node._c_node, self._tag_href, self._tag_name): - python.PyList_Append(self._events, (u"end", node)) + self._events.append( (u"end", node) ) if self._event_filter & ITERPARSE_FILTER_END_NS: event = (u"end-ns", None) for i from 0 <= i < ns_count: - python.PyList_Append(self._events, event) + self._events.append(event) return node Modified: lxml/trunk/src/lxml/lxml.etree.pyx ============================================================================== --- lxml/trunk/src/lxml/lxml.etree.pyx (original) +++ lxml/trunk/src/lxml/lxml.etree.pyx Mon Nov 17 23:23:45 2008 @@ -143,7 +143,7 @@ # version information cdef __unpackDottedVersion(version): - version_list = [] + cdef list version_list = [] l = (version.decode(u"ASCII").replace(u'-', u'.').split(u'.') + [0]*4)[:4] for item in l: try: @@ -189,12 +189,12 @@ # class for temporary storage of Python references cdef class _TempStore: - cdef object _storage + cdef list _storage def __init__(self): self._storage = [] cdef int add(self, obj) except -1: - python.PyList_Append(self._storage, obj) + self._storage.append(obj) return 0 cdef int clear(self) except -1: @@ -903,6 +903,7 @@ cdef Py_ssize_t step, slicelength cdef Py_ssize_t c, i cdef _node_to_node_function next_element + cdef list result if python.PySlice_Check(x): # slicing if _isFullSlice(x): @@ -918,8 +919,7 @@ result = [] c = 0 while c_node is not NULL and c < slicelength: - python.PyList_Append( - result, _elementFactory(self._doc, c_node)) + result.append(_elementFactory(self._doc, c_node)) c = c + 1 for i from 0 <= i < step: c_node = next_element(c_node) Modified: lxml/trunk/src/lxml/lxml.objectify.pyx ============================================================================== --- lxml/trunk/src/lxml/lxml.objectify.pyx (original) +++ lxml/trunk/src/lxml/lxml.objectify.pyx Mon Nov 17 23:23:45 2008 @@ -195,12 +195,11 @@ returned in document order. """ cdef tree.xmlNode* c_node - result = [] + cdef list result = [] c_node = self._c_node.children while c_node is not NULL: if tree._isElement(c_node): - python.PyList_Append( - result, cetree.elementFactory(self._doc, c_node)) + result.append(cetree.elementFactory(self._doc, c_node)) c_node = c_node.next return result @@ -546,6 +545,7 @@ cdef _Element parent cdef tree.xmlNode* c_node cdef Py_ssize_t c_step, c_start, pos + cdef list new_items # collect existing slice if (slice).step is None: c_step = 1 @@ -568,7 +568,7 @@ new_element = cetree.makeElement( tag, target._doc, None, None, None, None, None) _setElementValue(new_element, item) - python.PyList_Append(new_items, new_element) + new_items.append(new_element) # sanity check - raise what a list would raise if c_step != 1 and \ @@ -1110,19 +1110,18 @@ check functions, you can simply register() it, which will append it to the end of the type list. """ - types = [] - known = set() - add_to_known = known.add + cdef list types = [] + cdef set known = set() for check, pytype in _TYPE_CHECKS: name = pytype.name if name not in known: - add_to_known(name) - python.PyList_Append(types, pytype) + known.add(name) + types.append(pytype) for pytype in _PYTYPE_DICT.values(): name = pytype.name if name not in known: - add_to_known(name) - python.PyList_Append(types, pytype) + known.add(name) + types.append(pytype) return types cdef PyType _guessPyType(value, PyType defaulttype): Modified: lxml/trunk/src/lxml/nsclasses.pxi ============================================================================== --- lxml/trunk/src/lxml/nsclasses.pxi (original) +++ lxml/trunk/src/lxml/nsclasses.pxi Mon Nov 17 23:23:45 2008 @@ -222,12 +222,12 @@ cdef object _find_all_extension_prefixes(): u"Internal lookup function to find all function prefixes for XSLT/XPath." cdef _XPathFunctionNamespaceRegistry registry - ns_prefixes = [] + cdef list ns_prefixes = [] for registry in __FUNCTION_NAMESPACE_REGISTRIES.values(): if registry._prefix_utf is not None: if registry._ns_uri_utf is not None: - python.PyList_Append( - ns_prefixes, (registry._prefix_utf, registry._ns_uri_utf)) + ns_prefixes.append( + (registry._prefix_utf, registry._ns_uri_utf)) return ns_prefixes cdef object _iter_ns_extension_functions(): Modified: lxml/trunk/src/lxml/objectpath.pxi ============================================================================== --- lxml/trunk/src/lxml/objectpath.pxi (original) +++ lxml/trunk/src/lxml/objectpath.pxi Mon Nov 17 23:23:45 2008 @@ -92,7 +92,7 @@ u"""Parse object path string into a (ns, name, index) list. """ cdef bint has_dot - new_path = [] + cdef list new_path = [] if python.PyString_Check(path): path = python.PyUnicode_FromEncodedObject(path, 'ASCII', NULL) path = path.strip() @@ -113,7 +113,7 @@ if python.PyList_GET_SIZE(new_path) == 0: if has_dot: # path '.child' => ignore root - python.PyList_Append(new_path, _RELATIVE_PATH_SEGMENT) + new_path.append(_RELATIVE_PATH_SEGMENT) elif index != 0: raise ValueError, u"index not allowed on root node" elif not has_dot: @@ -121,7 +121,7 @@ if ns is not None: ns = python.PyUnicode_AsUTF8String(ns) name = python.PyUnicode_AsUTF8String(name) - python.PyList_Append(new_path, (ns, name, index)) + new_path.append( (ns, name, index) ) path_pos = match.end() if python.PyList_GET_SIZE(new_path) == 0 or \ @@ -135,7 +135,7 @@ cdef char* index_pos cdef char* index_end cdef char* c_name - new_path = [] + cdef list new_path = [] for item in path: item = item.strip() if python.PyList_GET_SIZE(new_path) == 0 and item == u'': @@ -159,7 +159,7 @@ raise ValueError, u"index not allowed on root node" name = python.PyString_FromStringAndSize( c_name, (index_pos - c_name)) - python.PyList_Append(new_path, (ns, name, index)) + new_path.append( (ns, name, index) ) if python.PyList_GET_SIZE(new_path) == 0: raise ValueError, u"invalid path" return new_path @@ -302,9 +302,10 @@ _appendValue(cetree.elementFactory(root._doc, c_node.parent), cetree.namespacedName(c_node), value) -cdef _buildDescendantPaths(tree.xmlNode* c_node, prefix_string): +cdef list _buildDescendantPaths(tree.xmlNode* c_node, prefix_string): u"""Returns a list of all descendant paths. """ + cdef list path, path_list tag = cetree.namespacedName(c_node) if prefix_string: if prefix_string[-1] != u'.': @@ -317,14 +318,15 @@ _recursiveBuildDescendantPaths(c_node, path, path_list) return path_list -cdef _recursiveBuildDescendantPaths(tree.xmlNode* c_node, path, path_list): +cdef int _recursiveBuildDescendantPaths(tree.xmlNode* c_node, + list path, list path_list) except -1: u"""Fills the list 'path_list' with all descendant paths, initial prefix being in the list 'path'. """ cdef python.PyObject* dict_result cdef tree.xmlNode* c_child cdef char* c_href - python.PyList_Append(path_list, u'.'.join(path)) + path_list.append( u'.'.join(path) ) tags = {} c_href = tree._getNs(c_node) c_child = c_node.children @@ -332,7 +334,7 @@ while c_child.type != tree.XML_ELEMENT_NODE: c_child = c_child.next if c_child is NULL: - return + return 0 if c_href is tree._getNs(c_child): tag = pyunicode(c_child.name) elif c_href is not NULL and tree._getNs(c_child) is NULL: @@ -348,7 +350,8 @@ python.PyDict_SetItem(tags, tag, count) if count > 0: tag += u'[%d]' % count - python.PyList_Append(path, tag) + path.append(tag) _recursiveBuildDescendantPaths(c_child, path, path_list) del path[-1] c_child = c_child.next + return 0 Modified: lxml/trunk/src/lxml/parser.pxi ============================================================================== --- lxml/trunk/src/lxml/parser.pxi (original) +++ lxml/trunk/src/lxml/parser.pxi Mon Nov 17 23:23:45 2008 @@ -49,7 +49,7 @@ cdef tree.xmlDict* _c_dict cdef _BaseParser _default_parser - cdef object _implied_parser_contexts + cdef list _implied_parser_contexts def __init__(self): self._implied_parser_contexts = [] @@ -174,7 +174,7 @@ u"Push a new implied context object." cdef _ParserDictionaryContext context context = self._findThreadParserContext() - python.PyList_Append(context._implied_parser_contexts, parser_context) + context._implied_parser_contexts.append(parser_context) cdef void popImpliedContext(self): u"Pop the current implied context object." Modified: lxml/trunk/src/lxml/python.pxd ============================================================================== --- lxml/trunk/src/lxml/python.pxd (original) +++ lxml/trunk/src/lxml/python.pxd Mon Nov 17 23:23:45 2008 @@ -55,8 +55,6 @@ cdef Py_ssize_t PyList_GET_SIZE(object l) cdef object PyList_GET_ITEM(object l, Py_ssize_t index) cdef void PyList_SET_ITEM(object l, Py_ssize_t index, object value) - cdef int PyList_Append(object l, object obj) except -1 - cdef int PyList_Reverse(object l) except -1 cdef int PyList_Insert(object l, Py_ssize_t index, object o) except -1 cdef object PyList_AsTuple(object l) cdef void PyList_Clear(object l) Modified: lxml/trunk/src/lxml/readonlytree.pxi ============================================================================== --- lxml/trunk/src/lxml/readonlytree.pxi (original) +++ lxml/trunk/src/lxml/readonlytree.pxi Mon Nov 17 23:23:45 2008 @@ -5,7 +5,7 @@ cdef bint _free_after_use cdef xmlNode* _c_node cdef object _source_proxy - cdef object _dependent_proxies + cdef list _dependent_proxies cdef int _assertNode(self) except -1: u"""This is our way of saying: this proxy is invalid! @@ -80,6 +80,7 @@ cdef Py_ssize_t step, slicelength cdef Py_ssize_t c, i cdef _node_to_node_function next_element + cdef list result if python.PySlice_Check(x): # slicing if _isFullSlice(x): @@ -95,10 +96,8 @@ result = [] c = 0 while c_node is not NULL and c < slicelength: - python.PyList_Append( - result, _newReadOnlyProxy(self._source_proxy, c_node)) - python.PyList_Append( - result, _elementFactory(self._doc, c_node)) + result.append(_newReadOnlyProxy(self._source_proxy, c_node)) + result.append(_elementFactory(self._doc, c_node)) c = c + 1 for i from 0 <= i < step: c_node = next_element(c_node) @@ -199,13 +198,13 @@ order. """ cdef xmlNode* c_node + cdef list result self._assertNode() result = [] c_node = self._c_node.children while c_node is not NULL: if tree._isElement(c_node): - python.PyList_Append( - result, _newReadOnlyProxy(self._source_proxy, c_node)) + result.append(_newReadOnlyProxy(self._source_proxy, c_node)) c_node = c_node.next return result @@ -261,7 +260,7 @@ el._dependent_proxies = [el] else: el._source_proxy = source_proxy - python.PyList_Append(source_proxy._dependent_proxies, el) + source_proxy._dependent_proxies.append(el) cdef _freeReadOnlyProxies(_ReadOnlyElementProxy sourceProxy): cdef xmlNode* c_node Modified: lxml/trunk/src/lxml/saxparser.pxi ============================================================================== --- lxml/trunk/src/lxml/saxparser.pxi (original) +++ lxml/trunk/src/lxml/saxparser.pxi Mon Nov 17 23:23:45 2008 @@ -336,8 +336,8 @@ """ cdef _BaseParser _parser cdef object _factory - cdef object _data - cdef object _element_stack + cdef list _data + cdef list _element_stack cdef object _element_stack_pop cdef _Element _last cdef bint _in_tail @@ -431,7 +431,7 @@ else: self._last = _makeElement( tag, NULL, None, self._parser, None, None, attrib, nsmap, None) - python.PyList_Append(self._element_stack, self._last) + self._element_stack.append(self._last) self._in_tail = 0 return self._last @@ -442,7 +442,7 @@ return self._last cdef int _handleSaxData(self, data) except -1: - python.PyList_Append(self._data, data) + self._data.append(data) cdef _handleSaxPi(self, target, data): self._flush() Modified: lxml/trunk/src/lxml/xmlerror.pxi ============================================================================== --- lxml/trunk/src/lxml/xmlerror.pxi (original) +++ lxml/trunk/src/lxml/xmlerror.pxi Mon Nov 17 23:23:45 2008 @@ -179,7 +179,7 @@ cdef class _ListErrorLog(_BaseErrorLog): u"Immutable base version of a list based error log." - cdef object _entries + cdef list _entries def __init__(self, entries, first_error, last_error): if entries: if first_error is None: @@ -199,9 +199,9 @@ return iter(self._entries) def __repr__(self): - l = [] + cdef list l = [] for entry in self._entries: - python.PyList_Append(l, repr(entry)) + l.append(repr(entry)) return u'\n'.join(l) def __getitem__(self, index): @@ -226,12 +226,12 @@ containing the matches. """ cdef _LogEntry entry - filtered = [] + cdef list filtered = [] if not python.PySequence_Check(domains): domains = (domains,) for entry in self._entries: if entry.domain in domains: - python.PyList_Append(filtered, entry) + filtered.append(entry) return _ListErrorLog(filtered, None, None) def filter_types(self, types): @@ -241,12 +241,12 @@ log containing the matches. """ cdef _LogEntry entry + cdef list filtered = [] if not python.PySequence_Check(types): types = (types,) - filtered = [] for entry in self._entries: if entry.type in types: - python.PyList_Append(filtered, entry) + filtered.append(entry) return _ListErrorLog(filtered, None, None) def filter_levels(self, levels): @@ -256,12 +256,12 @@ error log containing the matches. """ cdef _LogEntry entry + cdef list filtered = [] if not python.PySequence_Check(levels): levels = (levels,) - filtered = [] for entry in self._entries: if entry.level in levels: - python.PyList_Append(filtered, entry) + filtered.append(entry) return _ListErrorLog(filtered, None, None) def filter_from_level(self, level): @@ -270,10 +270,10 @@ Return a log with all messages of the requested level of worse. """ cdef _LogEntry entry - filtered = [] + cdef list filtered = [] for entry in self._entries: if entry.level >= level: - python.PyList_Append(filtered, entry) + filtered.append(entry) return _ListErrorLog(filtered, None, None) def filter_from_fatals(self): @@ -325,7 +325,7 @@ def receive(self, entry): if self._first_error is None: self._first_error = entry - python.PyList_Append(self._entries, entry) + self._entries.append(entry) cdef class _DomainErrorLog(_ErrorLog): def __init__(self, domains): @@ -343,10 +343,9 @@ self._max_len = max_len def receive(self, entry): - entries = self._entries - if python.PyList_GET_SIZE(entries) > self._max_len: - del entries[0] - python.PyList_Append(entries, entry) + if python.PyList_GET_SIZE(self._entries) > self._max_len: + del self._entries[0] + self._entries.append(entry) cdef class PyErrorLog(_BaseErrorLog): u"""PyErrorLog(self, logger_name=None) Modified: lxml/trunk/src/lxml/xmlid.pxi ============================================================================== --- lxml/trunk/src/lxml/xmlid.pxi (original) +++ lxml/trunk/src/lxml/xmlid.pxi Mon Nov 17 23:23:45 2008 @@ -142,13 +142,13 @@ return iter(self._items) def values(self): + cdef list values = [] if self._items is None: self._items = self._build_items() - values = [] for item in self._items: value = python.PyTuple_GET_ITEM(item, 1) python.Py_INCREF(value) - python.PyList_Append(values, value) + values.append(value) return values def itervalues(self): @@ -173,23 +173,24 @@ c_id = payload if c_id is NULL or c_id.attr is NULL or c_id.attr.parent is NULL: return - dic, doc = context + dic, doc = context element = _elementFactory(doc, c_id.attr.parent) python.PyDict_SetItem(dic, funicode(name), element) cdef void _collectIdHashItemList(void* payload, void* context, char* name): # collect elements from ID attribute hash table cdef tree.xmlID* c_id + cdef list lst c_id = payload if c_id is NULL or c_id.attr is NULL or c_id.attr.parent is NULL: return - lst, doc = context + lst, doc = context element = _elementFactory(doc, c_id.attr.parent) - python.PyList_Append(lst, (funicode(name), element)) + lst.append( (funicode(name), element) ) cdef void _collectIdHashKeys(void* payload, void* collect_list, char* name): cdef tree.xmlID* c_id c_id = payload if c_id is NULL or c_id.attr is NULL or c_id.attr.parent is NULL: return - python.PyList_Append(collect_list, funicode(name)) + (collect_list).append(funicode(name)) Modified: lxml/trunk/src/lxml/xpath.pxi ============================================================================== --- lxml/trunk/src/lxml/xpath.pxi (original) +++ lxml/trunk/src/lxml/xpath.pxi Mon Nov 17 23:23:45 2008 @@ -459,17 +459,17 @@ cdef _nsextract_path(self, path): # replace {namespaces} by new prefixes + cdef dict namespaces = {} + cdef list namespace_defs = [] cdef int i path_utf = _utf8(path) stripped_path = _replace_strings('', path_utf) # remove string literals - namespaces = {} - namespace_defs = [] i = 1 for namespace_def in _find_namespaces(stripped_path): if namespace_def not in namespace_defs: prefix = python.PyString_FromFormat("__xpp%02d", i) i += 1 - python.PyList_Append(namespace_defs, namespace_def) + namespace_defs.append(namespace_def) namespace = namespace_def[1:-1] # remove '{}' namespace = python.PyUnicode_FromEncodedObject( namespace, 'UTF-8', 'strict') Modified: lxml/trunk/src/lxml/xslt.pxi ============================================================================== --- lxml/trunk/src/lxml/xslt.pxi (original) +++ lxml/trunk/src/lxml/xslt.pxi Mon Nov 17 23:23:45 2008 @@ -552,6 +552,7 @@ cdef xmlDoc* c_result cdef char** params cdef Py_ssize_t i, parameter_count + cdef list keep_ref xslt.xsltSetTransformErrorFunc(transform_ctxt, self._error_log, _receiveXSLTError) @@ -571,9 +572,9 @@ keep_ref = [] for key, value in parameters.items(): k = _utf8(key) - python.PyList_Append(keep_ref, k) + keep_ref.append(k) v = _utf8(value) - python.PyList_Append(keep_ref, v) + keep_ref.append(v) params[i] = _cstr(k) i += 1 params[i] = _cstr(v) Modified: lxml/trunk/src/lxml/xsltext.pxi ============================================================================== --- lxml/trunk/src/lxml/xsltext.pxi (original) +++ lxml/trunk/src/lxml/xsltext.pxi Mon Nov 17 23:23:45 2008 @@ -29,6 +29,7 @@ cdef xmlNode* c_next cdef xmlNode* c_context_node cdef _ReadOnlyElementProxy proxy + cdef list results c_context_node = _roNodeOf(node) #assert c_context_node.doc is context._xsltContext.node.doc, \ # "switching input documents during transformation is not currently supported" @@ -48,12 +49,11 @@ while c_node is not NULL: c_next = c_node.next if c_node.type == tree.XML_TEXT_NODE: - python.PyList_Append( - results, funicode(c_node.content)) + results.append(funicode(c_node.content)) elif c_node.type == tree.XML_ELEMENT_NODE: proxy = _newReadOnlyProxy( context._extension_element_proxy, c_node) - python.PyList_Append(results, proxy) + results.append(proxy) # unlink node and make sure it will be freed later on tree.xmlUnlinkNode(c_node) proxy.free_after_use() From scoder at codespeak.net Wed Nov 19 08:44:21 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 19 Nov 2008 08:44:21 +0100 (CET) Subject: [Lxml-checkins] r59987 - in lxml/trunk: . src/lxml Message-ID: <20081119074421.A2CB71683F5@codespeak.net> Author: scoder Date: Wed Nov 19 08:44:19 2008 New Revision: 59987 Modified: lxml/trunk/ (props changed) lxml/trunk/src/lxml/xmlerror.pxi Log: r4885 at delle: sbehnel | 2008-11-18 21:41:28 +0100 Py2.6+ compatibility fix Modified: lxml/trunk/src/lxml/xmlerror.pxi ============================================================================== --- lxml/trunk/src/lxml/xmlerror.pxi (original) +++ lxml/trunk/src/lxml/xmlerror.pxi Wed Nov 19 08:44:19 2008 @@ -57,7 +57,11 @@ self.message = python.PyUnicode_DecodeUTF8( error.message, size, NULL) except: - self.message = repr(error.message) + try: + self.message = python.PyUnicode_DecodeASCII( + error.message, size, 'backslashreplace') + except: + self.message = u'' if error.file is NULL: self.filename = u'' else: @@ -510,6 +514,7 @@ cdef void __initErrorConstants(): u"Called at setup time to parse the constants and build the classes below." + cdef dict reverse_dict find_constants = re.compile(ur"\s*([a-zA-Z0-9_]+)\s*=\s*([0-9]+)").findall const_defs = ((ErrorLevels, __ERROR_LEVELS), (ErrorDomains, __ERROR_DOMAINS), @@ -524,7 +529,7 @@ for name, value in find_constants(constants): value = int(value) python.PyObject_SetAttr(cls, name, value) - python.PyDict_SetItem(reverse_dict, value, name) + reverse_dict[value] = name class ErrorLevels: From scoder at codespeak.net Wed Nov 19 08:44:27 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 19 Nov 2008 08:44:27 +0100 (CET) Subject: [Lxml-checkins] r59988 - in lxml/trunk: . src/lxml Message-ID: <20081119074427.5EB801683F7@codespeak.net> Author: scoder Date: Wed Nov 19 08:44:26 2008 New Revision: 59988 Modified: lxml/trunk/ (props changed) lxml/trunk/src/lxml/extensions.pxi lxml/trunk/src/lxml/lxml.etree.pyx lxml/trunk/src/lxml/lxml.objectify.pyx lxml/trunk/src/lxml/nsclasses.pxi lxml/trunk/src/lxml/objectpath.pxi lxml/trunk/src/lxml/python.pxd lxml/trunk/src/lxml/saxparser.pxi lxml/trunk/src/lxml/xmlid.pxi lxml/trunk/src/lxml/xpath.pxi lxml/trunk/src/lxml/xslt.pxi Log: r4886 at delle: sbehnel | 2008-11-19 08:43:16 +0100 code cleanup: let Cython do the optimisation Modified: lxml/trunk/src/lxml/extensions.pxi ============================================================================== --- lxml/trunk/src/lxml/extensions.pxi (original) +++ lxml/trunk/src/lxml/extensions.pxi Wed Nov 19 08:44:26 2008 @@ -45,6 +45,7 @@ def __init__(self, namespaces, extensions, enable_regexp, build_smart_strings): cdef _ExsltRegExp _regexp + cdef dict new_extensions cdef list ns self._utf_refs = {} self._global_namespaces = [] @@ -58,13 +59,12 @@ # format: [ {(ns, name):function} ] -> {(ns_utf, name_utf):function} new_extensions = {} for extension in extensions: - for (ns_uri, name), function in extension.items(): + for (ns_uri, name), function in extension.iteritems(): if name is None: raise ValueError, u"extensions must have non empty names" ns_utf = self._to_utf(ns_uri) name_utf = self._to_utf(name) - python.PyDict_SetItem( - new_extensions, (ns_utf, name_utf), function) + new_extensions[(ns_utf, name_utf)] = function extensions = new_extensions or None if namespaces is not None: @@ -116,7 +116,7 @@ if dict_result is not NULL: return dict_result utf = _utf8(s) - python.PyDict_SetItem(self._utf_refs, s, utf) + self._utf_refs[s] = utf return utf cdef void _set_xpath_context(self, xpath.xmlXPathContext* xpathCtxt): @@ -181,7 +181,7 @@ self._xpathCtxt, _cstr(prefix_utf), _cstr(ns_uri_utf)) cdef registerGlobalNamespaces(self): - ns_prefixes = _find_all_extension_prefixes() + cdef list ns_prefixes = _find_all_extension_prefixes() if python.PyList_GET_SIZE(ns_prefixes) > 0: for prefix_utf, ns_uri_utf in ns_prefixes: self._global_namespaces.append(prefix_utf) @@ -204,48 +204,48 @@ cdef void _addLocalExtensionFunction(self, ns_utf, name_utf, function): if self._extensions is None: self._extensions = {} - python.PyDict_SetItem(self._extensions, (ns_utf, name_utf), function) + self._extensions[(ns_utf, name_utf)] = function cdef void registerGlobalFunctions(self, void* ctxt, - _register_function reg_func): + _register_function reg_func): cdef python.PyObject* dict_result - for ns_utf, ns_functions in _iter_ns_extension_functions(): + cdef dict d + for ns_utf, ns_functions in __FUNCTION_NAMESPACE_REGISTRIES.iteritems(): dict_result = python.PyDict_GetItem( self._function_cache, ns_utf) if dict_result is not NULL: - d = dict_result + d = dict_result else: d = {} - python.PyDict_SetItem( - self._function_cache, ns_utf, d) - for name_utf, function in ns_functions.items(): - python.PyDict_SetItem(d, name_utf, function) + self._function_cache[ns_utf] = d + for name_utf, function in ns_functions.iteritems(): + d[name_utf] = function reg_func(ctxt, name_utf, ns_utf) cdef void registerLocalFunctions(self, void* ctxt, _register_function reg_func): cdef python.PyObject* dict_result + cdef dict d if self._extensions is None: return # done last_ns = None d = None - for (ns_utf, name_utf), function in self._extensions.items(): + for (ns_utf, name_utf), function in self._extensions.iteritems(): if ns_utf is not last_ns or d is None: last_ns = ns_utf dict_result = python.PyDict_GetItem( self._function_cache, ns_utf) if dict_result is not NULL: - d = dict_result + d = dict_result else: d = {} - python.PyDict_SetItem(self._function_cache, - ns_utf, d) - python.PyDict_SetItem(d, name_utf, function) + self._function_cache[ns_utf] = d + d[name_utf] = function reg_func(ctxt, name_utf, ns_utf) cdef unregisterAllFunctions(self, void* ctxt, _register_function unreg_func): - for ns_utf, functions in self._function_cache.items(): + for ns_utf, functions in self._function_cache.iteritems(): for name_utf in functions: unreg_func(ctxt, name_utf, ns_utf) @@ -342,25 +342,23 @@ The ``ns`` keyword argument accepts a namespace URI for the XPath functions. """ - functions = {} + cdef dict functions = {} if python.PyDict_Check(function_mapping): for function_name, xpath_name in function_mapping.items(): - python.PyDict_SetItem(functions, (ns, xpath_name), - getattr(module, function_name)) + functions[(ns, xpath_name)] = getattr(module, function_name) else: if function_mapping is None: function_mapping = [ name for name in dir(module) if not name.startswith(u'_') ] for function_name in function_mapping: - python.PyDict_SetItem(functions, (ns, function_name), - getattr(module, function_name)) + functions[(ns, function_name)] = getattr(module, function_name) return functions ################################################################################ # EXSLT regexp implementation cdef class _ExsltRegExp: - cdef object _compile_map + cdef dict _compile_map def __init__(self): self._compile_map = {} @@ -400,7 +398,7 @@ if ignore_case: py_flags = py_flags | re.IGNORECASE rexp_compiled = re.compile(rexp, py_flags) - python.PyDict_SetItem(self._compile_map, key, rexp_compiled) + self._compile_map[key] = rexp_compiled return rexp_compiled def test(self, ctxt, s, rexp, flags=u''): Modified: lxml/trunk/src/lxml/lxml.etree.pyx ============================================================================== --- lxml/trunk/src/lxml/lxml.etree.pyx (original) +++ lxml/trunk/src/lxml/lxml.etree.pyx Wed Nov 19 08:44:26 2008 @@ -843,7 +843,7 @@ def __get__(self): cdef xmlNode* c_node cdef xmlNs* c_ns - nsmap = {} + cdef dict nsmap = {} c_node = self._c_node while c_node is not NULL and c_node.type == tree.XML_ELEMENT_NODE: c_ns = c_node.nsDef @@ -853,8 +853,7 @@ else: prefix = funicode(c_ns.prefix) if not python.PyDict_GetItem(nsmap, prefix): - python.PyDict_SetItem( - nsmap, prefix, funicode(c_ns.href)) + nsmap[prefix] = funicode(c_ns.href) c_ns = c_ns.next c_node = c_node.parent return nsmap Modified: lxml/trunk/src/lxml/lxml.objectify.pyx ============================================================================== --- lxml/trunk/src/lxml/lxml.objectify.pyx (original) +++ lxml/trunk/src/lxml/lxml.objectify.pyx Wed Nov 19 08:44:26 2008 @@ -152,6 +152,7 @@ cdef char* c_ns cdef char* c_child_ns cdef _Element child + cdef dict children c_ns = tree._getNs(self._c_node) if c_ns is NULL: tag = None @@ -163,7 +164,7 @@ continue name = pyunicode(child._c_node.name) if python.PyDict_GetItem(children, name) is NULL: - python.PyDict_SetItem(children, name, child) + children[name] = child return children def __len__(self): @@ -1926,14 +1927,14 @@ _xsi = u'xsd:' + _xsi else: name = _xsi - for prefix, ns in nsmap.items(): + for prefix, ns in nsmap.iteritems(): if ns == XML_SCHEMA_NS: if prefix is not None and prefix: _xsi = prefix + u':' + _xsi break else: raise ValueError, u"XSD types require the XSD namespace" - python.PyDict_SetItem(_attributes, XML_SCHEMA_INSTANCE_TYPE_ATTR, _xsi) + _attributes[XML_SCHEMA_INSTANCE_TYPE_ATTR] = _xsi if _pytype is None: # allow using unregistered or even wrong xsi:type names dict_result = python.PyDict_GetItem(_SCHEMA_TYPE_DICT, _xsi) @@ -1961,7 +1962,7 @@ if _pytype is not None: if _pytype == u"NoneType" or _pytype == u"none": strval = None - python.PyDict_SetItem(_attributes, XML_SCHEMA_INSTANCE_NIL_ATTR, u"true") + _attributes[XML_SCHEMA_INSTANCE_NIL_ATTR] = u"true" else: # check if type information from arguments is valid dict_result = python.PyDict_GetItem(_PYTYPE_DICT, _pytype) @@ -1970,7 +1971,7 @@ if type_check is not None: type_check(strval) - python.PyDict_SetItem(_attributes, PYTYPE_ATTRIBUTE, _pytype) + _attributes[PYTYPE_ATTRIBUTE] = _pytype return _makeElement(u"value", strval, _attributes, nsmap) Modified: lxml/trunk/src/lxml/nsclasses.pxi ============================================================================== --- lxml/trunk/src/lxml/nsclasses.pxi (original) +++ lxml/trunk/src/lxml/nsclasses.pxi Wed Nov 19 08:44:26 2008 @@ -15,7 +15,7 @@ u"Dictionary-like namespace registry" cdef object _ns_uri cdef object _ns_uri_utf - cdef object _entries + cdef dict _entries cdef char* _c_ns_uri_utf def __init__(self, ns_uri): self._ns_uri = ns_uri @@ -50,7 +50,7 @@ def __delitem__(self, name): if name is not None: name = _utf8(name) - python.PyDict_DelItem(self._entries, name) + del self._entries[name] cdef object _get(self, object name): cdef python.PyObject* dict_result @@ -161,7 +161,7 @@ ################################################################################ # XPath extension functions -cdef object __FUNCTION_NAMESPACE_REGISTRIES +cdef dict __FUNCTION_NAMESPACE_REGISTRIES __FUNCTION_NAMESPACE_REGISTRIES = {} def FunctionNamespace(ns_uri): @@ -219,20 +219,17 @@ self._prefix_utf = _utf8(prefix) self._prefix = prefix -cdef object _find_all_extension_prefixes(): +cdef list _find_all_extension_prefixes(): u"Internal lookup function to find all function prefixes for XSLT/XPath." cdef _XPathFunctionNamespaceRegistry registry cdef list ns_prefixes = [] - for registry in __FUNCTION_NAMESPACE_REGISTRIES.values(): + for registry in __FUNCTION_NAMESPACE_REGISTRIES.itervalues(): if registry._prefix_utf is not None: if registry._ns_uri_utf is not None: ns_prefixes.append( (registry._prefix_utf, registry._ns_uri_utf)) return ns_prefixes -cdef object _iter_ns_extension_functions(): - return __FUNCTION_NAMESPACE_REGISTRIES.items() - cdef object _find_extension(ns_uri_utf, name_utf): cdef python.PyObject* dict_result dict_result = python.PyDict_GetItem( Modified: lxml/trunk/src/lxml/objectpath.pxi ============================================================================== --- lxml/trunk/src/lxml/objectpath.pxi (original) +++ lxml/trunk/src/lxml/objectpath.pxi Wed Nov 19 08:44:26 2008 @@ -326,8 +326,8 @@ cdef python.PyObject* dict_result cdef tree.xmlNode* c_child cdef char* c_href + cdef dict tags = {} path_list.append( u'.'.join(path) ) - tags = {} c_href = tree._getNs(c_node) c_child = c_node.children while c_child is not NULL: @@ -347,7 +347,7 @@ count = 0 else: count = (dict_result) + 1 - python.PyDict_SetItem(tags, tag, count) + tags[tag] = count if count > 0: tag += u'[%d]' % count path.append(tag) Modified: lxml/trunk/src/lxml/python.pxd ============================================================================== --- lxml/trunk/src/lxml/python.pxd (original) +++ lxml/trunk/src/lxml/python.pxd Wed Nov 19 08:44:26 2008 @@ -59,11 +59,11 @@ cdef object PyList_AsTuple(object l) cdef void PyList_Clear(object l) - cdef int PyDict_SetItemString(object d, char* key, object value) except -1 - cdef int PyDict_SetItem(object d, object key, object value) except -1 +# cdef int PyDict_SetItemString(object d, char* key, object value) except -1 +# cdef int PyDict_SetItem(object d, object key, object value) except -1 cdef PyObject* PyDict_GetItemString(object d, char* key) cdef PyObject* PyDict_GetItem(object d, object key) - cdef int PyDict_DelItem(object d, object key) except -1 +# cdef int PyDict_DelItem(object d, object key) except -1 cdef void PyDict_Clear(object d) cdef object PyDict_Copy(object d) cdef object PyDictProxy_New(object d) Modified: lxml/trunk/src/lxml/saxparser.pxi ============================================================================== --- lxml/trunk/src/lxml/saxparser.pxi (original) +++ lxml/trunk/src/lxml/saxparser.pxi Wed Nov 19 08:44:26 2008 @@ -152,7 +152,7 @@ value = python.PyUnicode_DecodeUTF8( c_attributes[3], c_attributes[4] - c_attributes[3], "strict") - python.PyDict_SetItem(attrib, name, value) + attrib[name] = value c_attributes += 5 if c_nb_namespaces == 0: nsmap = EMPTY_READ_ONLY_DICT @@ -163,8 +163,7 @@ prefix = None else: prefix = funicode(c_namespaces[0]) - python.PyDict_SetItem( - nsmap, prefix, funicode(c_namespaces[1])) + nsmap[prefix] = funicode(c_namespaces[1]) c_namespaces += 2 element = context._target._handleSaxStart(tag, attrib, nsmap) if element is not None and c_ctxt.input is not NULL: @@ -202,7 +201,7 @@ else: value = funicode(c_attributes[1]) c_attributes = c_attributes + 2 - python.PyDict_SetItem(attrib, name, value) + attrib[name] = value element = context._target._handleSaxStart( tag, attrib, EMPTY_READ_ONLY_DICT) if element is not None and c_ctxt.input is not NULL: Modified: lxml/trunk/src/lxml/xmlid.pxi ============================================================================== --- lxml/trunk/src/lxml/xmlid.pxi (original) +++ lxml/trunk/src/lxml/xmlid.pxi Wed Nov 19 08:44:26 2008 @@ -9,6 +9,7 @@ attributes. The elements referenced by the ID are stored as dictionary values. """ + cdef dict dic global _find_id_attributes if _find_id_attributes is None: _find_id_attributes = XPath(u'//*[string(@id)]') @@ -17,7 +18,7 @@ root = XML(text) dic = {} for elem in _find_id_attributes(root): - python.PyDict_SetItem(dic, elem.get(u'id'), elem) + dic[elem.get(u'id')] = elem return (root, dic) def XMLDTDID(text): @@ -175,7 +176,7 @@ return dic, doc = context element = _elementFactory(doc, c_id.attr.parent) - python.PyDict_SetItem(dic, funicode(name), element) + dic[funicode(name)] = element cdef void _collectIdHashItemList(void* payload, void* context, char* name): # collect elements from ID attribute hash table Modified: lxml/trunk/src/lxml/xpath.pxi ============================================================================== --- lxml/trunk/src/lxml/xpath.pxi (original) +++ lxml/trunk/src/lxml/xpath.pxi Wed Nov 19 08:44:26 2008 @@ -473,10 +473,9 @@ namespace = namespace_def[1:-1] # remove '{}' namespace = python.PyUnicode_FromEncodedObject( namespace, 'UTF-8', 'strict') - python.PyDict_SetItem( - namespaces, - python.PyUnicode_FromEncodedObject(prefix, 'UTF-8', 'strict'), - namespace) + namespaces[ + python.PyUnicode_FromEncodedObject(prefix, 'UTF-8', 'strict') + ] = namespace prefix_str = prefix + ':' # FIXME: this also replaces {namespaces} within strings! path_utf = path_utf.replace(namespace_def, prefix_str) Modified: lxml/trunk/src/lxml/xslt.pxi ============================================================================== --- lxml/trunk/src/lxml/xslt.pxi (original) +++ lxml/trunk/src/lxml/xslt.pxi Wed Nov 19 08:44:26 2008 @@ -265,30 +265,29 @@ ctxt, _cstr(name_utf), _cstr(ns_utf), NULL) +cdef dict EMPTY_DICT = {} cdef class _XSLTContext(_BaseContext): cdef xslt.xsltTransformContext* _xsltCtxt - cdef object _extension_elements cdef _ReadOnlyElementProxy _extension_element_proxy + cdef dict _extension_elements def __init__(self, namespaces, extensions, enable_regexp, build_smart_strings): self._xsltCtxt = NULL - self._extension_elements = EMPTY_READ_ONLY_DICT + self._extension_elements = EMPTY_DICT if extensions is not None and extensions: for ns_name_tuple, extension in extensions.items(): if ns_name_tuple[0] is None: raise XSLTExtensionError, \ u"extensions must not have empty namespaces" if isinstance(extension, XSLTExtension): - if self._extension_elements is EMPTY_READ_ONLY_DICT: + if self._extension_elements is EMPTY_DICT: self._extension_elements = {} extensions = python.PyDict_Copy(extensions) ns_utf = _utf8(ns_name_tuple[0]) name_utf = _utf8(ns_name_tuple[1]) - python.PyDict_SetItem( - self._extension_elements, (ns_utf, name_utf), - extension) - python.PyDict_DelItem(extensions, ns_name_tuple) + self._extension_elements[(ns_utf, name_utf)] = extension + del extensions[ns_name_tuple] _BaseContext.__init__(self, namespaces, extensions, enable_regexp, build_smart_strings) From ianb at codespeak.net Thu Nov 20 20:25:48 2008 From: ianb at codespeak.net (ianb at codespeak.net) Date: Thu, 20 Nov 2008 20:25:48 +0100 (CET) Subject: [Lxml-checkins] r60038 - lxml/trunk Message-ID: <20081120192548.2A5D71684B2@codespeak.net> Author: ianb Date: Thu Nov 20 20:25:47 2008 New Revision: 60038 Modified: lxml/trunk/MANIFEST.in lxml/trunk/setupinfo.py Log: Include buildlibxml.py in the sdist/MANIFEST~ Modified: lxml/trunk/MANIFEST.in ============================================================================== --- lxml/trunk/MANIFEST.in (original) +++ lxml/trunk/MANIFEST.in Thu Nov 20 20:25:47 2008 @@ -1,5 +1,5 @@ exclude *.py -include setup.py ez_setup.py setupinfo.py versioninfo.py +include setup.py ez_setup.py setupinfo.py versioninfo.py buildlibxml.py include test.py selftest.py selftest2.py include update-error-constants.py include MANIFEST.in Makefile version.txt Modified: lxml/trunk/setupinfo.py ============================================================================== --- lxml/trunk/setupinfo.py (original) +++ lxml/trunk/setupinfo.py Thu Nov 20 20:25:47 2008 @@ -282,19 +282,19 @@ ## Option handling: -def has_option(name): +def has_option(name, default='false'): try: sys.argv.remove('--%s' % name) return True except ValueError: pass # allow passing all cmd line options also as environment variables - env_val = os.getenv(name.upper().replace('-', '_'), 'false').lower() + env_val = os.getenv(name.upper().replace('-', '_'), default).lower() if env_val == "true": return True return False -def option_value(name): +def option_value(name, default=None): for index, option in enumerate(sys.argv): if option == '--' + name: if index+1 >= len(sys.argv): @@ -307,7 +307,7 @@ value = option[len(name)+3:] sys.argv[index:index+1] = [] return value - env_val = os.getenv(name.upper().replace('-', '_')) + env_val = os.getenv(name.upper().replace('-', '_'), default) return env_val # pick up any commandline options @@ -317,7 +317,7 @@ OPTION_STATIC = has_option('static') OPTION_DEBUG_GCC = has_option('debug-gcc') OPTION_AUTO_RPATH = has_option('auto-rpath') -OPTION_BUILD_LIBXML2XSLT = has_option('static-deps') +OPTION_BUILD_LIBXML2XSLT = has_option('static-deps', 'true') if OPTION_BUILD_LIBXML2XSLT: OPTION_STATIC = True OPTION_LIBXML2_VERSION = option_value('libxml2-version') From ianb at codespeak.net Thu Nov 20 23:03:17 2008 From: ianb at codespeak.net (ianb at codespeak.net) Date: Thu, 20 Nov 2008 23:03:17 +0100 (CET) Subject: [Lxml-checkins] r60039 - lxml/trunk Message-ID: <20081120220317.23A431684A9@codespeak.net> Author: ianb Date: Thu Nov 20 23:03:16 2008 New Revision: 60039 Modified: lxml/trunk/setupinfo.py Log: Revert r60038, where I unintentially commited a change to setupinfo.py Modified: lxml/trunk/setupinfo.py ============================================================================== --- lxml/trunk/setupinfo.py (original) +++ lxml/trunk/setupinfo.py Thu Nov 20 23:03:16 2008 @@ -282,19 +282,19 @@ ## Option handling: -def has_option(name, default='false'): +def has_option(name): try: sys.argv.remove('--%s' % name) return True except ValueError: pass # allow passing all cmd line options also as environment variables - env_val = os.getenv(name.upper().replace('-', '_'), default).lower() + env_val = os.getenv(name.upper().replace('-', '_'), 'false').lower() if env_val == "true": return True return False -def option_value(name, default=None): +def option_value(name): for index, option in enumerate(sys.argv): if option == '--' + name: if index+1 >= len(sys.argv): @@ -307,7 +307,7 @@ value = option[len(name)+3:] sys.argv[index:index+1] = [] return value - env_val = os.getenv(name.upper().replace('-', '_'), default) + env_val = os.getenv(name.upper().replace('-', '_')) return env_val # pick up any commandline options @@ -317,7 +317,7 @@ OPTION_STATIC = has_option('static') OPTION_DEBUG_GCC = has_option('debug-gcc') OPTION_AUTO_RPATH = has_option('auto-rpath') -OPTION_BUILD_LIBXML2XSLT = has_option('static-deps', 'true') +OPTION_BUILD_LIBXML2XSLT = has_option('static-deps') if OPTION_BUILD_LIBXML2XSLT: OPTION_STATIC = True OPTION_LIBXML2_VERSION = option_value('libxml2-version') From ianb at codespeak.net Thu Nov 20 23:05:43 2008 From: ianb at codespeak.net (ianb at codespeak.net) Date: Thu, 20 Nov 2008 23:05:43 +0100 (CET) Subject: [Lxml-checkins] r60040 - lxml/trunk Message-ID: <20081120220543.D59CB1684A9@codespeak.net> Author: ianb Date: Thu Nov 20 23:05:43 2008 New Revision: 60040 Modified: lxml/trunk/buildlibxml.py Log: Substitute the version in the libxml2/libxslt filenames, even when the version was given explicitly (otherwise giving an explicit version was broken) Modified: lxml/trunk/buildlibxml.py ============================================================================== --- lxml/trunk/buildlibxml.py (original) +++ lxml/trunk/buildlibxml.py Thu Nov 20 23:05:43 2008 @@ -50,7 +50,6 @@ raise Exception( "Could not find the most current version of the %s from the files: %s" % (name, fns)) - filename = filename % version except IOError: # network failure - maybe we have the files already? latest = (0,0,0) @@ -66,6 +65,7 @@ break else: raise + filename = filename % version full_url = urlparse.urljoin(location, filename) dest_filename = os.path.join(dest_dir, filename) if os.path.exists(dest_filename): From scoder at codespeak.net Sun Nov 23 20:33:23 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 23 Nov 2008 20:33:23 +0100 (CET) Subject: [Lxml-checkins] r60094 - in lxml/trunk: . src/lxml Message-ID: <20081123193323.7ECAB1683D0@codespeak.net> Author: scoder Date: Sun Nov 23 20:33:23 2008 New Revision: 60094 Modified: lxml/trunk/ (props changed) lxml/trunk/src/lxml/etree_defs.h lxml/trunk/src/lxml/serializer.pxi Log: r4894 at delle: sbehnel | 2008-11-23 20:03:00 +0100 fix compile warnings Modified: lxml/trunk/src/lxml/etree_defs.h ============================================================================== --- lxml/trunk/src/lxml/etree_defs.h (original) +++ lxml/trunk/src/lxml/etree_defs.h Sun Nov 23 20:33:23 2008 @@ -22,9 +22,11 @@ # define PyString_GET_SIZE(s) PyBytes_GET_SIZE(s) # define PyString_AS_STRING(s) PyBytes_AS_STRING(s) #else +#if PY_VERSION_HEX < 0x02060000 /* we currently only use three parameters - MSVC can't compile (s, ...) */ # define PyUnicode_FromFormat(s, a, b) (NULL) #endif +#endif #if PY_VERSION_HEX >= 0x03000000 # define IS_PYTHON3 1 Modified: lxml/trunk/src/lxml/serializer.pxi ============================================================================== --- lxml/trunk/src/lxml/serializer.pxi (original) +++ lxml/trunk/src/lxml/serializer.pxi Sun Nov 23 20:33:23 2008 @@ -312,7 +312,7 @@ cdef _tofilelike(f, _Element element, encoding, method, bint write_xml_declaration, bint write_doctype, bint pretty_print, bint with_tail): - cdef python.PyThreadState* state + cdef python.PyThreadState* state = NULL cdef _FilelikeWriter writer cdef tree.xmlOutputBuffer* c_buffer cdef tree.xmlCharEncodingHandler* enchandler @@ -370,7 +370,7 @@ cdef char* c_filename cdef xmlDoc* c_base_doc cdef xmlDoc* c_doc - cdef int bytes + cdef int bytes = -1 c_base_doc = element._c_node.doc c_doc = _fakeRootDoc(c_base_doc, element._c_node) From scoder at codespeak.net Sun Nov 23 20:33:27 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 23 Nov 2008 20:33:27 +0100 (CET) Subject: [Lxml-checkins] r60095 - in lxml/trunk: . src/lxml Message-ID: <20081123193327.728F51683D2@codespeak.net> Author: scoder Date: Sun Nov 23 20:33:27 2008 New Revision: 60095 Modified: lxml/trunk/ (props changed) lxml/trunk/src/lxml/lxml.etree.pyx lxml/trunk/src/lxml/python.pxd Log: r4895 at delle: sbehnel | 2008-11-23 20:05:47 +0100 fix compile warnings Modified: lxml/trunk/src/lxml/lxml.etree.pyx ============================================================================== --- lxml/trunk/src/lxml/lxml.etree.pyx (original) +++ lxml/trunk/src/lxml/lxml.etree.pyx Sun Nov 23 20:33:27 2008 @@ -227,12 +227,23 @@ raise type, value, traceback -# forward declaration of _BaseParser, see parser.pxi +# forward declarations +cdef public class _Document [ type LxmlDocumentType, object LxmlDocument ] +cdef public class _Element [ type LxmlElementType, object LxmlElement ] cdef class _BaseParser cdef class QName - ctypedef public xmlNode* (*_node_to_node_function)(xmlNode*) +################################################################################ +# Include submodules + +include "proxy.pxi" # Proxy handling (element backpointers/memory/etc.) +include "apihelpers.pxi" # Private helper functions +include "xmlerror.pxi" # Error and log handling + + +################################################################################ +# Public Python API cdef public class _Document [ type LxmlDocumentType, object LxmlDocument ]: u"""Internal base class to reference a libxml document. @@ -520,7 +531,7 @@ raise ValueError, u"cannot assign None" if python.PySlice_Check(x): # slice assignment - _findChildSlice(x, self._c_node, &c_node, &step, &slicelength) + _findChildSlice(x, self._c_node, &c_node, &step, &slicelength) if step > 0: left_to_right = 1 else: @@ -563,7 +574,7 @@ _removeNode(self._doc, c_node) c_node = c_next else: - _findChildSlice(x, self._c_node, &c_node, &step, &slicelength) + _findChildSlice(x, self._c_node, &c_node, &step, &slicelength) _deleteSlice(self._doc, c_node, slicelength, step) else: # item deletion @@ -907,7 +918,7 @@ # slicing if _isFullSlice(x): return _collectChildren(self) - _findChildSlice(x, self._c_node, &c_node, &step, &slicelength) + _findChildSlice(x, self._c_node, &c_node, &step, &slicelength) if c_node is NULL: return [] if step > 0: @@ -2609,12 +2620,10 @@ element = _rootNodeOrRaise(tree_or_element) _removeUnusedNamespaceDeclarations(element._c_node) + ################################################################################ # Include submodules -include "proxy.pxi" # Proxy handling (element backpointers/memory/etc.) -include "apihelpers.pxi" # Private helper functions -include "xmlerror.pxi" # Error and log handling include "readonlytree.pxi" # Read-only implementation of Element proxies include "classlookup.pxi" # Element class lookup mechanisms include "nsclasses.pxi" # Namespace implementation and registry Modified: lxml/trunk/src/lxml/python.pxd ============================================================================== --- lxml/trunk/src/lxml/python.pxd (original) +++ lxml/trunk/src/lxml/python.pxd Sun Nov 23 20:33:27 2008 @@ -83,7 +83,7 @@ cdef bint PySlice_Check(object instance) cdef int _PyEval_SliceIndex(object value, Py_ssize_t* index) except 0 - cdef int PySlice_GetIndicesEx(object slice, Py_ssize_t length, + cdef int PySlice_GetIndicesEx(slice slice, Py_ssize_t length, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step, Py_ssize_t *slicelength) except -1 From scoder at codespeak.net Sun Nov 23 20:33:30 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 23 Nov 2008 20:33:30 +0100 (CET) Subject: [Lxml-checkins] r60096 - in lxml/trunk: . src/lxml Message-ID: <20081123193330.7963D1683D4@codespeak.net> Author: scoder Date: Sun Nov 23 20:33:29 2008 New Revision: 60096 Modified: lxml/trunk/ (props changed) lxml/trunk/src/lxml/xslt.pxi Log: r4896 at delle: sbehnel | 2008-11-23 20:28:48 +0100 fix gcc warning Modified: lxml/trunk/src/lxml/xslt.pxi ============================================================================== --- lxml/trunk/src/lxml/xslt.pxi (original) +++ lxml/trunk/src/lxml/xslt.pxi Sun Nov 23 20:33:29 2008 @@ -449,7 +449,7 @@ cdef _Document profile_doc cdef xmlDoc* c_profile_doc cdef xslt.xsltTransformContext* transform_ctxt - cdef xmlDoc* c_result + cdef xmlDoc* c_result = NULL cdef xmlDoc* c_doc cdef tree.xmlDict* c_dict From scoder at codespeak.net Sun Nov 23 20:33:34 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 23 Nov 2008 20:33:34 +0100 (CET) Subject: [Lxml-checkins] r60097 - in lxml/trunk: . src/lxml Message-ID: <20081123193334.7BB461683D5@codespeak.net> Author: scoder Date: Sun Nov 23 20:33:34 2008 New Revision: 60097 Modified: lxml/trunk/ (props changed) lxml/trunk/CHANGES.txt lxml/trunk/src/lxml/xslt.pxd lxml/trunk/src/lxml/xslt.pxi Log: r4897 at delle: sbehnel | 2008-11-23 20:32:08 +0100 use parse options of the input document during XSLT Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Sun Nov 23 20:33:34 2008 @@ -20,6 +20,8 @@ Bugs fixed ---------- +* XSLT didn't inherit the parse options of the input document. + * 0-bytes could slip through the API when used inside of Unicode strings. Modified: lxml/trunk/src/lxml/xslt.pxd ============================================================================== --- lxml/trunk/src/lxml/xslt.pxd (original) +++ lxml/trunk/src/lxml/xslt.pxd Sun Nov 23 20:33:34 2008 @@ -99,6 +99,9 @@ cdef void xsltTransformError(xsltTransformContext* ctxt, xsltStylesheet* style, xmlNode* node, char* msg, ...) + cdef void xsltSetCtxtParseOptions( + xsltTransformContext* ctxt, int options) + cdef extern from "libxslt/security.h": ctypedef struct xsltSecurityPrefs ctypedef enum xsltSecurityOption: Modified: lxml/trunk/src/lxml/xslt.pxi ============================================================================== --- lxml/trunk/src/lxml/xslt.pxi (original) +++ lxml/trunk/src/lxml/xslt.pxi Sun Nov 23 20:33:34 2008 @@ -464,6 +464,8 @@ python.PyErr_NoMemory() initTransformDict(transform_ctxt) + xslt.xsltSetCtxtParseOptions( + transform_ctxt, input_doc._parser._parse_options) if profile_run: transform_ctxt.profile = 1 From scoder at codespeak.net Sun Nov 23 20:37:46 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 23 Nov 2008 20:37:46 +0100 (CET) Subject: [Lxml-checkins] r60098 - in lxml/trunk: . doc Message-ID: <20081123193746.36B4E1683D0@codespeak.net> Author: scoder Date: Sun Nov 23 20:37:44 2008 New Revision: 60098 Modified: lxml/trunk/ (props changed) lxml/trunk/CHANGES.txt lxml/trunk/doc/main.txt Log: r4902 at delle: sbehnel | 2008-11-23 20:36:35 +0100 prepare release of 2.2alpha1 Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Sun Nov 23 20:37:44 2008 @@ -2,8 +2,8 @@ lxml changelog ============== -Under development -================= +2.2alpha1 (2008-11-23) +====================== Features added -------------- Modified: lxml/trunk/doc/main.txt ============================================================================== --- lxml/trunk/doc/main.txt (original) +++ lxml/trunk/doc/main.txt Sun Nov 23 20:37:44 2008 @@ -147,8 +147,8 @@ source release. If you can't wait, consider trying a less recent release version first. -The latest version is `lxml 2.1.3`_, released 2008-11-17 -(`changes for 2.1.3`_). `Older versions`_ are listed below. +The latest version is `lxml 2.2alpha1`_, released 2008-11-23 +(`changes for 2.2alpha1`_). `Older versions`_ are listed below. Please take a look at the `installation instructions`_! @@ -220,7 +220,7 @@ `2.0 `_ and the `current in-development version `_. -.. _`PDF documentation`: lxmldoc-2.1.2.pdf +.. _`PDF documentation`: lxmldoc-2.2alpha1.pdf * `lxml 2.1.3`_, released 2008-11-17 (`changes for 2.1.3`_) @@ -302,6 +302,7 @@ * `lxml 0.5`_, released 2005-04-08 +.. _`lxml 2.2alpha1`: lxml-2.2alpha1.tgz .. _`lxml 2.1.3`: lxml-2.1.3.tgz .. _`lxml 2.1.2`: lxml-2.1.2.tgz .. _`lxml 2.1.1`: lxml-2.1.1.tgz @@ -342,6 +343,7 @@ .. _`lxml 0.5.1`: lxml-0.5.1.tgz .. _`lxml 0.5`: lxml-0.5.tgz +.. _`changes for 2.2alpha1`: changes-2.2alpha1.html .. _`changes for 2.1.3`: changes-2.1.3.html .. _`changes for 2.1.2`: changes-2.1.2.html .. _`changes for 2.1.1`: changes-2.1.1.html From scoder at codespeak.net Fri Nov 28 08:58:32 2008 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 28 Nov 2008 08:58:32 +0100 (CET) Subject: [Lxml-checkins] r60196 - in lxml/trunk: . doc Message-ID: <20081128075832.15852168507@codespeak.net> Author: scoder Date: Fri Nov 28 08:58:29 2008 New Revision: 60196 Modified: lxml/trunk/ (props changed) lxml/trunk/doc/FAQ.txt Log: r4904 at delle: sbehnel | 2008-11-27 19:21:21 +0100 link to PyQuery Modified: lxml/trunk/doc/FAQ.txt ============================================================================== --- lxml/trunk/doc/FAQ.txt (original) +++ lxml/trunk/doc/FAQ.txt Fri Nov 28 08:58:29 2008 @@ -155,6 +155,7 @@ * lwebstring_, an XML template engine * OpenXMLlib_, a library for handling OpenXML document meta data * Pycoon_, a WSGI web development framework based on XML pipelines +* PyQuery_, a query framework for XML/HTML, similar to jQuery for JavaScript * Rambler_, a meta search engine that aggregates different data sources * rdfadict_, an RDFa parser with a simple dictionary-like interface. @@ -177,6 +178,7 @@ .. _lwebstring: http://pypi.python.org/pypi/lwebstring .. _OpenXMLlib: http://permalink.gmane.org/gmane.comp.python.lxml.devel/3250 .. _Pycoon: http://pypi.python.org/pypi/pycoon +.. _PyQuery: http://pypi.python.org/pypi/pyquery .. _Rambler: http://beta.rambler.ru/srch?query=python+lxml&searchtype=web .. _rdfadict: http://pypi.python.org/pypi/rdfadict .. _z3c.rml: http://pypi.python.org/pypi/z3c.rml