Skip to content

Commit

Permalink
Merge 399a135 into f2a5e8e
Browse files Browse the repository at this point in the history
  • Loading branch information
jssuzanne committed Apr 9, 2021
2 parents f2a5e8e + 399a135 commit afca576
Show file tree
Hide file tree
Showing 8 changed files with 560 additions and 34 deletions.
10 changes: 10 additions & 0 deletions anyblok/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -214,3 +214,13 @@ def sgdb_in(engine, databases):
return True

return False


def return_list(entry):
if entry is None:
return []

elif not isinstance(entry, (list, tuple)):
entry = [entry]

return entry
4 changes: 4 additions & 0 deletions anyblok/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -800,6 +800,10 @@ def add_configuration_file(parser):
help="Relative path of the config file")
parser.add_argument('--without-auto-migration', dest='withoutautomigration',
action='store_true')
parser.add_argument('--ignore-migration-for-models', nargs="+",
help="Models to ignore migration")
parser.add_argument('--ignore-migration-for-schemas', nargs="+",
help="Schemas to ignore migration")
parser.add_argument('--isolation-level',
default="READ_COMMITTED",
choices=["SERIALIZABLE", "REPEATABLE_READ",
Expand Down
75 changes: 53 additions & 22 deletions anyblok/migration.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
# Copyright (C) 2017 Jean-Sebastien SUZANNE <jssuzanne@anybox.fr>
# Copyright (C) 2019 Joachim Trouverie
# Copyright (C) 2020 Jean-Sebastien SUZANNE <js.suzanne@gmail.com>
# Copyright (C) 2021 Jean-Sebastien SUZANNE <js.suzanne@gmail.com>
#
# This Source Code Form is subject to the terms of the Mozilla Public License,
# v. 2.0. If a copy of the MPL was not distributed with this file,You can
Expand All @@ -22,7 +23,7 @@
from sqlalchemy import inspect
from sqlalchemy.ext.compiler import compiles
from sqlalchemy.sql.ddl import CreateSchema, DropSchema
from .common import sgdb_in
from .common import sgdb_in, return_list
from sqlalchemy.schema import (
DDLElement, PrimaryKeyConstraint, CheckConstraint, UniqueConstraint)
from logging import getLogger
Expand Down Expand Up @@ -77,7 +78,13 @@ class MigrationReport:
"""

def ignore_migration_for(self, table, default=None):
def ignore_migration_for(self, schema, table, default=None):
if schema in self.ignore_migration_for_schema_from_configuration:
return True

if table in self.ignore_migration_for_table_from_configuration:
return True

return self.migration.ignore_migration_for.get(table, default)

def raise_if_withoutautomigration(self):
Expand Down Expand Up @@ -108,8 +115,8 @@ def init_add_table(self, diff):

def init_add_column(self, diff):
self.raise_if_withoutautomigration()
_, _, table, column = diff
if self.ignore_migration_for(table) is True:
_, schema, table, column = diff
if self.ignore_migration_for(schema, table) is True:
return True

self.log_names.append('Add %s.%s' % (table, column.name))
Expand Down Expand Up @@ -152,7 +159,8 @@ def can_remove_check_constraints(self, name):

def init_remove_constraint(self, diff):
_, constraint = diff
if self.ignore_migration_for(constraint.table.name) is True:
if self.ignore_migration_for(constraint.table.schema,
constraint.table.name) is True:
return True

self.log_names.append('Drop constraint %s on %s' % (
Expand All @@ -178,7 +186,8 @@ def can_remove_index(self, name):
def init_add_index(self, diff):
self.raise_if_withoutautomigration()
_, constraint = diff
if self.ignore_migration_for(constraint.table.name) is True:
if self.ignore_migration_for(constraint.table.schema,
constraint.table.name) is True:
return True # pragma: no cover

columns = [x.name for x in constraint.columns]
Expand All @@ -190,7 +199,8 @@ def init_add_index(self, diff):

def init_remove_index(self, diff):
_, index = diff
if self.ignore_migration_for(index.table.name) is True:
if self.ignore_migration_for(index.table.schema,
index.table.name) is True:
return True

self.log_names.append('Drop index %s on %s' % (index.name,
Expand All @@ -203,13 +213,15 @@ def init_remove_index(self, diff):
def init_add_fk(self, diff):
self.raise_if_withoutautomigration()
_, fk = diff
if self.ignore_migration_for(fk.table.name) is True:
if self.ignore_migration_for(fk.table.schema, fk.table.name) is True:
return True

from_ = []
to_ = []
for column in fk.columns:
if column.name in self.ignore_migration_for(fk.table.name, []):
if column.name in self.ignore_migration_for(
fk.table.schema, fk.table.name, []
):
return True

for fk_ in column.foreign_keys:
Expand All @@ -221,11 +233,13 @@ def init_add_fk(self, diff):

def init_remove_fk(self, diff):
_, fk = diff
if self.ignore_migration_for(fk.table.name) is True:
if self.ignore_migration_for(fk.table.schema, fk.table.name) is True:
return True

for column in fk.columns:
if column.name in self.ignore_migration_for(fk.table.name, []):
if column.name in self.ignore_migration_for(
fk.table.schema, fk.table.name, []
):
return True

for fk_ in column.foreign_keys:
Expand All @@ -240,7 +254,7 @@ def init_remove_fk(self, diff):
def init_add_ck(self, diff):
self.raise_if_withoutautomigration()
_, table, ck = diff
if self.ignore_migration_for(table) is True:
if self.ignore_migration_for(ck.table.schema, table) is True:
return True

if ck.table.schema:
Expand All @@ -251,7 +265,7 @@ def init_add_ck(self, diff):

def init_remove_ck(self, diff):
_, table, ck = diff
if self.ignore_migration_for(table) is True:
if self.ignore_migration_for(ck['schema'], table) is True:
return True

if ck['schema']:
Expand All @@ -270,12 +284,14 @@ def init_add_constraint(self, diff):
_, constraint = diff
columns = []

if self.ignore_migration_for(constraint.table.name) is True:
if self.ignore_migration_for(constraint.table.schema,
constraint.table.name) is True:
return True

for column in constraint.columns:
columns.append(column.name)
if column.name in self.ignore_migration_for(constraint.table.name,
if column.name in self.ignore_migration_for(constraint.table.schema,
constraint.table.name,
[]):
return True

Expand All @@ -293,7 +309,8 @@ def can_remove_column(self):

def init_remove_column(self, diff):
column = diff[3]
if self.ignore_migration_for(column.table.name) is True:
if self.ignore_migration_for(column.table.schema,
column.table.name) is True:
return True

msg = "Drop Column %s.%s" % (column.table.name,
Expand Down Expand Up @@ -361,10 +378,10 @@ def init_remove_table(self, diff):
return True

def init_modify_type(self, diff):
if self.ignore_migration_for(diff[2]) is True:
if self.ignore_migration_for(diff[1], diff[2]) is True:
return True

if diff[3] in self.ignore_migration_for(diff[2], []):
if diff[3] in self.ignore_migration_for(diff[1], diff[2], []):
return True

selected_plugin = self.get_plugin_for(diff[5], diff[6])
Expand All @@ -378,10 +395,10 @@ def init_modify_type(self, diff):
return False

def init_modify_nullable(self, diff):
if self.ignore_migration_for(diff[2]) is True:
if self.ignore_migration_for(diff[1], diff[2]) is True:
return True

if diff[3] in self.ignore_migration_for(diff[2], []):
if diff[3] in self.ignore_migration_for(diff[1], diff[2], []):
return True

table = "%s.%s" % diff[1:3] if diff[1] else diff[2]
Expand All @@ -390,10 +407,10 @@ def init_modify_nullable(self, diff):
return False

def init_modify_server_default(self, diff):
if self.ignore_migration_for(diff[2]) is True:
if self.ignore_migration_for(diff[1], diff[2]) is True:
return True

if diff[3] in self.ignore_migration_for(diff[2], []):
if diff[3] in self.ignore_migration_for(diff[1], diff[2], []):
return True

table = "%s.%s" % diff[1:3] if diff[1] else diff[2]
Expand Down Expand Up @@ -450,6 +467,19 @@ def __init__(self, migration, diffs):
self.diffs = diffs
self.log_names = []
self.plugins = self.init_plugins()
self.ignore_migration_for_table_from_configuration = [
self.migration.loaded_namespaces[x].__tablename__
for x in return_list(
Configuration.get('ignore_migration_for_models')
)
if (
x in self.migration.loaded_namespaces and
self.migration.loaded_namespaces[x].is_sql
)
]
self.ignore_migration_for_schema_from_configuration = return_list(
Configuration.get('ignore_migration_for_schemas'))

mappers = {
'add_schema': self.init_add_schema,
'add_table': self.init_add_table,
Expand Down Expand Up @@ -1411,6 +1441,7 @@ class Migration:
def __init__(self, registry):
self.withoutautomigration = registry.withoutautomigration
self.conn = registry.connection()
self.loaded_namespaces = registry.loaded_namespaces
self.loaded_views = registry.loaded_views
self.metadata = registry.declarativebase.metadata
self.ddl_compiler = self.conn.dialect.ddl_compiler(
Expand Down
7 changes: 0 additions & 7 deletions anyblok/registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,13 +53,6 @@ class RegistryConflictingException(Exception):
""" Simple Exception for Registry """


def return_list(entry):
if entry is not None and not isinstance(entry, (list, tuple)):
entry = [entry]

return entry


class RegistryManager:
""" Manage the global registry
Expand Down
4 changes: 3 additions & 1 deletion anyblok/scripts.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
# Copyright (C) 2014 Jean-Sebastien SUZANNE <jssuzanne@anybox.fr>
# Copyright (C) 2018 Jean-Sebastien SUZANNE <jssuzanne@anybox.fr>
# Copyright (C) 2019 Jean-Sebastien SUZANNE <js.suzanne@gmail.com>
# Copyright (C) 2021 Jean-Sebastien SUZANNE <js.suzanne@gmail.com>
#
# This Source Code Form is subject to the terms of the Mozilla Public License,
# v. 2.0. If a copy of the MPL was not distributed with this file,You can
Expand All @@ -11,7 +12,8 @@
from anyblok.release import version
from anyblok.blok import BlokManager
from anyblok.config import Configuration, get_db_name
from anyblok.registry import RegistryManager, return_list
from anyblok.registry import RegistryManager
from anyblok.common import return_list
from anyblok._graphviz import ModelSchema, SQLSchema
from argparse import RawDescriptionHelpFormatter
from textwrap import dedent
Expand Down
9 changes: 6 additions & 3 deletions anyblok/testing.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,12 +84,15 @@ def tmp_configuration(**values):
:param **values: values to update
"""
old_values = {
x: Configuration.get(x)
for x in values.keys()
}
Configuration.update(**values)
try:
old_configuration = Configuration.configuration.copy()
Configuration.update(**values)
yield
finally:
Configuration.configuration = old_configuration
Configuration.update(**old_values)


class TestCase(unittest.TestCase):
Expand Down

0 comments on commit afca576

Please sign in to comment.