diff --git a/.travis.yml b/.travis.yml index 796086f..6b42aa7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ addons: postgresql: "9.6" # command to install dependencies -install: make pipupgrade +install: make pip # command to run tests script: make test diff --git a/migra/changes.py b/migra/changes.py index d52e036..d8ef8fc 100644 --- a/migra/changes.py +++ b/migra/changes.py @@ -24,11 +24,19 @@ def statements_for_changes( creations_only=False, drops_only=False, modifications=True, - dependency_ordering=False): + dependency_ordering=False, + add_dependents_for_modified=False): - added, removed, modified, _ = \ + added, removed, modified, unmodified = \ differences(things_from, things_target) + if add_dependents_for_modified: + for k, m in list(modified.items()): + for d in m.dependents_all: + if d in unmodified: + modified[d] = unmodified.pop(d) + modified = od(sorted(modified.items())) + statements = Statements() if not creations_only: @@ -212,7 +220,11 @@ class Changes(object): avf = od(sorted(avf)) bvf = od(sorted(bvf)) - return partial(statements_for_changes, avf, bvf) + return partial( + statements_for_changes, + avf, + bvf, + add_dependents_for_modified=True) elif name in THINGS: return partial( statements_for_changes, diff --git a/migra/migra.py b/migra/migra.py index dc0cc1f..40751e2 100644 --- a/migra/migra.py +++ b/migra/migra.py @@ -7,6 +7,9 @@ from .statements import Statements class Migration(object): + """ + The main class of migra + """ def __init__(self, x_from, x_target): self.statements = Statements() self.changes = Changes(None, None) diff --git a/migra/util.py b/migra/util.py index cc5e870..469e72b 100644 --- a/migra/util.py +++ b/migra/util.py @@ -3,7 +3,8 @@ from __future__ import unicode_literals from collections import OrderedDict as od -def differences(a, b): +def differences(a, b, add_dependencies_for_modifications=True): + a_keys = set(a.keys()) b_keys = set(b.keys()) diff --git a/tests/FIXTURES/dependencies/a.sql b/tests/FIXTURES/dependencies/a.sql index 3a69d3d..9bd4063 100644 --- a/tests/FIXTURES/dependencies/a.sql +++ b/tests/FIXTURES/dependencies/a.sql @@ -6,6 +6,10 @@ create view bbb_view2 as select name from aaa_view1; create view ccc_view3 as select name from bbb_view2; +create view ddd_changed as select name from basetable; + +create view ddd_unchanged as select name from ddd_changed; + create or replace function "public"."depends_on_bbb_view2"(t text) returns TABLE(x text) as $$ select * from bbb_view2 $$ diff --git a/tests/FIXTURES/dependencies/b.sql b/tests/FIXTURES/dependencies/b.sql index 8b13789..b7dc3c5 100644 --- a/tests/FIXTURES/dependencies/b.sql +++ b/tests/FIXTURES/dependencies/b.sql @@ -1 +1,5 @@ +create table basetable(id serial primary key, name text); +create view ddd_changed as select name, 'x' as x from basetable; + +create view ddd_unchanged as select name from ddd_changed; diff --git a/tests/FIXTURES/dependencies/expected.sql b/tests/FIXTURES/dependencies/expected.sql index 2edeb0f..68ab60d 100644 --- a/tests/FIXTURES/dependencies/expected.sql +++ b/tests/FIXTURES/dependencies/expected.sql @@ -1,15 +1,19 @@ -alter table "public"."basetable" drop constraint "basetable_pkey"; - -drop index if exists "public"."basetable_pkey"; - drop view if exists "public"."ccc_view3" cascade; drop function if exists "public"."depends_on_bbb_view2"(t text) cascade; +drop view if exists "public"."ddd_unchanged" cascade; + drop view if exists "public"."bbb_view2" cascade; +drop view if exists "public"."ddd_changed" cascade; + drop view if exists "public"."aaa_view1" cascade; -drop table "public"."basetable"; +create view "public"."ddd_changed" as SELECT basetable.name, + 'x' AS x + FROM basetable; -drop sequence if exists "public"."basetable_id_seq"; + +create view "public"."ddd_unchanged" as SELECT ddd_changed.name + FROM ddd_changed; diff --git a/tests/FIXTURES/dependencies/expected2.sql b/tests/FIXTURES/dependencies/expected2.sql index 1deb353..f414de8 100644 --- a/tests/FIXTURES/dependencies/expected2.sql +++ b/tests/FIXTURES/dependencies/expected2.sql @@ -1,21 +1,25 @@ -alter table "public"."basetable" drop constraint "basetable_pkey"; - -drop index if exists "public"."basetable_pkey"; - drop view if exists "public"."ccc_view3" cascade; -drop view if exists "public"."ddd" cascade; - drop function if exists "public"."depends_on_bbb_view2"(t text) cascade; drop view if exists "public"."eee" cascade; drop function if exists "public"."fff"(t text) cascade; +drop view if exists "public"."ddd_unchanged" cascade; + drop view if exists "public"."bbb_view2" cascade; +drop view if exists "public"."ddd" cascade; + +drop view if exists "public"."ddd_changed" cascade; + drop view if exists "public"."aaa_view1" cascade; -drop table "public"."basetable"; +create view "public"."ddd_changed" as SELECT basetable.name, + 'x' AS x + FROM basetable; -drop sequence if exists "public"."basetable_id_seq"; + +create view "public"."ddd_unchanged" as SELECT ddd_changed.name + FROM ddd_changed; diff --git a/tests/test_migra.py b/tests/test_migra.py index 6a1f364..c1af666 100644 --- a/tests/test_migra.py +++ b/tests/test_migra.py @@ -87,7 +87,8 @@ def do_fixture_test(fixture_name): m.add_sql(ADDITIONS) m.apply() m.add_all_changes() - + print('x') + print(m.sql.strip()) assert m.sql.strip() == EXPECTED2 # sql generated OK m.apply()