Skip to content

Commit

Permalink
Drop django_mysql.utils.connection_is_mariadb (#913)
Browse files Browse the repository at this point in the history
  • Loading branch information
adamchainz committed May 10, 2022
1 parent 0779ae1 commit 40da1f9
Show file tree
Hide file tree
Showing 12 changed files with 28 additions and 50 deletions.
7 changes: 7 additions & 0 deletions HISTORY.rst
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,13 @@ History

* Support MariaDB 10.7.

* Drop ``django_mysql.utils.connection_is_mariadb``. On Django 3.0+ you can
simply check:

.. code-block:: python
connection.vendor == "mysql" and connection.mysql_is_mariadb
4.5.0 (2022-01-23)
------------------

Expand Down
1 change: 0 additions & 1 deletion docs/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ action, or get started with :doc:`installation`. Otherwise, take your pick:
locks
status
management_commands/index
utilities
test_utilities
exceptions
contributing
Expand Down
16 changes: 0 additions & 16 deletions docs/utilities.rst

This file was deleted.

7 changes: 2 additions & 5 deletions src/django_mysql/models/fields/dynamic.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
from django_mysql.checks import mysql_connections
from django_mysql.models.lookups import DynColHasKey
from django_mysql.typing import DeconstructResult
from django_mysql.utils import connection_is_mariadb

try:
import mariadb_dyncol
Expand Down Expand Up @@ -102,7 +101,7 @@ def _check_mariadb_version(self) -> list[checks.CheckMessage]:
errors = []

any_conn_works = any(
(hasattr(conn, "mysql_version") and connection_is_mariadb(conn))
(conn.vendor == "mysql" and conn.mysql_is_mariadb)
for _alias, conn in mysql_connections()
)

Expand All @@ -122,9 +121,7 @@ def _check_character_set(self) -> list[checks.CheckMessage]:

conn = None
for _alias, check_conn in mysql_connections():
if hasattr(check_conn, "mysql_version") and connection_is_mariadb(
check_conn
):
if check_conn.vendor == "mysql" and check_conn.mysql_is_mariadb:
conn = check_conn
break

Expand Down
4 changes: 1 addition & 3 deletions src/django_mysql/models/functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@
from django.db.models import Func, IntegerField, JSONField, TextField, Value
from django.db.models.sql.compiler import SQLCompiler

from django_mysql.utils import connection_is_mariadb

ExpressionArgument = Union[
Expression,
str, # column reference handled by Django
Expand Down Expand Up @@ -291,7 +289,7 @@ def as_sql(
if connection.vendor != "mysql": # pragma: no cover
raise AssertionError("JSONValue only supports MySQL/MariaDB")
json_string = json.dumps(self._data, allow_nan=False)
if connection_is_mariadb(connection):
if connection.vendor == "mysql" and connection.mysql_is_mariadb:
# MariaDB doesn't support explicit cast to JSON.
return "JSON_EXTRACT(%s, '$')", (json_string,)
else:
Expand Down
4 changes: 0 additions & 4 deletions src/django_mysql/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,10 +93,6 @@ def format_duration(total_seconds: int) -> str:
return "".join(out)


def connection_is_mariadb(connection: BaseDatabaseWrapper) -> bool:
return connection.vendor == "mysql" and connection.mysql_is_mariadb


def settings_to_cmd_args(settings_dict: dict[str, Any]) -> list[str]:
"""
Copied from django 1.8 MySQL backend DatabaseClient - where the runshell
Expand Down
5 changes: 2 additions & 3 deletions tests/testapp/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@
SizedBinaryField,
SizedTextField,
)
from django_mysql.utils import connection_is_mariadb


class EnumModel(Model):
Expand Down Expand Up @@ -122,7 +121,7 @@ class DynamicModel(Model):
@classmethod
def check(cls, **kwargs):
# Disable the checks on MySQL so that checks tests don't fail
if not (connection_is_mariadb(connection)):
if not connection.mysql_is_mariadb:
return []
return super().check(**kwargs)

Expand All @@ -136,7 +135,7 @@ class SpeclessDynamicModel(Model):
@classmethod
def check(cls, **kwargs):
# Disable the checks on MySQL so that checks tests don't fail
if not (connection_is_mariadb(connection)):
if not connection.mysql_is_mariadb:
return []
return super().check(**kwargs)

Expand Down
19 changes: 11 additions & 8 deletions tests/testapp/test_dynamicfield.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,20 @@
import pytest
from django.core import serializers
from django.core.exceptions import FieldError
from django.db import connection, models
from django.db import connection, connections, models
from django.db.migrations.writer import MigrationWriter
from django.db.models import CharField, Transform
from django.test import TestCase
from django.test.utils import isolate_apps

from django_mysql.models import DynamicField
from django_mysql.utils import connection_is_mariadb
from tests.testapp.models import DynamicModel, SpeclessDynamicModel


class DynColTestCase(TestCase):
@classmethod
def setUpClass(cls):
if not (connection_is_mariadb(connection)):
if not connection.mysql_is_mariadb:
raise SkipTest("Dynamic Columns require MariaDB")
super().setUpClass()

Expand Down Expand Up @@ -286,14 +285,18 @@ class TestCheck(DynColTestCase):

databases = ["default", "other"]

@mock.patch("django_mysql.models.fields.dynamic.connection_is_mariadb")
def test_db_not_mariadb(self, is_mariadb):
is_mariadb.return_value = False

def test_db_not_mariadb(self):
class Valid(models.Model):
field = DynamicField()

errors = Valid.check()
mock_default = mock.patch.object(
connections["default"], "mysql_is_mariadb", False
)
mock_other = mock.patch.object(connections["other"], "mysql_is_mariadb", False)

with mock_default, mock_other:
errors = Valid.check()

assert len(errors) == 1
assert errors[0].id == "django_mysql.E013"
assert "MariaDB is required" in errors[0].msg
Expand Down
3 changes: 1 addition & 2 deletions tests/testapp/test_functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@
UpdateXML,
XMLExtractValue,
)
from django_mysql.utils import connection_is_mariadb
from tests.testapp.models import Alphabet, Author, DynamicModel, JSONModel
from tests.testapp.test_dynamicfield import DynColTestCase
from tests.testapp.utils import print_all_queries
Expand Down Expand Up @@ -604,7 +603,7 @@ def test_json_array_append(self):
class RegexpFunctionTests(TestCase):
def setUp(self):
super().setUp()
if not connection_is_mariadb(connection):
if not connection.mysql_is_mariadb:
raise SkipTest("MariaDB is required")

def test_regex_instr(self):
Expand Down
5 changes: 2 additions & 3 deletions tests/testapp/test_locks.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
from django_mysql.exceptions import TimeoutError
from django_mysql.locks import Lock, TableLock
from django_mysql.models import Model
from django_mysql.utils import connection_is_mariadb
from tests.testapp.models import (
AgedCustomer,
Alphabet,
Expand All @@ -30,7 +29,7 @@ class LockTests(TestCase):
def setUpClass(cls):
super().setUpClass()

cls.supports_lock_info = connection_is_mariadb(connection)
cls.supports_lock_info = connection.mysql_is_mariadb
if cls.supports_lock_info:
with connection.cursor() as cursor:
cursor.execute(
Expand Down Expand Up @@ -237,7 +236,7 @@ def is_locked(self, connection_name, table_name):
if rows:
assert len(rows) == 1
return rows[0][2] > 0
else:
else: # pragma: no cover
# MySQL 8+ closes the table really quickly. If it's closed,
# it's not locked.
return False
Expand Down
3 changes: 1 addition & 2 deletions tests/testapp/test_operations.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@

from django_mysql.operations import AlterStorageEngine, InstallPlugin, InstallSOName
from django_mysql.test.utils import override_mysql_variables
from django_mysql.utils import connection_is_mariadb


def plugin_exists(plugin_name):
Expand Down Expand Up @@ -40,7 +39,7 @@ class PluginOperationTests(TransactionTestCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
if not connection_is_mariadb(connection):
if not connection.mysql_is_mariadb:
raise SkipTest("The metadata_lock_info plugin is required")

def test_install_plugin_describe(self):
Expand Down
4 changes: 1 addition & 3 deletions tests/testapp/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,10 @@
from django.db import DEFAULT_DB_ALIAS, connection, connections
from django.test.utils import CaptureQueriesContext

from django_mysql.utils import connection_is_mariadb


@contextmanager
def skip_if_mysql_8_plus():
if not connection_is_mariadb(connection) and connection.mysql_version >= (8,):
if not connection.mysql_is_mariadb and connection.mysql_version >= (8,):
pytest.skip("Requires MySQL<8 or MariaDB")
yield

Expand Down

0 comments on commit 40da1f9

Please sign in to comment.