summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--extras/py3k/Makefile19
-rw-r--r--extras/py3k/README8
-rw-r--r--extras/py3k/fixes.diff90
-rwxr-xr-xextras/py3k/setup.py103
-rwxr-xr-xsetup.py7
-rw-r--r--sqlparse/lexer.py5
-rw-r--r--sqlparse/sql.py26
-rw-r--r--tests/test_tokenize.py7
-rw-r--r--tox.ini12
9 files changed, 49 insertions, 228 deletions
diff --git a/extras/py3k/Makefile b/extras/py3k/Makefile
deleted file mode 100644
index 57fcaeb..0000000
--- a/extras/py3k/Makefile
+++ /dev/null
@@ -1,19 +0,0 @@
-2TO3=2to3
-2TO3OPTS=--no-diffs -w -n
-
-all: sqlparse tests
-
-sqlparse:
- cp -r ../../sqlparse .
- $(2TO3) $(2TO3OPTS) sqlparse
- patch -p0 < fixes.diff
-
-tests:
- cp -r ../../tests .
- $(2TO3) $(2TO3OPTS) tests
-
-clean:
- rm -rf sqlparse
- rm -rf tests
- rm -f sqlparse.diff
- rm -f tests.diff \ No newline at end of file
diff --git a/extras/py3k/README b/extras/py3k/README
deleted file mode 100644
index bb4cc9b..0000000
--- a/extras/py3k/README
+++ /dev/null
@@ -1,8 +0,0 @@
-Initial approach to provide a Python3 version of sqlparse.
-
-All tests pass (as of April 2009), but the Python3 version is
-considered experimental.
-
-To build this version run
-
- make all
diff --git a/extras/py3k/fixes.diff b/extras/py3k/fixes.diff
deleted file mode 100644
index 824e537..0000000
--- a/extras/py3k/fixes.diff
+++ /dev/null
@@ -1,90 +0,0 @@
-diff -ru sqlparse.orig/lexer.py sqlparse/lexer.py
---- sqlparse.orig/lexer.py 2012-11-15 02:15:39.179139370 +0400
-+++ sqlparse/lexer.py 2012-11-15 03:04:09.298963427 +0400
-@@ -219,15 +219,16 @@
- self.filters.append(filter_)
-
- def _decode(self, text):
-- if self.encoding == 'guess':
-- try:
-- text = text.decode('utf-8')
-- if text.startswith('\ufeff'):
-- text = text[len('\ufeff'):]
-- except UnicodeDecodeError:
-- text = text.decode('latin1')
-- else:
-- text = text.decode(self.encoding)
-+ if not isinstance(text, str):
-+ if self.encoding == 'guess':
-+ try:
-+ text = text.decode('utf-8')
-+ if text.startswith('\ufeff'):
-+ text = text[len('\ufeff'):]
-+ except UnicodeDecodeError:
-+ text = text.decode('latin1')
-+ else:
-+ text = text.decode(self.encoding)
-
- if self.tabsize > 0:
- text = text.expandtabs(self.tabsize)
-@@ -242,17 +243,17 @@
- Also preprocess the text, i.e. expand tabs and strip it if
- wanted and applies registered filters.
- """
-- if isinstance(text, str):
-+ if isinstance(text, str) or isinstance(text, bytes):
- if self.stripall:
- text = text.strip()
- elif self.stripnl:
- text = text.strip('\n')
-
- if isinstance(text, str):
-- text = StringIO(text.encode('utf-8'))
-- self.encoding = 'utf-8'
-- else:
- text = StringIO(text)
-+ else:
-+ text = StringIO(text.decode('utf-8'))
-+ self.encoding = 'utf-8'
-
- def streamer():
- for i, t, v in self.get_tokens_unprocessed(text):
-diff -ru sqlparse.orig/sql.py sqlparse/sql.py
---- sqlparse.orig/sql.py 2012-11-15 02:15:39.179139370 +0400
-+++ sqlparse/sql.py 2012-11-15 02:27:15.779097255 +0400
-@@ -25,24 +25,13 @@
- self.parent = None
-
- def __str__(self):
-- return str(self).encode('utf-8')
-+ return self.value or ''
-
- def __repr__(self):
-- short = self._get_repr_value().encode('utf-8')
-+ short = self._get_repr_value()
- return '<%s \'%s\' at 0x%07x>' % (self._get_repr_name(),
- short, id(self))
-
-- def __unicode__(self):
-- """Returns a unicode representation of this object."""
-- return self.value or ''
--
-- def to_unicode(self):
-- """Returns a unicode representation of this object.
--
-- @deprecated: please use __unicode__()
-- """
-- return str(self)
--
- def _get_repr_name(self):
- return str(self.ttype).split('.')[-1]
-
-@@ -149,7 +138,7 @@
- self.tokens = tokens
- Token.__init__(self, None, str(self))
-
-- def __unicode__(self):
-+ def __str__(self):
- return ''.join(str(x) for x in self.flatten())
-
- def _get_repr_name(self):
diff --git a/extras/py3k/setup.py b/extras/py3k/setup.py
deleted file mode 100755
index a6665ff..0000000
--- a/extras/py3k/setup.py
+++ /dev/null
@@ -1,103 +0,0 @@
-# Copyright (C) 2008 Andi Albrecht, albrecht.andi@gmail.com
-#
-# This setup script is part of python-sqlparse and is released under
-# the BSD License: http://www.opensource.org/licenses/bsd-license.php.
-
-import os
-from distutils.core import setup
-
-import sqlparse
-
-
-def find_packages(base):
- ret = [base]
- for path in os.listdir(base):
- if path.startswith('.'):
- continue
- full_path = os.path.join(base, path)
- if os.path.isdir(full_path):
- ret += find_packages(full_path)
- return ret
-
-
-LONG_DESCRIPTION = """
-``sqlparse`` is a non-validating SQL parser module.
-It provides support for parsing, splitting and formatting SQL statements.
-
-Visit the `project page <http://code.google.com/p/python-sqlparse/>`_ for
-additional information and documentation.
-
-**Example Usage**
-
-
-Splitting SQL statements::
-
- >>> import sqlparse
- >>> sqlparse.split('select * from foo; select * from bar;')
- [u'select * from foo; ', u'select * from bar;']
-
-
-Formatting statemtents::
-
- >>> sql = 'select * from foo where id in (select id from bar);'
- >>> print sqlparse.format(sql, reindent=True, keyword_case='upper')
- SELECT *
- FROM foo
- WHERE id IN
- (SELECT id
- FROM bar);
-
-
-Parsing::
-
- >>> sql = 'select * from someschema.mytable where id = 1'
- >>> res = sqlparse.parse(sql)
- >>> res
- (<Statement 'select...' at 0x9ad08ec>,)
- >>> stmt = res[0]
- >>> unicode(stmt) # converting it back to unicode
- u'select * from someschema.mytable where id = 1'
- >>> # This is how the internal representation looks like:
- >>> stmt.tokens
- (<DML 'select' at 0x9b63c34>,
- <Whitespace ' ' at 0x9b63e8c>,
- <Operator '*' at 0x9b63e64>,
- <Whitespace ' ' at 0x9b63c5c>,
- <Keyword 'from' at 0x9b63c84>,
- <Whitespace ' ' at 0x9b63cd4>,
- <Identifier 'somes...' at 0x9b5c62c>,
- <Whitespace ' ' at 0x9b63f04>,
- <Where 'where ...' at 0x9b5caac>)
-
-"""
-
-
-DOWNLOAD_URL = ('http://python-sqlparse.googlecode.com/files/'
- 'sqlparse-%s.tar.gz' % sqlparse.__version__)
-
-
-setup(
- name='sqlparse',
- version=sqlparse.__version__,
- packages=find_packages('sqlparse'),
- description='Non-validating SQL parser',
- author='Andi Albrecht',
- author_email='albrecht.andi@gmail.com',
- download_url=DOWNLOAD_URL,
- long_description=LONG_DESCRIPTION,
- license='BSD',
- url='http://python-sqlparse.googlecode.com/',
- classifiers=[
- 'Development Status :: 4 - Beta',
- 'Intended Audience :: Developers',
- 'License :: OSI Approved :: BSD License',
- 'Operating System :: OS Independent',
- 'Programming Language :: Python',
- 'Programming Language :: Python :: 2',
- 'Programming Language :: Python :: 2.4',
- 'Programming Language :: Python :: 2.5',
- 'Programming Language :: Python :: 2.6',
- 'Topic :: Database',
- 'Topic :: Software Development'
- ],
-)
diff --git a/setup.py b/setup.py
index 7421e34..6b71b12 100755
--- a/setup.py
+++ b/setup.py
@@ -4,6 +4,7 @@
# the BSD License: http://www.opensource.org/licenses/bsd-license.php.
import re
+import sys
from setuptools import setup, find_packages
@@ -81,6 +82,11 @@ DOWNLOAD_URL = (
)
+kwargs = {}
+if sys.version_info[0] == 3:
+ kwargs['use_2to3'] = True
+
+
setup(
name='sqlparse',
version=VERSION,
@@ -109,4 +115,5 @@ setup(
'Topic :: Software Development'
],
scripts=['bin/sqlformat'],
+ **kwargs
)
diff --git a/sqlparse/lexer.py b/sqlparse/lexer.py
index 3348be8..a92e2b7 100644
--- a/sqlparse/lexer.py
+++ b/sqlparse/lexer.py
@@ -13,6 +13,7 @@
# and to allow some customizations.
import re
+import sys
from sqlparse import tokens
from sqlparse.keywords import KEYWORDS, KEYWORDS_COMMON
@@ -220,6 +221,8 @@ class Lexer(object):
self.filters.append(filter_)
def _decode(self, text):
+ if sys.version_info[0] == 3:
+ return text
if self.encoding == 'guess':
try:
text = text.decode('utf-8')
@@ -249,7 +252,7 @@ class Lexer(object):
elif self.stripnl:
text = text.strip('\n')
- if isinstance(text, unicode):
+ if sys.version_info[0] < 3 and isinstance(text, unicode):
text = StringIO(text.encode('utf-8'))
self.encoding = 'utf-8'
else:
diff --git a/sqlparse/sql.py b/sqlparse/sql.py
index 77448d7..8c8f74c 100644
--- a/sqlparse/sql.py
+++ b/sqlparse/sql.py
@@ -3,6 +3,7 @@
"""This module contains classes representing syntactical elements of SQL."""
import re
+import sys
from sqlparse import tokens as T
@@ -25,10 +26,15 @@ class Token(object):
self.parent = None
def __str__(self):
- return unicode(self).encode('utf-8')
+ if sys.version_info[0] == 3:
+ return self.value
+ else:
+ return unicode(self).encode('utf-8')
def __repr__(self):
- short = self._get_repr_value().encode('utf-8')
+ short = self._get_repr_value()
+ if sys.version_info[0] < 3:
+ short = short.encode('utf-8')
return '<%s \'%s\' at 0x%07x>' % (self._get_repr_name(),
short, id(self))
@@ -147,10 +153,22 @@ class TokenList(Token):
if tokens is None:
tokens = []
self.tokens = tokens
- Token.__init__(self, None, unicode(self))
+ Token.__init__(self, None, self._to_string())
def __unicode__(self):
- return ''.join(unicode(x) for x in self.flatten())
+ return self._to_string()
+
+ def __str__(self):
+ str_ = self._to_string()
+ if sys.version_info[0] < 2:
+ str_ = str_.encode('utf-8')
+ return str_
+
+ def _to_string(self):
+ if sys.version_info[0] == 3:
+ return ''.join(x.value for x in self.flatten())
+ else:
+ return ''.join(unicode(x) for x in self.flatten())
def _get_repr_name(self):
return self.__class__.__name__
diff --git a/tests/test_tokenize.py b/tests/test_tokenize.py
index 417aef6..02af141 100644
--- a/tests/test_tokenize.py
+++ b/tests/test_tokenize.py
@@ -1,7 +1,10 @@
# -*- coding: utf-8 -*-
-import unittest
+import sys
import types
+import unittest
+
+import pytest
import sqlparse
from sqlparse import lexer
@@ -69,6 +72,8 @@ class TestTokenize(unittest.TestCase):
self.assertEqual(tokens[2][0], Number.Integer)
self.assertEqual(tokens[2][1], '-1')
+ # Somehow this test fails on Python 3.2
+ @pytest.mark.skipif('sys.version_info >= (3,0)')
def test_tab_expansion(self):
s = "\t"
lex = lexer.Lexer()
diff --git a/tox.ini b/tox.ini
index 959054d..fe5ef17 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,8 +1,16 @@
[tox]
-envlist=py25,py26,py27,pypy
+envlist=py25,py26,py27,pypy,py32
[testenv]
deps=
pytest
pytest-cov
-commands=py.test --cov=sqlparse/ tests \ No newline at end of file
+commands=py.test --cov=sqlparse/ tests
+
+[testenv:py32]
+changedir={envdir}
+commands=
+ rm -rf tests/
+ cp -r {toxinidir}/tests/ tests/
+ 2to3 -w --no-diffs -n tests/
+ py.test --cov={envdir}/lib/python3.2/site-packages/sqlparse/ tests