From 8931f6ccc66206ceaba9c6f14211aeb747398880 Mon Sep 17 00:00:00 2001 From: Konstantin Gantsov Date: Sat, 21 Sep 2013 19:14:48 +0300 Subject: [PATCH] Added Sublime Text 3 support. --- FormatSQL.py | 54 ++++++++++++++++++++----------------- sqlparse/__init__.py | 10 +++---- sqlparse/engine/__init__.py | 8 +++--- sqlparse/engine/filter.py | 6 ++--- sqlparse/engine/grouping.py | 6 ++--- sqlparse/filters.py | 18 +++++++------ sqlparse/formatter.py | 6 ++--- sqlparse/keywords.py | 3 ++- sqlparse/lexer.py | 17 ++++++------ sqlparse/pipeline.py | 2 +- sqlparse/sql.py | 35 ++++++++++++++++-------- sqlparse/tokens.py | 1 + 12 files changed, 94 insertions(+), 72 deletions(-) diff --git a/FormatSQL.py b/FormatSQL.py index 918f844..7613219 100644 --- a/FormatSQL.py +++ b/FormatSQL.py @@ -1,30 +1,36 @@ +from __future__ import absolute_import import sublime import sublime_plugin -import re -from os.path import basename -import sqlparse + +try: + from .sqlparse import format +except ValueError: + from sqlparse import format + class FormatSqlCommand(sublime_plugin.TextCommand): def run(self, edit): - view = self.view - regions = view.sel() - # if there are more than 1 region or region one and it's not empty - if len(regions) > 1 or not regions[0].empty(): - for region in view.sel(): - if not region.empty(): - s = view.substr(region) - s = self._run(s) - view.replace(edit, region, s) - else: #format all text - alltextreg = sublime.Region(0, view.size()) - s = view.substr(alltextreg) - s = self._run(s) - view.replace(edit, alltextreg, s) + view = self.view + regions = view.sel() + # if there are more than 1 region or region one and it's not empty + if len(regions) > 1 or not regions[0].empty(): + for region in view.sel(): + if not region.empty(): + s = view.substr(region) + s = self._run(s) + view.replace(edit, region, s) + else: # format all text + alltextreg = sublime.Region(0, view.size()) + s = view.substr(alltextreg) + s = self._run(s) + view.replace(edit, alltextreg, s) - def _run(self, s): - settings = self.view.settings() - #indent_char = " " if settings.get("translate_tabs_to_spaces") else "\t" - indent_char = " " #TODO indent by TAB (currently not supported in python-sqlparse) - indent_size = int(settings.get("tab_size")) if indent_char == " " else 1 - s = s.encode("utf-8") - return sqlparse.format(s, keyword_case="upper", reindent=True, indent_width=indent_size) + def _run(self, s): + settings = self.view.settings() + #indent_char = " " if settings.get("translate_tabs_to_spaces") else "\t" + indent_char = " " #TODO indent by TAB (currently not supported in python-sqlparse) + indent_size = int(settings.get("tab_size")) if indent_char == " " else 1 + s = s.encode("utf-8") + return format( + s, keyword_case="upper", reindent=True, indent_width=indent_size + ) diff --git a/sqlparse/__init__.py b/sqlparse/__init__.py index 5ccf092..21521b1 100644 --- a/sqlparse/__init__.py +++ b/sqlparse/__init__.py @@ -4,7 +4,7 @@ # the BSD License: http://www.opensource.org/licenses/bsd-license.php. """Parse SQL statements.""" - +from __future__ import absolute_import __version__ = '0.1.3' @@ -14,9 +14,9 @@ class SQLParseError(Exception): # Setup namespace -from sqlparse import engine -from sqlparse import filters -from sqlparse import formatter +from . import engine +from . import filters +from . import formatter def parse(sql): @@ -55,7 +55,7 @@ def split(sql): return [unicode(stmt) for stmt in stack.run(sql)] -from sqlparse.engine.filter import StatementFilter +from .engine.filter import StatementFilter def split2(stream): splitter = StatementFilter() return list(splitter.process(None, stream)) \ No newline at end of file diff --git a/sqlparse/engine/__init__.py b/sqlparse/engine/__init__.py index 3e2822b..b5ce1ce 100644 --- a/sqlparse/engine/__init__.py +++ b/sqlparse/engine/__init__.py @@ -4,10 +4,10 @@ # the BSD License: http://www.opensource.org/licenses/bsd-license.php. """filter""" - -from sqlparse import lexer -from sqlparse.engine import grouping -from sqlparse.engine.filter import StatementFilter +from __future__ import absolute_import +from .. import lexer +from . import grouping +from .filter import StatementFilter # XXX remove this when cleanup is complete Filter = object diff --git a/sqlparse/engine/filter.py b/sqlparse/engine/filter.py index 421b3f3..3df7b70 100644 --- a/sqlparse/engine/filter.py +++ b/sqlparse/engine/filter.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- - -from sqlparse.sql import Statement, Token -from sqlparse import tokens as T +from __future__ import absolute_import +from ..sql import Statement, Token +from .. import tokens as T class TokenFilter(object): diff --git a/sqlparse/engine/grouping.py b/sqlparse/engine/grouping.py index a024016..b52c8f5 100644 --- a/sqlparse/engine/grouping.py +++ b/sqlparse/engine/grouping.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- - +from __future__ import absolute_import import itertools -from sqlparse import sql -from sqlparse import tokens as T +from .. import sql +from .. import tokens as T try: next diff --git a/sqlparse/filters.py b/sqlparse/filters.py index 6f9b579..91c8be4 100644 --- a/sqlparse/filters.py +++ b/sqlparse/filters.py @@ -1,13 +1,15 @@ # -*- coding: utf-8 -*- +from __future__ import absolute_import +from __future__ import unicode_literals import re from os.path import abspath, join -from sqlparse import sql -from sqlparse import tokens as T -from sqlparse.engine import FilterStack -from sqlparse.tokens import ( +from . import sql +from . import tokens as T +from .engine import FilterStack +from .tokens import ( Comment, Keyword, Name, Punctuation, String, Whitespace, ) @@ -36,7 +38,7 @@ def __init__(self, case=None): if case is None: case = 'upper' assert case in ['lower', 'upper', 'capitalize'] - self.convert = getattr(unicode, case) + self.convert = getattr(str, case) def process(self, stack, stream): for ttype, value in stream: @@ -111,7 +113,7 @@ def process(self, stack, stream): f = open(path) raw_sql = f.read() f.close() - except IOError, err: + except IOError as err: yield Comment, u'-- IOError: %s\n' % err else: @@ -213,7 +215,7 @@ def __init__(self, width=2, char=' ', line_width=None): def _get_offset(self, token): all_ = list(self._curr_stmt.flatten()) idx = all_.index(token) - raw = ''.join(unicode(x) for x in all_[:idx + 1]) + raw = ''.join(str(x) for x in all_[:idx + 1]) line = raw.splitlines()[-1] # Now take current offset into account and return relative offset. full_offset = len(line) - len(self.char * (self.width * self.indent)) @@ -467,7 +469,7 @@ def Tokens2Unicode(stream): result = "" for _, value in stream: - result += unicode(value) + result += str(value) return result diff --git a/sqlparse/formatter.py b/sqlparse/formatter.py index 5be6652..662fe9c 100644 --- a/sqlparse/formatter.py +++ b/sqlparse/formatter.py @@ -4,9 +4,9 @@ # the BSD License: http://www.opensource.org/licenses/bsd-license.php. """SQL formatter""" - -from sqlparse import SQLParseError -from sqlparse import filters +from __future__ import absolute_import +from . import SQLParseError +from . import filters def validate_options(options): diff --git a/sqlparse/keywords.py b/sqlparse/keywords.py index 9c59ee9..6044c2e 100644 --- a/sqlparse/keywords.py +++ b/sqlparse/keywords.py @@ -1,4 +1,5 @@ -from sqlparse import tokens +from __future__ import absolute_import +from . import tokens KEYWORDS = { 'ABORT': tokens.Keyword, diff --git a/sqlparse/lexer.py b/sqlparse/lexer.py index 456c7f4..08784bd 100644 --- a/sqlparse/lexer.py +++ b/sqlparse/lexer.py @@ -11,11 +11,12 @@ # http://pygments.org/ # It's separated from the rest of pygments to increase performance # and to allow some customizations. - +from __future__ import absolute_import +from __future__ import unicode_literals import re -from sqlparse import tokens -from sqlparse.keywords import KEYWORDS, KEYWORDS_COMMON +from . import tokens +from .keywords import KEYWORDS, KEYWORDS_COMMON class include(str): @@ -79,7 +80,7 @@ def _process_state(cls, unprocessed, processed, state): try: rex = re.compile(tdef[0], rflags).match - except Exception, err: + except Exception as err: raise ValueError(("uncompilable regex %r in state" " %r of %r: %s" % (tdef[0], state, cls, err))) @@ -150,9 +151,7 @@ def __call__(cls, *args, **kwds): return type.__call__(cls, *args, **kwds) -class Lexer(object): - - __metaclass__ = LexerMeta +class Lexer(object, metaclass=LexerMeta): encoding = 'utf-8' stripall = False @@ -209,7 +208,7 @@ def __init__(self): self.filters = [] def add_filter(self, filter_, **options): - from sqlparse.filters import Filter + from .filters import Filter if not isinstance(filter_, Filter): filter_ = filter_(**options) self.filters.append(filter_) @@ -223,7 +222,7 @@ def get_tokens(self, text, unfiltered=False): Also preprocess the text, i.e. expand tabs and strip it if wanted and applies registered filters. """ - if not isinstance(text, unicode): + if not isinstance(text, str): if self.encoding == 'guess': try: text = text.decode('utf-8') diff --git a/sqlparse/pipeline.py b/sqlparse/pipeline.py index 34dad19..23ac5d7 100644 --- a/sqlparse/pipeline.py +++ b/sqlparse/pipeline.py @@ -2,7 +2,7 @@ # # This module is part of python-sqlparse and is released under # the BSD License: http://www.opensource.org/licenses/bsd-license.php. - +from __future__ import absolute_import from types import GeneratorType diff --git a/sqlparse/sql.py b/sqlparse/sql.py index 244733b..ed981ab 100644 --- a/sqlparse/sql.py +++ b/sqlparse/sql.py @@ -1,10 +1,13 @@ # -*- coding: utf-8 -*- """This module contains classes representing syntactical elements of SQL.""" - +from __future__ import absolute_import +from __future__ import print_function +from __future__ import unicode_literals import re +import sys -from sqlparse import tokens as T +from . import tokens as T class Token(object): @@ -23,7 +26,10 @@ def __init__(self, ttype, value): self.parent = None def __str__(self): - return unicode(self).encode('utf-8') + if sys.version_info > (3, 0): + return self.__unicode__() + else: + return unicode(self).encode('utf-8') def __repr__(self): short = self._get_repr_value() @@ -35,13 +41,13 @@ def __unicode__(self): def to_unicode(self): """Returns a unicode representation of this object.""" - return unicode(self) + return str(self) def _get_repr_name(self): return str(self.ttype).split('.')[-1] def _get_repr_value(self): - raw = unicode(self) + raw = str(self) if len(raw) > 7: short = raw[:6] + u'...' else: @@ -67,7 +73,7 @@ def match(self, ttype, values, regex=False): type_matched = self.ttype is ttype if not type_matched or values is None: return type_matched - if isinstance(values, basestring): + if isinstance(values, str): values = set([values]) if regex: if self.ttype is T.Keyword: @@ -136,10 +142,13 @@ def __init__(self, tokens=None): Token.__init__(self, None, None) def __unicode__(self): - return ''.join(unicode(x) for x in self.flatten()) + return ''.join(str(x) for x in self.flatten()) def __str__(self): - return unicode(self).encode('utf-8') + if sys.version_info > (3, 0): + return self.__unicode__() + else: + return unicode(self).encode('utf-8') def _get_repr_name(self): return self.__class__.__name__ @@ -152,9 +161,13 @@ def _pprint_tree(self, max_depth=None, depth=0): pre = ' +-' else: pre = ' | ' - print '%s%s%d %s \'%s\'' % (indent, pre, idx, - token._get_repr_name(), - token._get_repr_value()) + print("%s%s%d %s '%s'" % ( + indent, + pre, + idx, + token._get_repr_name(), + token._get_repr_value() + )) if (token.is_group() and (max_depth is None or depth < max_depth)): token._pprint_tree(max_depth, depth + 1) diff --git a/sqlparse/tokens.py b/sqlparse/tokens.py index 01a9b89..577aa8d 100644 --- a/sqlparse/tokens.py +++ b/sqlparse/tokens.py @@ -8,6 +8,7 @@ # http://pygments.org/ """Tokens""" +from __future__ import absolute_import class _TokenType(tuple):