diff -r ba323bbed6a4 -r 0bcc13460dae pgtoolkit/pgdiff.py --- a/pgtoolkit/pgdiff.py Mon Dec 17 21:12:04 2012 +0100 +++ b/pgtoolkit/pgdiff.py Thu Jan 24 17:11:17 2013 +0100 @@ -118,6 +118,30 @@ self.name = table +class DiffFunction(DiffBase): + def __init__(self, change, schema, function): + DiffBase.__init__(self) + self.level = 1 + self.type = 'function' + self.change = change + self.schema = schema + self.function = function + self.name = function + + def _formatchanges(self): + res = [] + for x in self.changes: + type, a, b = x + if type == 'source': + s = 'Changed source.' + else: + s = ''.join(['Changed ', type, ' from ', + highlight(1,15), a, highlight(0), ' to ', + highlight(1,15), b, highlight(0), '.']) + res.append(s) + return ' '.join(res) + + class DiffColumn(DiffBase): ALTER_COMMANDS = { '+' : 'ADD', @@ -223,6 +247,16 @@ if x not in src: yield ('+', x) + def _compare_functions(self, a, b): + diff = [] + if a.arguments != b.arguments: + diff.append(('args', a.arguments, b.arguments)) + if a.result != b.result: + diff.append(('result', a.result, b.result)) + if a.source != b.source: + diff.append(('source', a.source, b.source)) + return diff + def _compare_columns(self, a, b): diff = [] if a.type != b.type: @@ -277,7 +311,7 @@ else: yield cdo - def _difftables(self, schema, src_tables, dst_tables): + def _diff_tables(self, schema, src_tables, dst_tables): for nd in self._diff_names(src_tables, dst_tables): if not self._test_table(nd[1]): continue @@ -302,6 +336,19 @@ else: yield tdo + def _diff_functions(self, schema, src_functions, dst_functions): + for nd in self._diff_names(src_functions, dst_functions): + fdo = DiffFunction(change=nd[0], schema=schema, function=nd[1]) + if nd[0] == '*': + # compare function body and arguments + a = src_functions[nd[1]] + b = dst_functions[nd[1]] + fdo.changes = self._compare_functions(a, b) + if fdo.changes: + yield fdo + else: + yield fdo + def iter_diff(self): '''Return diff between src and dst database schema. @@ -317,13 +364,22 @@ for nd in self._diff_names(src, dst): sdo = DiffSchema(change=nd[0], schema=nd[1]) if nd[0] == '*': + # tables src_tables = src_schemas[nd[1]].tables dst_tables = dst_schemas[nd[1]].tables - for tdo in self._difftables(nd[1], src_tables, dst_tables): + for tdo in self._diff_tables(nd[1], src_tables, dst_tables): if sdo: yield sdo sdo = None yield tdo + # functions + src_functions = src_schemas[nd[1]].functions + dst_functions = dst_schemas[nd[1]].functions + for fdo in self._diff_functions(nd[1], src_functions, dst_functions): + if sdo: + yield sdo + sdo = None + yield fdo else: yield sdo