Merge lp:~ricardokirkner/django-pgtools/allow-backend-subclasses into lp:django-pgtools

Proposed by Ricardo Kirkner
Status: Merged
Approved by: Łukasz Czyżykowski
Approved revision: 6
Merged at revision: 6
Proposed branch: lp:~ricardokirkner/django-pgtools/allow-backend-subclasses
Merge into: lp:django-pgtools
Diff against target: 181 lines (+76/-18)
3 files modified
pgtools/tests.py (+37/-10)
pgtools/utils.py (+9/-2)
setup.py (+30/-6)
To merge this branch: bzr merge lp:~ricardokirkner/django-pgtools/allow-backend-subclasses
Reviewer Review Type Date Requested Status
Łukasz Czyżykowski (community) Approve
Review via email: mp+149855@code.launchpad.net

Commit message

Support any backend that inherits from postgresql_psycopg2.

Description of the change

Support any backend that inherits from postgresql_psycopg2.

Also got tests to run again.

To post a comment you must log in.
Revision history for this message
Ubuntu One Auto Pilot (otto-pilot) wrote :

Voting does not meet specified criteria. Required: Approve >= 1, Disapprove == 0, Needs Fixing == 0, Needs Information == 0, Resubmit == 0, Pending == 0. Got: 1 Pending.

