From 587c8e5940dcfe16f86e48fb1a888681ba272f07 Mon Sep 17 00:00:00 2001 From: Miguel Araujo Perez Date: Thu, 14 Oct 2010 13:56:02 +0200 Subject: [PATCH 1/5] Bug fix. generate_fixture command fails when you have a GeoDjango app or some other specific database backend magic that sqlite3 is not able to reproduce. Therefore syncdb command fails at generating the tables in the database. I have added a --default option that will use default project settings and generate test databases, that will use for populating the fixtures. TODO: Maybe it's a good idea that the user can provide a test_settings file as a parameter. So he can use specific settings for generating the databases. --- .../management/commands/generate_fixture.py | 61 +++++++++++++------ 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/fixture_generator/management/commands/generate_fixture.py b/fixture_generator/management/commands/generate_fixture.py index 2216a82..51027a1 100644 --- a/fixture_generator/management/commands/generate_fixture.py +++ b/fixture_generator/management/commands/generate_fixture.py @@ -60,10 +60,14 @@ class Command(BaseCommand): help="Specifies the output serialization format for fixtures."), make_option("--indent", default=None, dest="indent", type="int", help="Specifies the indent level to use when pretty-printing output"), + make_option("--default", default=False, dest="default_settings", type="string", + help="Use default settings for generating test database"), ) args = "app_label.fixture" def handle(self, fixture, **options): + default_settings = options.get('default_settings', False) + available_fixtures = {} for app in settings.INSTALLED_APPS: try: @@ -79,25 +83,48 @@ def handle(self, fixture, **options): fixture = available_fixtures[(app_label, fixture_name)] requirements, models = linearize_requirements(available_fixtures, fixture) - - settings.DATABASES[FIXTURE_DATABASE] = { - "ENGINE": "sqlite3", - "NAME": "fixture_gen.db", - } - old_routers = router.routers - router.routers = [FixtureRouter(models)] + + if not default_settings: + settings.DATABASES[FIXTURE_DATABASE] = { + "ENGINE": "sqlite3", + "NAME": "fixture_gen.db", + } + old_routers = router.routers + router.routers = [FixtureRouter(models)] + + # Creates tests databases for populating them with the fixtures + elif default_settings: + from django.test.simple import DjangoTestSuiteRunner + self.test_runner = DjangoTestSuiteRunner(verbosity=0) + self.old_config = self.test_runner.setup_databases() + try: # migrate_all=True is for south, Django just absorbs it - call_command("syncdb", database=FIXTURE_DATABASE, verbosity=0, - interactive=False, migrate_all=True) + # create_test_db already executes syncdb + if not default_settings: + call_command("syncdb", database=FIXTURE_DATABASE, verbosity=0, + interactive=False, migrate_all=True) for fixture_func in requirements: fixture_func() - call_command("dumpdata", - *["%s.%s" % (m._meta.app_label, m._meta.object_name) for m in models], - **dict(options, verbosity=0, database=FIXTURE_DATABASE) - ) + if not default_settings: + call_command("dumpdata", + *["%s.%s" % (m._meta.app_label, m._meta.object_name) for m in models], + **dict(options, verbosity=0, database=FIXTURE_DATABASE) + ) + else: + for alias in connections._connections: + call_command("dumpdata", + *["%s.%s" % (m._meta.app_label, m._meta.object_name) for m in models], + **dict(options, verbosity=0, database=alias) + ) + except Exception, error: + print error finally: - del settings.DATABASES[FIXTURE_DATABASE] - del connections._connections[FIXTURE_DATABASE] - router.routers = old_routers - os.remove("fixture_gen.db") + if not default_settings: + os.remove("fixture_gen.db") + del settings.DATABASES[FIXTURE_DATABASE] + del connections._connections[FIXTURE_DATABASE] + router.routers = old_routers + elif default_settings: + self.test_runner.teardown_databases(self.old_config) + From 8431c725aa654b5672d0ccde0fc82f2c7e8f9622 Mon Sep 17 00:00:00 2001 From: Miguel Araujo Perez Date: Thu, 14 Oct 2010 14:31:59 +0200 Subject: [PATCH 2/5] Improving gitignore rules --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 539da74..72179ed 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ *.py[co] +/build +/dist +/django_fixture_generator.egg-info From 0a689f44d460fdf9c09ca714773eac18b8fdb9d1 Mon Sep 17 00:00:00 2001 From: Miguel Araujo Perez Date: Thu, 14 Oct 2010 14:32:50 +0200 Subject: [PATCH 3/5] Adding .hgignore for people using hg-git github plugin like me :) --- .hgignore | 6 ++++++ setup.py | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 .hgignore diff --git a/.hgignore b/.hgignore new file mode 100644 index 0000000..732254a --- /dev/null +++ b/.hgignore @@ -0,0 +1,6 @@ +# For people using hg-git plugin +syntax: glob +*.pyc +build +dist +django_fixture_generator.egg-info diff --git a/setup.py b/setup.py index 0e6030f..34d6601 100644 --- a/setup.py +++ b/setup.py @@ -27,6 +27,7 @@ 'Programming Language :: Python', 'Framework :: Django', ], - test_suite='runtests.runtests' + test_suite='runtests.runtests', + zip_safe=False, ) From 8b8b83b2b7f49ce4709f050cb898897f811710c7 Mon Sep 17 00:00:00 2001 From: Miguel Araujo Perez Date: Sun, 17 Oct 2010 21:45:11 +0200 Subject: [PATCH 4/5] Removing except to get better Exception information --- fixture_generator/management/commands/generate_fixture.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/fixture_generator/management/commands/generate_fixture.py b/fixture_generator/management/commands/generate_fixture.py index 51027a1..edbe1d5 100644 --- a/fixture_generator/management/commands/generate_fixture.py +++ b/fixture_generator/management/commands/generate_fixture.py @@ -117,8 +117,6 @@ def handle(self, fixture, **options): *["%s.%s" % (m._meta.app_label, m._meta.object_name) for m in models], **dict(options, verbosity=0, database=alias) ) - except Exception, error: - print error finally: if not default_settings: os.remove("fixture_gen.db") From 65d63320dd4601c4df1b5b3e5386e94f92331f97 Mon Sep 17 00:00:00 2001 From: Miguel Araujo Perez Date: Tue, 2 Nov 2010 17:07:44 +0100 Subject: [PATCH 5/5] Making optparse work more naturally, just need to use --default_settings --- fixture_generator/management/commands/generate_fixture.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fixture_generator/management/commands/generate_fixture.py b/fixture_generator/management/commands/generate_fixture.py index edbe1d5..8f11626 100644 --- a/fixture_generator/management/commands/generate_fixture.py +++ b/fixture_generator/management/commands/generate_fixture.py @@ -60,13 +60,13 @@ class Command(BaseCommand): help="Specifies the output serialization format for fixtures."), make_option("--indent", default=None, dest="indent", type="int", help="Specifies the indent level to use when pretty-printing output"), - make_option("--default", default=False, dest="default_settings", type="string", + make_option("--default", action='store_true', default=False, dest="default_settings", help="Use default settings for generating test database"), ) args = "app_label.fixture" def handle(self, fixture, **options): - default_settings = options.get('default_settings', False) + default_settings = options.get('default_settings') available_fixtures = {} for app in settings.INSTALLED_APPS: