def test_list_available_migrations(mock): mock.add_migration('udata', '01_core_migration.py') mock.add_migration('test', '02_test_migration.py') mock.add_migration('other', '03_other_migration.py') # Should not list `__*.py` files mock.add_migration('test', '__private.py') # Should not list migrations for disabled plugin mock.add_migration('disabled', 'should_not_be_there.py', enable=False) # Should not fail on plugins without migrations dir mock.ensure_plugin('nomigrations') availables = migrations.list_available() assert len(availables) == 3 assert availables == [ migrations.Migration(p, f) for p, f in ( ('udata', '01_core_migration.py'), ('test', '02_test_migration.py'), ('other', '03_other_migration.py'), ) ]
def migrate(record, dry_run=False): '''Perform database migrations''' success = True for migration in migrations.list_available(): if migration.record.ok or not success: log_status(migration, cyan('Skipped')) else: status = magenta('Recorded') if record else yellow('Apply') log_status(migration, status) try: output = migration.execute(recordonly=record, dryrun=dry_run) except migrations.RollbackError as re: format_output(re.migrate_exc.output, False) log_status(migration, red('Rollback')) format_output(re.output, not re.exc) success = False except migrations.MigrationError as me: format_output(me.output, False, traceback=me.traceback) success = False else: format_output(output, True) return success
def status(): '''Display the database migrations status''' for migration in migrations.list_available(): log_status(migration, status_label(migration.record))