def process_revision_directives(context, rev, generate_revisions): existing_upgrades = generate_revisions[0].upgrade_ops existing_downgrades = generate_revisions[0].downgrade_ops # model1 will run the upgrades, e.g. create the table, # model2 will run the downgrades as upgrades, e.g. drop # the table again generate_revisions[:] = [ ops.MigrationScript( util.rev_id(), existing_upgrades, ops.DowngradeOps(), version_path=os.path.join(_get_staging_directory(), "model1"), head="model1@head", ), ops.MigrationScript( util.rev_id(), ops.UpgradeOps(ops=existing_downgrades.ops), ops.DowngradeOps(), version_path=os.path.join(_get_staging_directory(), "model2"), head="model2@head", ), ]
def process_revision_directives(context, rev, generate_revisions): existing_upgrades = generate_revisions[0].upgrade_ops existing_downgrades = generate_revisions[0].downgrade_ops # model1 will run the upgrades, e.g. create the table, # model2 will run the downgrades as upgrades, e.g. drop # the table again generate_revisions[:] = [ ops.MigrationScript( util.rev_id(), existing_upgrades, ops.DowngradeOps(), version_path=os.path.join( _get_staging_directory(), "model1"), head="model1@head" ), ops.MigrationScript( util.rev_id(), existing_downgrades, ops.DowngradeOps(), version_path=os.path.join( _get_staging_directory(), "model2"), head="model2@head" ) ]
def process_revision_directives(context, rev, generate_revisions): generate_revisions[:] = [ ops.MigrationScript( util.rev_id(), ops.UpgradeOps(), ops.DowngradeOps(), version_path=os.path.join( _get_staging_directory(), "model1"), head="model1@head" ), ops.MigrationScript( util.rev_id(), ops.UpgradeOps(), ops.DowngradeOps(), version_path=os.path.join( _get_staging_directory(), "model2"), head="model2@head" ), ops.MigrationScript( util.rev_id(), ops.UpgradeOps(), ops.DowngradeOps(), version_path=os.path.join( _get_staging_directory(), "model3"), head="model3@head" ), ]
def process_revision_directives(context, rev, generate_revisions): generate_revisions[:] = [ ops.MigrationScript( util.rev_id(), ops.UpgradeOps(), ops.DowngradeOps(), version_path=os.path.join(_get_staging_directory(), "model1"), head="model1@head", ), ops.MigrationScript( util.rev_id(), ops.UpgradeOps(), ops.DowngradeOps(), version_path=os.path.join(_get_staging_directory(), "model2"), head="model2@head", ), ops.MigrationScript( util.rev_id(), ops.UpgradeOps(), ops.DowngradeOps(), version_path=os.path.join(_get_staging_directory(), "model3"), head="model3@head", ), ]
def test_script_location_muliple(self): config = _multi_dir_testing_config() script = ScriptDirectory.from_config(config) def normpath(path): return path.replace("/", ":NORM:") normpath = mock.Mock(side_effect=normpath) with mock.patch("os.path.normpath", normpath): eq_( script._version_locations, [ os.path.abspath( os.path.join(_get_staging_directory(), "model1/")).replace("/", ":NORM:"), os.path.abspath( os.path.join(_get_staging_directory(), "model2/")).replace("/", ":NORM:"), os.path.abspath( os.path.join(_get_staging_directory(), "model3/")).replace("/", ":NORM:"), ], )
def test_script_location(self): config = _no_sql_testing_config() script = ScriptDirectory.from_config(config) def normpath(path): return path.replace("/", ":NORM:") normpath = mock.Mock(side_effect=normpath) with mock.patch("os.path.normpath", normpath): eq_( script._version_locations, ( os.path.abspath( os.path.join( _get_staging_directory(), "scripts", "versions" ) ).replace("/", ":NORM:"), ), ) eq_( script.versions, os.path.abspath( os.path.join( _get_staging_directory(), "scripts", "versions" ) ).replace("/", ":NORM:"), )
def stop_test_class(cls): sqla_stc(cls) import os from alembic.testing.env import _get_staging_directory assert not os.path.exists(_get_staging_directory()), ( "staging directory %s was not cleaned up" % _get_staging_directory())
def test_args(self): script = ScriptDirectory(_get_staging_directory(), file_template="%(rev)s_%(slug)s_" "%(year)s_%(month)s_" "%(day)s_%(hour)s_" "%(minute)s_%(second)s") create_date = datetime.datetime(2012, 7, 25, 15, 8, 5) eq_( script._rev_path(script.versions, "12345", "this is a message", create_date), os.path.abspath("%s/versions/12345_this_is_a_" "message_2012_7_25_15_8_5.py" % _get_staging_directory()))
def test_multiple_dir_no_bases_version_path(self): script = command.revision( self.cfg, message="x", version_path=os.path.join(_get_staging_directory(), "model1"), ) assert os.access(script.path, os.F_OK)
def setUp(self): self.env = staging_env() self.cfg = _multi_dir_testing_config() self.cfg.set_main_option("revision_environment", "true") script = ScriptDirectory.from_config(self.cfg) # MARKMARK self.model1 = util.rev_id() self.model2 = util.rev_id() self.model3 = util.rev_id() for model, name in [ (self.model1, "model1"), (self.model2, "model2"), (self.model3, "model3"), ]: script.generate_revision( model, name, refresh=True, version_path=os.path.join(_get_staging_directory(), name), head="base") write_script(script, model, """\ "%s" revision = '%s' down_revision = None branch_labels = ['%s'] from alembic import op def upgrade(): pass def downgrade(): pass """ % (name, model, name))
def test_args(self): script = ScriptDirectory( _get_staging_directory(), file_template="%(rev)s_%(slug)s_" "%(year)s_%(month)s_" "%(day)s_%(hour)s_" "%(minute)s_%(second)s" ) create_date = datetime.datetime(2012, 7, 25, 15, 8, 5) eq_( script._rev_path( script.versions, "12345", "this is a message", create_date), os.path.abspath( "%s/versions/12345_this_is_a_" "message_2012_7_25_15_8_5.py" % _get_staging_directory()) )
def setUp(self): self.env = staging_env() self.cfg = _multi_dir_testing_config() self.cfg.set_main_option("revision_environment", "true") script = ScriptDirectory.from_config(self.cfg) self.model1 = util.rev_id() self.model2 = util.rev_id() self.model3 = util.rev_id() for model, name in [ (self.model1, "model1"), (self.model2, "model2"), (self.model3, "model3"), ]: script.generate_revision( model, name, refresh=True, version_path=os.path.join(_get_staging_directory(), name), head="base") write_script(script, model, """\ "%s" revision = '%s' down_revision = None branch_labels = ['%s'] from alembic import op def upgrade(): pass def downgrade(): pass """ % (name, model, name))
def expected_additional_arguments_fn(rev_path): return [ "arg1", rev_path, "--config", os.path.abspath(_get_staging_directory()) + "/pyproject.toml", ]
def _write_metadata(self, meta): path = os.path.join(_get_staging_directory(), 'scripts', 'env.py') with open(path) as env_: existing_env = env_.read() existing_env = existing_env.replace("target_metadata = {}", meta) with open(path, "w") as env_: env_.write(existing_env)
def _write_metadata(self, meta): path = os.path.join(_get_staging_directory(), 'scripts', 'env.py') with open(path) as env_: existing_env = env_.read() existing_env = existing_env.replace( "target_metadata = {}", meta) with open(path, "w") as env_: env_.write(existing_env)
def test_new_locations_no_autogen(self): m = sa.MetaData() def process_revision_directives(context, rev, generate_revisions): generate_revisions[:] = [ ops.MigrationScript( util.rev_id(), ops.UpgradeOps(), ops.DowngradeOps(), version_path=os.path.join( _get_staging_directory(), "model1" ), head="model1@head", ), ops.MigrationScript( util.rev_id(), ops.UpgradeOps(), ops.DowngradeOps(), version_path=os.path.join( _get_staging_directory(), "model2" ), head="model2@head", ), ops.MigrationScript( util.rev_id(), ops.UpgradeOps(), ops.DowngradeOps(), version_path=os.path.join( _get_staging_directory(), "model3" ), head="model3@head", ), ] with self._env_fixture(process_revision_directives, m): revs = command.revision(self.cfg, message="some message") script = ScriptDirectory.from_config(self.cfg) for rev, model in [ (revs[0], "model1"), (revs[1], "model2"), (revs[2], "model3"), ]: rev_script = script.get_revision(rev.revision) eq_( rev_script.path, os.path.abspath( os.path.join( _get_staging_directory(), model, "%s_.py" % (rev_script.revision,), ) ), ) assert os.path.exists(rev_script.path)
def test_multiple_dir_chooses_base(self): command.revision( self.cfg, message="x", head="base", version_path=os.path.join(_get_staging_directory(), "model1")) script2 = command.revision( self.cfg, message="y", head="base", version_path=os.path.join(_get_staging_directory(), "model2")) script3 = command.revision( self.cfg, message="y2", head=script2.revision) eq_( os.path.dirname(script3.path), os.path.abspath(os.path.join(_get_staging_directory(), "model2")) ) assert os.access(script3.path, os.F_OK)
def test_env_emits_warning(self): with assertions.expect_warnings( "File %s loaded twice! ignoring. " "Please ensure version_locations is unique" % (os.path.realpath( os.path.join(_get_staging_directory(), "model1", "%s_model1.py" % self.model1)))): script = ScriptDirectory.from_config(self.cfg) script.revision_map.heads eq_([rev.revision for rev in script.walk_revisions()], [self.model1, self.model2, self.model3])
def test_multiple_dir_chooses_base(self): command.revision(self.cfg, message="x", head="base", version_path=os.path.join(_get_staging_directory(), "model1")) script2 = command.revision(self.cfg, message="y", head="base", version_path=os.path.join( _get_staging_directory(), "model2")) script3 = command.revision(self.cfg, message="y2", head=script2.revision) eq_(os.path.dirname(script3.path), os.path.abspath(os.path.join(_get_staging_directory(), "model2"))) assert os.access(script3.path, os.F_OK)
def test_new_locations_no_autogen(self): m = sa.MetaData() def process_revision_directives(context, rev, generate_revisions): generate_revisions[:] = [ ops.MigrationScript( util.rev_id(), ops.UpgradeOps(), ops.DowngradeOps(), version_path=os.path.join( _get_staging_directory(), "model1"), head="model1@head" ), ops.MigrationScript( util.rev_id(), ops.UpgradeOps(), ops.DowngradeOps(), version_path=os.path.join( _get_staging_directory(), "model2"), head="model2@head" ), ops.MigrationScript( util.rev_id(), ops.UpgradeOps(), ops.DowngradeOps(), version_path=os.path.join( _get_staging_directory(), "model3"), head="model3@head" ), ] with self._env_fixture(process_revision_directives, m): revs = command.revision(self.cfg, message="some message") script = ScriptDirectory.from_config(self.cfg) for rev, model in [ (revs[0], "model1"), (revs[1], "model2"), (revs[2], "model3"), ]: rev_script = script.get_revision(rev.revision) eq_( rev_script.path, os.path.abspath(os.path.join( _get_staging_directory(), model, "%s_.py" % (rev_script.revision, ) )) ) assert os.path.exists(rev_script.path)
def _test_tz(self, timezone_arg, given, expected): script = ScriptDirectory(_get_staging_directory(), file_template="%(rev)s_%(slug)s_" "%(year)s_%(month)s_" "%(day)s_%(hour)s_" "%(minute)s_%(second)s", timezone=timezone_arg) with mock.patch( "alembic.script.base.datetime", mock.Mock(datetime=mock.Mock(utcnow=lambda: given, now=lambda: given))): create_date = script._generate_create_date() eq_(create_date, expected)
def test_env_emits_warning(self): with assertions.expect_warnings( "File %s loaded twice! ignoring. " "Please ensure version_locations is unique" % ( os.path.realpath(os.path.join( _get_staging_directory(), "model1", "%s_model1.py" % self.model1 ))) ): script = ScriptDirectory.from_config(self.cfg) script.revision_map.heads eq_( [rev.revision for rev in script.walk_revisions()], [self.model1, self.model2, self.model3] )
def setUp(self): self.env = staging_env() self.cfg = _multi_dir_testing_config( # this is a duplicate of one of the paths # already present in this fixture extra_version_location="%(here)s/model1" ) script = ScriptDirectory.from_config(self.cfg) self.model1 = util.rev_id() self.model2 = util.rev_id() self.model3 = util.rev_id() for model, name in [ (self.model1, "model1"), (self.model2, "model2"), (self.model3, "model3"), ]: script.generate_revision( model, name, refresh=True, version_path=os.path.join(_get_staging_directory(), name), head="base", ) write_script( script, model, """\ "%s" revision = '%s' down_revision = None branch_labels = ['%s'] from alembic import op def upgrade(): pass def downgrade(): pass """ % (name, model, name), )
def test_sys_path_prepend(self, config_value, expected): self.cfg.set_main_option("prepend_sys_path", config_value) script = ScriptDirectory.from_config(self.cfg) env = EnvironmentContext(self.cfg, script) target = os.path.abspath(_get_staging_directory()) def assert_(heads, context): eq_( [os.path.abspath(p) for p in sys.path[0:len(expected)]], [os.path.abspath(p) for p in expected], ) return [] p = [p for p in sys.path if os.path.abspath(p) != target] with mock.patch.object(sys, "path", p): env.configure(url="sqlite://", fn=assert_) with env: script.run_env()
def test_init_w_package(self): path = os.path.join(_get_staging_directory(), "foobar") with mock.patch("alembic.command.open") as open_: command.init(self.cfg, directory=path, package=True) eq_( open_.mock_calls, [ mock.call( os.path.abspath(os.path.join(path, "__init__.py")), "w"), mock.call().close(), mock.call( os.path.abspath( os.path.join(path, "versions", "__init__.py")), "w", ), mock.call().close(), ], )
def setUp(self): self.env = staging_env() self.cfg = _multi_dir_testing_config( # this is a duplicate of one of the paths # already present in this fixture extra_version_location='%(here)s/model1' ) script = ScriptDirectory.from_config(self.cfg) self.model1 = util.rev_id() self.model2 = util.rev_id() self.model3 = util.rev_id() for model, name in [ (self.model1, "model1"), (self.model2, "model2"), (self.model3, "model3"), ]: script.generate_revision( model, name, refresh=True, version_path=os.path.join(_get_staging_directory(), name), head="base") write_script(script, model, """\ "%s" revision = '%s' down_revision = None branch_labels = ['%s'] from alembic import op def upgrade(): pass def downgrade(): pass """ % (name, model, name))
def _test_tz(self, timezone_arg, given, expected): script = ScriptDirectory( _get_staging_directory(), file_template="%(rev)s_%(slug)s_" "%(year)s_%(month)s_" "%(day)s_%(hour)s_" "%(minute)s_%(second)s", timezone=timezone_arg ) with mock.patch( "alembic.script.base.datetime", mock.Mock( datetime=mock.Mock( utcnow=lambda: given, now=lambda: given ) ) ): create_date = script._generate_create_date() eq_( create_date, expected )
def env(): r"""Create an environment in which to run this test. Creates the environment directory using alembic.testing utilities, and additionally creates a revision map and scripts. Expressed visually, the map looks like this:: A | B | C | \ D D0 | | \ E E0 E1 | / / | F F1 F2 | / / | G G2 G3 | | / | | | | G4 | / / / | / / / ||/ / H-- Note that ``H`` alone has a "depends_on", namely ``G4``. Uses class scope to create different environments for different backends. """ env = staging_env() env_file_fixture(_env_content) _write_config_file(_cfg_content % (_get_staging_directory(), sqla_test_config.db_url)) revs = env._revs = {} def gen(rev, head=None, **kw): if head: kw['head'] = [env._revs[h].revision for h in head.split()] revid = '__'.join((rev, util.rev_id())) env._revs[rev] = env.generate_revision(revid, rev, splice=True, **kw) gen('A') gen('B') gen('C') gen('D') gen('D0', 'C') gen('E', 'D') gen('E0', 'D0') gen('E1', 'D0') gen('F', 'E E0') gen('F1', 'E1') gen('F2', 'E1') gen('G', 'F F1') gen('G2', 'F2') gen('G3', 'F2') gen('G4', 'G3') gen('H', 'G G2', depends_on='G4') revids = env._revids = {k: v.revision for k, v in revs.items()} env.R = type('R', (object,), revids) yield env
def test_multiple_dir_no_bases_version_path(self): script = command.revision( self.cfg, message="x", version_path=os.path.join(_get_staging_directory(), "model1")) assert os.access(script.path, os.F_OK)