Best Python code snippet using dbt-osmosis_python
evolve.py
Source:evolve.py
1from optparse import make_option2import sys3import copy4try:5 import cPickle as pickle6except ImportError:7 import pickle as pickle8from django.conf import settings9from django.core.exceptions import ImproperlyConfigured10from django.core.management.base import BaseCommand, CommandError11from django.db.models import get_apps, get_app, signals12from django.db import connection, transaction13from django_evolution import CannotSimulate, SimulationFailure, EvolutionException14from django_evolution.diff import Diff15from django_evolution.evolve import get_unapplied_evolutions, get_mutations16from django_evolution.models import Version, Evolution17from django_evolution.mutations import DeleteApplication18from django_evolution.signature import create_project_sig19from django_evolution.utils import write_sql, execute_sql20class Command(BaseCommand):21 option_list = BaseCommand.option_list + (22 make_option('--noinput', action='store_false', dest='interactive', default=True,23 help='Tells Django to NOT prompt the user for input of any kind.'),24 make_option('--hint', action='store_true', dest='hint', default=False,25 help='Generate an evolution script that would update the app.'),26 make_option('--purge', action='store_true', dest='purge', default=False,27 help='Generate evolutions to delete stale applications.'),28 make_option('--sql', action='store_true', dest='compile_sql', default=False,29 help='Compile a Django evolution script into SQL.'),30 make_option('-x','--execute', action='store_true', dest='execute', default=False,31 help='Apply the evolution to the database.'),32 )33 if '--verbosity' not in [opt.get_opt_string() for opt in BaseCommand.option_list]:34 option_list += make_option('-v','--verbosity', action='store', dest='verbosity', default='1',35 type='choice', choices=['0', '1', '2'],36 help='Verbosity level; 0=minimal output, 1=normal output, 2=all output'),37 help = 'Evolve the models in a Django project.'38 args = '<appname appname ...>'39 requires_model_validation = False40 def handle(self, *app_labels, **options):41 verbosity = int(options['verbosity'])42 interactive = options['interactive']43 execute = options['execute']44 compile_sql = options['compile_sql']45 hint = options['hint']46 purge = options['purge']47 # Use the list of all apps, unless app labels are specified.48 if app_labels:49 if execute:50 raise CommandError('Cannot specify an application name when executing evolutions.')51 try:52 app_list = [get_app(app_label) for app_label in app_labels]53 except (ImproperlyConfigured, ImportError), e:54 raise CommandError("%s. Are you sure your INSTALLED_APPS setting is correct?" % e)55 else:56 app_list = get_apps()57 # Iterate over all applications running the mutations58 evolution_required = False59 simulated = True60 sql = []61 new_evolutions = []62 current_proj_sig = create_project_sig()63 current_signature = pickle.dumps(current_proj_sig)64 try:65 latest_version = Version.objects.latest('when')66 database_sig = pickle.loads(str(latest_version.signature))67 diff = Diff(database_sig, current_proj_sig)68 except Evolution.DoesNotExist:69 print self.style.ERROR("Can't evolve yet. Need to set an evolution baseline.")70 sys.exit(1)71 try:72 for app in app_list:73 app_label = app.__name__.split('.')[-2]74 if hint:75 evolutions = []76 hinted_evolution = diff.evolution()77 mutations = hinted_evolution.get(app_label,[])78 else:79 evolutions = get_unapplied_evolutions(app)80 mutations = get_mutations(app, evolutions)81 if mutations:82 app_sql = ['-- Evolve application %s' % app_label]83 evolution_required = True84 for mutation in mutations:85 # Only compile SQL if we want to show it86 if compile_sql or execute:87 app_sql.extend(mutation.mutate(app_label, database_sig))88 # Now run the simulation, which will modify the signatures89 try:90 mutation.simulate(app_label, database_sig)91 except CannotSimulate:92 simulated = False93 new_evolutions.extend(Evolution(app_label=app_label, label=label)94 for label in evolutions)95 if not execute:96 if compile_sql:97 write_sql(app_sql)98 else:99 print '#----- Evolution for %s' % app_label100 print 'from django_evolution.mutations import *'101 print 'from django.db import models'102 print103 print 'MUTATIONS = ['104 print ' ',105 print ',\n '.join(unicode(m) for m in mutations)106 print ']'107 print '#----------------------'108 sql.extend(app_sql)109 else:110 if verbosity > 1:111 print 'Application %s is up to date' % app_label112 # Process the purged applications if requested to do so.113 if purge:114 if diff.deleted:115 evolution_required = True116 delete_app = DeleteApplication()117 purge_sql = []118 for app_label in diff.deleted:119 if compile_sql or execute:120 purge_sql.append('-- Purge application %s' % app_label)121 purge_sql.extend(delete_app.mutate(app_label, database_sig))122 delete_app.simulate(app_label, database_sig)123 if not execute:124 if compile_sql:125 write_sql(purge_sql)126 else:127 print 'The following application(s) can be purged:'128 for app_label in diff.deleted:129 print ' ', app_label130 print131 sql.extend(purge_sql)132 else:133 if verbosity > 1:134 print 'No applications need to be purged.'135 except EvolutionException, e:136 print self.style.ERROR(e)137 sys.exit(1)138 if simulated:139 diff = Diff(database_sig, current_proj_sig)140 if not diff.is_empty(not purge):141 if hint:142 print self.style.ERROR('Your models contain changes that Django Evolution cannot resolve automatically.')143 print 'This is probably due to a currently unimplemented mutation type.'144 print 'You will need to manually construct a mutation to resolve the remaining changes.'145 else:146 print self.style.ERROR('The stored evolutions do not completely resolve all model changes.')147 print 'Run `./manage.py evolve --hint` to see a suggestion for the changes required.'148 print149 print 'The following are the changes that could not be resolved:'150 print diff151 sys.exit(1)152 else:153 print self.style.NOTICE('Evolution could not be simulated, possibly due to raw SQL mutations')154 if evolution_required:155 if execute:156 # Now that we've worked out the mutations required,157 # and we know they simulate OK, run the evolutions158 if interactive:159 confirm = raw_input("""160You have requested a database evolution. This will alter tables161and data currently in the %r database, and may result in162IRREVERSABLE DATA LOSS. Evolutions should be *thoroughly* reviewed163prior to execution.164Are you sure you want to execute the evolutions?165Type 'yes' to continue, or 'no' to cancel: """ % settings.DATABASE_NAME)166 else:167 confirm = 'yes'168 if confirm.lower() == 'yes':169 # Begin Transaction170 transaction.enter_transaction_management()171 transaction.managed(True)172 cursor = connection.cursor()173 try:174 # Perform the SQL175 execute_sql(cursor, sql)176 # Now update the evolution table177 version = Version(signature=current_signature)178 version.save()179 for evolution in new_evolutions:180 evolution.version = version181 evolution.save()182 transaction.commit()183 except Exception, ex:184 transaction.rollback()185 print self.style.ERROR('Error applying evolution: %s' % str(ex))186 sys.exit(1)187 transaction.leave_transaction_management()188 if verbosity > 0:189 print 'Evolution successful.'190 else:191 print self.style.ERROR('Evolution cancelled.')192 elif not compile_sql:193 if verbosity > 0:194 if simulated:195 print "Trial evolution successful."196 print "Run './manage.py evolve %s--execute' to apply evolution." % (hint and '--hint ' or '')197 else:198 if verbosity > 0:...
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!