Revision history for this message
Łukasz Czyżykowski (lukasz-czyzykowski) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'pgtools/tests.py'
2--- pgtools/tests.py 2012-04-13 18:11:02 +0000
3+++ pgtools/tests.py 2013-02-21 15:03:28 +0000
4@@ -13,11 +13,14 @@
5
6 from mock import Mock, patch
7
8+import django
9 from django.conf import settings
10 from django.core.management import call_command
11 from django.core.management.base import CommandError
12 from django.db import connection
13+from django.db.backends import postgresql_psycopg2
14 from django.db.models.loading import get_models
15+from django.db.utils import load_backend
16 from django.test import TestCase
17
18
19@@ -102,7 +105,7 @@
20 connection.settings_dict[setting_name] = attvalue
21 else:
22 # Django 1.0 doesn't have setting cache, so there's nothing to
23- # refresh
24+ # refresh
25 pass
26 connection.close()
27
28@@ -441,20 +444,25 @@
29 self.assertEqual(str(err),
30 "User cannot be deleted: %s" % TEST_USER_NAME1)
31
32+ def get_backends(self):
33+ django_version = django.VERSION[:2]
34+ backends = ['django.db.backends.postgresql_psycopg2']
35+ if django_version < (1,4):
36+ backends.insert(0, 'postgresql_psycopg2')
37+ return backends
38+
39 def test_utils_check_database_engine_11_style(self):
40 # Test default: 'postgresql_psycopg2' (hopefully)
41 settings_to_patch = {}
42 if hasattr(settings, 'DATABASES'):
43 settings_to_patch['DATABASES'] = None
44- for engine in [
45- 'postgresql_psycopg2',
46- 'django.db.backends.postgresql_psycopg2']:
47+ for engine in self.get_backends():
48 settings_to_patch['DATABASE_ENGINE'] = engine
49 with patch_settings(**settings_to_patch):
50 check_database_engine()
51
52 # Test an unsupported engine
53- settings_to_patch['DATABASE_ENGINE'] = 'sqlite3'
54+ settings_to_patch['DATABASE_ENGINE'] = 'django.db.backends.sqlite3'
55 with patch_settings(**settings_to_patch):
56 self.assertRaises(CommandError, check_database_engine)
57
58@@ -462,16 +470,35 @@
59 def test_utils_check_database_engine_13_style(self, mock_settings):
60 dbconfig = {'default': {'NAME': 'mydatabase'}}
61 mock_settings.DATABASES = dbconfig
62- for engine in ['postgresql_psycopg2',
63- 'django.db.backends.postgresql_psycopg2']:
64+ for engine in self.get_backends():
65 dbconfig['default']['ENGINE'] = engine
66- mock_settings.DATABASE_ENGINE = 'sqlite3'
67+ mock_settings.DATABASE_ENGINE = 'django.db.backends.sqlite3'
68 check_database_engine()
69 # Test an unsupported engine
70- dbconfig['default']['ENGINE'] = 'sqlite3'
71- mock_settings.DATABASE_ENGINE = 'postgresql_psycopg2'
72+ dbconfig['default']['ENGINE'] = 'django.db.backends.sqlite3'
73+ mock_settings.DATABASE_ENGINE = 'django.db.backends.postgresql_psycopg2'
74 self.assertRaises(CommandError, check_database_engine)
75
76+ @patch('pgtools.utils.settings')
77+ def test_utils_check_database_engine_subclass_13_style(self,
78+ mock_settings):
79+ class CustomDatabaseWrapper(postgresql_psycopg2.base.DatabaseWrapper):
80+ pass
81+
82+ dbconfig = {'default': {'NAME': 'mydatabase',
83+ 'ENGINE': 'custom_backend'}}
84+ mock_settings.DATABASE_ENGINE = 'custom_backend'
85+ mock_settings.DATABASES = dbconfig
86+ def mock_load_backend(name):
87+ if name == 'custom_backend':
88+ backend = Mock()
89+ backend.DatabaseWrapper = CustomDatabaseWrapper
90+ return backend
91+ return load_backend(name)
92+
93+ with patch('pgtools.utils.load_backend', mock_load_backend):
94+ check_database_engine()
95+
96 def test_utils_get_rolename_from_settings(self):
97 # Test with default (nothing set)
98 self.assertRaises(CommandError, get_rolename_from_settings)
99
100=== modified file 'pgtools/utils.py'
101--- pgtools/utils.py 2012-04-13 18:11:02 +0000
102+++ pgtools/utils.py 2013-02-21 15:03:28 +0000
103@@ -4,18 +4,25 @@
104
105 from django.conf import settings
106 from django.core.management.base import CommandError
107+from django.db.utils import load_backend
108
109
110 def check_database_engine():
111 all_psql = True
112+ postgresql_psycopg2_engine = load_backend('django.db.backends.postgresql_psycopg2')
113 if getattr(settings, 'DATABASES', None):
114 # Django 1.2+ style
115 for db in settings.DATABASES.values():
116- if not db['ENGINE'].endswith('postgresql_psycopg2'):
117+ engine = load_backend(db['ENGINE'])
118+ if not issubclass(engine.DatabaseWrapper,
119+ postgresql_psycopg2_engine.DatabaseWrapper):
120 all_psql = False
121 else:
122 # Django -1.1 style
123- all_psql = settings.DATABASE_ENGINE.endswith('postgresql_psycopg2')
124+ engine = load_backend(settings.DATABASE_ENGINE)
125+ if not issubclass(engine.DatabaseWrapper,
126+ postgresql_psycopg2_engine.DatabaseWrapper):
127+ all_psql = False
128 if not all_psql:
129 raise CommandError(
130 'Only the postgresql_psycopg2 database engine is supported.')
131
132=== modified file 'setup.py'
133--- setup.py 2011-06-02 14:54:18 +0000
134+++ setup.py 2013-02-21 15:03:28 +0000
135@@ -18,17 +18,41 @@
136 def run(self):
137 """Run the project tests."""
138
139+ import django
140 from django.conf import settings
141 from django.core.management import call_command
142
143- settings.configure(**{
144- 'DATABASE_ENGINE': 'postgresql_psycopg2',
145- 'DATABASE_NAME': 'pgtools',
146- 'DATABASE_USER': 'postgres',
147+ config = {
148 'SITE_ID': 1,
149 'ROOT_URLCONF': '',
150- 'INSTALLED_APPS': ['pgtools'],
151- })
152+ 'INSTALLED_APPS': [
153+ 'django.contrib.admin',
154+ 'django.contrib.auth',
155+ 'django.contrib.contenttypes',
156+ 'django.contrib.sessions',
157+ 'pgtools',
158+ ],
159+ }
160+
161+ django_version = django.VERSION[:2]
162+ if django_version > (1,1):
163+ config.update({
164+ 'DATABASES': {
165+ 'default': {
166+ 'NAME': 'pgtools',
167+ 'ENGINE': 'django.db.backends.postgresql_psycopg2',
168+ 'USER': 'postgres',
169+ }
170+ }
171+ })
172+ if django_version < (1,4):
173+ config.update({
174+ 'DATABASE_ENGINE': 'django.db.backends.postgresql_psycopg2',
175+ 'DATABASE_NAME': 'pgtools',
176+ 'DATABASE_USER': 'postgres',
177+ })
178+
179+ settings.configure(**config)
180
181 call_command('test', interactive=False)
182

Subscribers

People subscribed via source and target branches