Adjusted refactoring of vendor checks.
Thanks Shai for the thorough review.
This commit is contained in:
parent
a5de0df58b
commit
fb90b7cda2
|
@ -518,8 +518,6 @@ class BaseDatabaseFeatures(object):
|
||||||
supports_subqueries_in_group_by = True
|
supports_subqueries_in_group_by = True
|
||||||
supports_bitwise_or = True
|
supports_bitwise_or = True
|
||||||
|
|
||||||
supports_boolean_type = True
|
|
||||||
|
|
||||||
supports_binary_field = True
|
supports_binary_field = True
|
||||||
|
|
||||||
# Do time/datetime fields have microsecond precision?
|
# Do time/datetime fields have microsecond precision?
|
||||||
|
@ -581,6 +579,9 @@ class BaseDatabaseFeatures(object):
|
||||||
# Can the backend introspect an BinaryField, instead of an TextField?
|
# Can the backend introspect an BinaryField, instead of an TextField?
|
||||||
can_introspect_binary_field = True
|
can_introspect_binary_field = True
|
||||||
|
|
||||||
|
# Can the backend introspect an BooleanField, instead of an IntegerField?
|
||||||
|
can_introspect_boolean_field = True
|
||||||
|
|
||||||
# Can the backend introspect an IPAddressField, instead of an CharField?
|
# Can the backend introspect an IPAddressField, instead of an CharField?
|
||||||
can_introspect_ip_address_field = False
|
can_introspect_ip_address_field = False
|
||||||
|
|
||||||
|
@ -639,7 +640,7 @@ class BaseDatabaseFeatures(object):
|
||||||
# Suffix for backends that don't support "SELECT xxx;" queries.
|
# Suffix for backends that don't support "SELECT xxx;" queries.
|
||||||
bare_select_suffix = ''
|
bare_select_suffix = ''
|
||||||
|
|
||||||
lowercases_column_names = False
|
uppercases_column_names = True
|
||||||
|
|
||||||
def __init__(self, connection):
|
def __init__(self, connection):
|
||||||
self.connection = connection
|
self.connection = connection
|
||||||
|
|
|
@ -172,13 +172,13 @@ class DatabaseFeatures(BaseDatabaseFeatures):
|
||||||
has_select_for_update_nowait = False
|
has_select_for_update_nowait = False
|
||||||
supports_forward_references = False
|
supports_forward_references = False
|
||||||
supports_long_model_names = False
|
supports_long_model_names = False
|
||||||
supports_boolean_type = False
|
|
||||||
# XXX MySQL DB-API drivers currently fail on binary data on Python 3.
|
# XXX MySQL DB-API drivers currently fail on binary data on Python 3.
|
||||||
supports_binary_field = six.PY2
|
supports_binary_field = six.PY2
|
||||||
supports_microsecond_precision = False
|
supports_microsecond_precision = False
|
||||||
supports_regex_backreferencing = False
|
supports_regex_backreferencing = False
|
||||||
supports_date_lookup_using_string = False
|
supports_date_lookup_using_string = False
|
||||||
can_introspect_binary_field = False
|
can_introspect_binary_field = False
|
||||||
|
can_introspect_boolean_field = False
|
||||||
supports_timezones = False
|
supports_timezones = False
|
||||||
requires_explicit_null_ordering_when_grouping = True
|
requires_explicit_null_ordering_when_grouping = True
|
||||||
allows_auto_pk_0 = False
|
allows_auto_pk_0 = False
|
||||||
|
|
|
@ -120,7 +120,7 @@ class DatabaseFeatures(BaseDatabaseFeatures):
|
||||||
connection_persists_old_columns = True
|
connection_persists_old_columns = True
|
||||||
closed_cursor_error_class = InterfaceError
|
closed_cursor_error_class = InterfaceError
|
||||||
bare_select_suffix = " FROM DUAL"
|
bare_select_suffix = " FROM DUAL"
|
||||||
lowercases_column_names = True
|
uppercases_column_names = False
|
||||||
|
|
||||||
|
|
||||||
class DatabaseOperations(BaseDatabaseOperations):
|
class DatabaseOperations(BaseDatabaseOperations):
|
||||||
|
|
|
@ -87,7 +87,7 @@ class InspectDBTestCase(TestCase):
|
||||||
else:
|
else:
|
||||||
assertFieldType('big_int_field', "models.IntegerField()")
|
assertFieldType('big_int_field', "models.IntegerField()")
|
||||||
|
|
||||||
if connection.features.supports_boolean_type:
|
if connection.features.can_introspect_boolean_field:
|
||||||
assertFieldType('bool_field', "models.BooleanField()")
|
assertFieldType('bool_field', "models.BooleanField()")
|
||||||
assertFieldType('null_bool_field', "models.NullBooleanField()")
|
assertFieldType('null_bool_field', "models.NullBooleanField()")
|
||||||
else:
|
else:
|
||||||
|
@ -176,7 +176,7 @@ class InspectDBTestCase(TestCase):
|
||||||
out = StringIO()
|
out = StringIO()
|
||||||
call_command('inspectdb', stdout=out)
|
call_command('inspectdb', stdout=out)
|
||||||
output = out.getvalue()
|
output = out.getvalue()
|
||||||
base_name = 'field' if connection.features.lowercases_column_names else 'Field'
|
base_name = 'field' if not connection.features.uppercases_column_names else 'Field'
|
||||||
self.assertIn("field = models.IntegerField()", output)
|
self.assertIn("field = models.IntegerField()", output)
|
||||||
self.assertIn("field_field = models.IntegerField(db_column='%s_')" % base_name, output)
|
self.assertIn("field_field = models.IntegerField(db_column='%s_')" % base_name, output)
|
||||||
self.assertIn("field_field_0 = models.IntegerField(db_column='%s__')" % base_name, output)
|
self.assertIn("field_field_0 = models.IntegerField(db_column='%s__')" % base_name, output)
|
||||||
|
|
|
@ -57,7 +57,8 @@ class IntrospectionTests(TestCase):
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
[datatype(r[1], r) for r in desc],
|
[datatype(r[1], r) for r in desc],
|
||||||
['AutoField' if connection.features.can_introspect_autofield else 'IntegerField',
|
['AutoField' if connection.features.can_introspect_autofield else 'IntegerField',
|
||||||
'CharField', 'CharField', 'CharField', 'BigIntegerField',
|
'CharField', 'CharField', 'CharField',
|
||||||
|
'BigIntegerField' if connection.features.can_introspect_big_integer_field else 'IntegerField',
|
||||||
'BinaryField' if connection.features.can_introspect_binary_field else 'TextField']
|
'BinaryField' if connection.features.can_introspect_binary_field else 'TextField']
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -449,6 +449,7 @@ class SerializerTests(TestCase):
|
||||||
self.assertEqual(base_data, proxy_proxy_data.replace('proxy', ''))
|
self.assertEqual(base_data, proxy_proxy_data.replace('proxy', ''))
|
||||||
|
|
||||||
|
|
||||||
|
@skipUnlessDBFeature('supports_binary_field')
|
||||||
def serializerTest(format, self):
|
def serializerTest(format, self):
|
||||||
|
|
||||||
# Create all the objects defined in the test data
|
# Create all the objects defined in the test data
|
||||||
|
@ -481,8 +482,6 @@ def serializerTest(format, self):
|
||||||
for klass, count in instance_count.items():
|
for klass, count in instance_count.items():
|
||||||
self.assertEqual(count, klass.objects.count())
|
self.assertEqual(count, klass.objects.count())
|
||||||
|
|
||||||
serializerTest = skipUnlessDBFeature('supports_binary_field')(serializerTest)
|
|
||||||
|
|
||||||
|
|
||||||
def naturalKeySerializerTest(format, self):
|
def naturalKeySerializerTest(format, self):
|
||||||
# Create all the objects defined in the test data
|
# Create all the objects defined in the test data
|
||||||
|
|
Loading…
Reference in New Issue