# HG changeset patch # User Radek Brich # Date 1365859325 -7200 # Node ID 515fadd3d286ba35c60b4133a419d9ba81e06cde # Parent 7b82dc1fb6f5774095afc1491d9ca6d41a789f81 Add dependency on pycolib. Move common modules to pycolib. Add example table schema for meta DB. diff -r 7b82dc1fb6f5 -r 515fadd3d286 README --- a/README Wed Apr 10 11:22:15 2013 +0200 +++ b/README Sat Apr 13 15:22:05 2013 +0200 @@ -7,15 +7,16 @@ * Python 3.2+ * Psycopg2 + * pycolib Optional: - * MyManager: + * for MyManager: * MySQLdb 1.2.3 * see extras for Python3 patch - * pgconsole: + * for pgconsole.py: * GTK3 + Python bindings + Cairo + GtkSource * packages in Debian: python3-gi python3-gi-cairo gir1.2-gtk-3.0 gir1.2-gtksource-3.0 - * browser: + * for browser.py: * tuikit (http://hg.devl.cz/tuikit) General Python Modules diff -r 7b82dc1fb6f5 -r 515fadd3d286 analyzeall.py --- a/analyzeall.py Wed Apr 10 11:22:15 2013 +0200 +++ b/analyzeall.py Sat Apr 13 15:22:05 2013 +0200 @@ -9,7 +9,6 @@ """ from pgtoolkit import pgbrowser, toolbase -from pgtoolkit.highlight import highlight class AnalyzeAllTool(toolbase.SimpleTool): diff -r 7b82dc1fb6f5 -r 515fadd3d286 batchquery.py --- a/batchquery.py Wed Apr 10 11:22:15 2013 +0200 +++ b/batchquery.py Sat Apr 13 15:22:05 2013 +0200 @@ -1,7 +1,6 @@ #!/usr/bin/env python3.2 from pgtoolkit import toolbase -from pgtoolkit.highlight import highlight class BatchQueryTool(toolbase.SimpleTool): @@ -53,7 +52,7 @@ d = dict() exec(f.read(), d) format_row = d['format_row'] - + with open(self.args.output, 'w', encoding='utf8') as f: for args, rows in results: if format_row: diff -r 7b82dc1fb6f5 -r 515fadd3d286 batchupdate.py --- a/batchupdate.py Wed Apr 10 11:22:15 2013 +0200 +++ b/batchupdate.py Sat Apr 13 15:22:05 2013 +0200 @@ -3,7 +3,6 @@ import time from pgtoolkit import toolbase -from pgtoolkit.highlight import highlight from pgtoolkit.pgmanager import OperationalError diff -r 7b82dc1fb6f5 -r 515fadd3d286 bigtables.py --- a/bigtables.py Wed Apr 10 11:22:15 2013 +0200 +++ b/bigtables.py Sat Apr 13 15:22:05 2013 +0200 @@ -1,6 +1,7 @@ #!/usr/bin/env python3.2 -from pgtoolkit import pgbrowser, toolbase, prettysize +from pgtoolkit import pgbrowser, toolbase +from pycolib import prettysize class BigTablesTool(toolbase.SimpleTool): @@ -19,7 +20,7 @@ for table in tables: table_name = '%s.%s' % (schema['name'], table['name']) all_tables.append({'name': table_name, 'size': table['size']}) - + # print names and sizes of 20 largest tables for table in sorted(all_tables, reverse=True, key=lambda x: x['size'])[:20]: print(prettysize.prettysize_short(table['size']).rjust(8), table['name'], sep=' ') diff -r 7b82dc1fb6f5 -r 515fadd3d286 listdepends.py --- a/listdepends.py Wed Apr 10 11:22:15 2013 +0200 +++ b/listdepends.py Sat Apr 13 15:22:05 2013 +0200 @@ -1,6 +1,6 @@ #!/usr/bin/env python3.2 -from pgtoolkit import pgbrowser, toolbase, prettysize +from pgtoolkit import pgbrowser, toolbase class ListDependsTool(toolbase.SimpleTool): diff -r 7b82dc1fb6f5 -r 515fadd3d286 listserial.py --- a/listserial.py Wed Apr 10 11:22:15 2013 +0200 +++ b/listserial.py Sat Apr 13 15:22:05 2013 +0200 @@ -1,16 +1,16 @@ #!/usr/bin/env python3.2 from pgtoolkit import toolbase, pgbrowser -from pgtoolkit.highlight import highlight, WHITE, YELLOW, RED, BOLD +from pycolib.ansicolor import highlight, WHITE, YELLOW, RED, BOLD class ListSerialTool(toolbase.SimpleTool): max_int = 2147483647 - + def __init__(self): toolbase.SimpleTool.__init__(self, name='listserial', desc='List sequences attached to column of type integer with dangerous last_value.') self.init() - + def main(self): conn = self.pgm.get_conn('target') browser = pgbrowser.PgBrowser(conn) diff -r 7b82dc1fb6f5 -r 515fadd3d286 listtables.py --- a/listtables.py Wed Apr 10 11:22:15 2013 +0200 +++ b/listtables.py Sat Apr 13 15:22:05 2013 +0200 @@ -1,6 +1,6 @@ #!/usr/bin/env python3.2 -from pgtoolkit import pgbrowser, toolbase, prettysize +from pgtoolkit import pgbrowser, toolbase class ListTablesTool(toolbase.SimpleTool): diff -r 7b82dc1fb6f5 -r 515fadd3d286 longqueries.py --- a/longqueries.py Wed Apr 10 11:22:15 2013 +0200 +++ b/longqueries.py Sat Apr 13 15:22:05 2013 +0200 @@ -1,7 +1,7 @@ #!/usr/bin/env python3.2 from pgtoolkit import pgstats, toolbase -from pgtoolkit.highlight import highlight, YELLOW, BOLD +from pycolib.ansicolor import highlight, YELLOW, BOLD class LongQueriesTool(toolbase.SimpleTool): diff -r 7b82dc1fb6f5 -r 515fadd3d286 pgtoolkit/coloredformatter.py --- a/pgtoolkit/coloredformatter.py Wed Apr 10 11:22:15 2013 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -import logging - -from pgtoolkit import highlight - - -class ColoredFormatter(logging.Formatter): - def __init__(self, fmt, datefmt): - logging.Formatter.__init__(self, fmt, datefmt) - - def format(self, record): - color = () - if record.levelno == logging.ERROR and record.exc_info is not None: - color = (11, 1) - if color: - origmsg = record.msg - f,b = color - record.msg = highlight(1, f, b) + record.msg + highlight(0) - res = logging.Formatter.format(self, record) - record.msg = origmsg - else: - res = logging.Formatter.format(self, record) - return res - diff -r 7b82dc1fb6f5 -r 515fadd3d286 pgtoolkit/highlight.py --- a/pgtoolkit/highlight.py Wed Apr 10 11:22:15 2013 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ -# -*- coding: utf-8 -*- - -(BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, BOLD) = range(0,9) - -names = ['black','red','green','yellow','blue','magenta','cyan','white'] - -disabled = False # set True to disable all colors - -def highlight(enable, fg=None, bg=None): - ''' - - highlight(1) -- switch to bold - highlight(1,1) -- red foreground - highlight(1,3,4) -- red on blue - highlight(0) -- reset - - ''' - global disabled - if disabled: - return '' - - if enable: - code = '1' - if fg is not None: - code = '' - if fg >= 8: - fg -= 8 - code += '1;' - code += str(30 + fg) - if bg is not None: - code += ';' - if bg >= 8: - bg -= 8 - code += '1;' - code += str(40 + bg) - return "\033[" + code + "m" - else: - return "\033[0m" - -def sethighlight(enable, fg=None, bg=None): - print(highlight(enable, fg, bg), end='') - - -if __name__ == '__main__': - for c in range(0,8): - print( - highlight(1,c), names[c].ljust(20), - highlight(1,8+c), names[c].ljust(20), - highlight(0), sep='') - diff -r 7b82dc1fb6f5 -r 515fadd3d286 pgtoolkit/pgdatadiff.py --- a/pgtoolkit/pgdatadiff.py Wed Apr 10 11:22:15 2013 +0200 +++ b/pgtoolkit/pgdatadiff.py Sat Apr 13 15:22:05 2013 +0200 @@ -26,7 +26,7 @@ from collections import OrderedDict from pgtoolkit import pgbrowser -from pgtoolkit.highlight import * +from pycolib.ansicolor import * class DiffData: diff -r 7b82dc1fb6f5 -r 515fadd3d286 pgtoolkit/pgdiff.py --- a/pgtoolkit/pgdiff.py Wed Apr 10 11:22:15 2013 +0200 +++ b/pgtoolkit/pgdiff.py Sat Apr 13 15:22:05 2013 +0200 @@ -25,7 +25,7 @@ # THE SOFTWARE. -from pgtoolkit.highlight import * +from pycolib.ansicolor import * import re import difflib diff -r 7b82dc1fb6f5 -r 515fadd3d286 pgtoolkit/prettysize.py --- a/pgtoolkit/prettysize.py Wed Apr 10 11:22:15 2013 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -# -*- coding: utf-8 -*- -# -# prettysize - print data sizes in format easily readable by humans -# -# Copyright (c) 2011 Radek Brich -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -iec_prefixes = ('Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi', 'Yi') -si_prefixes = 'kMGTPEZY' -big_prefixes = 'KMGTPEZY' - - -def prettysize(num, base=1024, prefixes=si_prefixes, unit='B', sep=' '): - '''Convert data size in bytes to human readable aproximation. - - Beware that default output is invalid by recent standardization. - Still, this form was in use for ages. - - For standardized output, see prettysize_si and prettysize_iec. - - ''' - prefixes = list(prefixes) - prefix = '' - num = float(num) - while True: - if num < base: - # format number - out = '{:.2f}'.format(num) - # cut off trailing zeros - out = out.rstrip('0') - if out.endswith('.'): - out = out[:-1] - return out + sep + prefix + unit - num /= base - prefix = prefixes.pop(0) - - raise OverflowError('Number is too large.') - - -def prettysize_si(num, **kw): - return prettysize(num, base=1000, **kw) - - -def prettysize_short(num): - return prettysize(num, unit='', sep='', prefixes=big_prefixes) - - -def prettysize_iec(num): - return prettysize(num, prefixes=iec_prefixes) - diff -r 7b82dc1fb6f5 -r 515fadd3d286 pgtoolkit/toolbase.py --- a/pgtoolkit/toolbase.py Wed Apr 10 11:22:15 2013 +0200 +++ b/pgtoolkit/toolbase.py Sat Apr 13 15:22:05 2013 +0200 @@ -2,9 +2,11 @@ import logging import re -from pgtoolkit import pgmanager, pgbrowser, configparser -from pgtoolkit.coloredformatter import ColoredFormatter -from pgtoolkit.highlight import highlight +from pycolib.configparser import ConfigParser +from pycolib.coloredformatter import ColoredFormatter +from pycolib.ansicolor import highlight + +from pgtoolkit import pgmanager, pgbrowser class ConnectionInfoNotFound(Exception): @@ -21,10 +23,10 @@ self.parser.add_argument('-d', dest='debug', action='store_true', help='Debug mode - print database queries.') - self.config = configparser.ConfigParser() - self.config.add_argument('databases', type=dict) - self.config.add_argument('meta_db') - self.config.add_argument('meta_query') + self.config = ConfigParser() + self.config.add_option('databases', type=dict) + self.config.add_option('meta_db') + self.config.add_option('meta_query') self.pgm = pgmanager.get_instance() self.target_isolation_level = None diff -r 7b82dc1fb6f5 -r 515fadd3d286 sql/metadb.sql --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sql/metadb.sql Sat Apr 13 15:22:05 2013 +0200 @@ -0,0 +1,15 @@ +CREATE SCHEMA config; + +CREATE TABLE config.databases +( + id serial NOT NULL, + name varchar NOT NULL, + host varchar, + port smallint, + dbname varchar, + "user" varchar, + password varchar, + + PRIMARY KEY (id), + UNIQUE (name) +); diff -r 7b82dc1fb6f5 -r 515fadd3d286 tablediff.py --- a/tablediff.py Wed Apr 10 11:22:15 2013 +0200 +++ b/tablediff.py Sat Apr 13 15:22:05 2013 +0200 @@ -9,7 +9,7 @@ # from pgtoolkit import toolbase, pgmanager, pgdatadiff -from pgtoolkit.highlight import * +from pycolib.ansicolor import highlight, BOLD, YELLOW class TableDiffTool(toolbase.SrcDstTablesTool): diff -r 7b82dc1fb6f5 -r 515fadd3d286 tests.py --- a/tests.py Wed Apr 10 11:22:15 2013 +0200 +++ b/tests.py Sat Apr 13 15:22:05 2013 +0200 @@ -4,7 +4,6 @@ from tests import test_rowdict from tests import test_pgmanager -from tests import test_prettysize enable_mysql = True try: @@ -18,7 +17,6 @@ suite = unittest.TestSuite() suite.addTests(loader.loadTestsFromModule(test_rowdict)) suite.addTests(loader.loadTestsFromModule(test_pgmanager)) -suite.addTests(loader.loadTestsFromModule(test_prettysize)) if enable_mysql: suite.addTests(loader.loadTestsFromModule(test_mymanager)) diff -r 7b82dc1fb6f5 -r 515fadd3d286 tests/test_prettysize.py --- a/tests/test_prettysize.py Wed Apr 10 11:22:15 2013 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +0,0 @@ -#!/usr/bin/env python3 - -from pgtoolkit import prettysize - -import unittest - - -class TestPrettySize(unittest.TestCase): - def test_prettysize(self): - psize = prettysize.prettysize_short - expected = ( - (0, '0'), - (1000, '1000'), - (1024, '1K'), - (1050, '1.03K'), - (2050, '2K'), - (333333, '325.52K'), - (1048576, '1M'), - (1050000, '1M'), - (5555555, '5.3M'), - (1073741824, '1G'), - ) - for input, result in expected: - self.assertEqual(psize(input), result) - - -if __name__ == '__main__': - unittest.main() -