Add dependency on pycolib. Move common modules to pycolib. Add example table schema for meta DB.
--- 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 <http://hg.devl.cz/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
--- 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):
--- 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:
--- 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
--- 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=' ')
--- 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):
--- 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)
--- 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):
--- 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):
--- 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
-
--- 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='')
-
--- 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:
--- 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
--- 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 <radek.brich@devl.cz>
-#
-# 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)
-
--- 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
--- /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)
+);
--- 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):
--- 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))
--- 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()
-