Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-dj-database-url for
openSUSE:Factory checked in at 2024-01-09 20:49:41
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-dj-database-url (Old)
and /work/SRC/openSUSE:Factory/.python-dj-database-url.new.21961 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-dj-database-url"
Tue Jan 9 20:49:41 2024 rev:10 rq:1137636 version:2.1.0
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-dj-database-url/python-dj-database-url.changes
2023-05-09 13:09:11.061680406 +0200
+++
/work/SRC/openSUSE:Factory/.python-dj-database-url.new.21961/python-dj-database-url.changes
2024-01-09 20:50:16.149563476 +0100
@@ -1,0 +2,9 @@
+Mon Jan 8 20:52:51 UTC 2024 - Dirk Müller <[email protected]>
+
+- update to 2.1.0:
+ * fix: parse options with numerical values as int
+- update to 2.0.0:
+ * setup.py: Fix `project_urls` parameter name
+ * Redo as a package to fix mypy issues
+
+-------------------------------------------------------------------
Old:
----
dj-database-url-1.3.0.tar.gz
New:
----
dj-database-url-2.1.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-dj-database-url.spec ++++++
--- /var/tmp/diff_new_pack.Jn3vpB/_old 2024-01-09 20:50:16.717584128 +0100
+++ /var/tmp/diff_new_pack.Jn3vpB/_new 2024-01-09 20:50:16.721584273 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-dj-database-url
#
-# Copyright (c) 2023 SUSE LLC
+# Copyright (c) 2024 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -17,7 +17,7 @@
Name: python-dj-database-url
-Version: 1.3.0
+Version: 2.1.0
Release: 0
Summary: Utility to use database URLs in Django applications
License: BSD-3-Clause
@@ -67,7 +67,6 @@
%files %{python_files}
%license LICENSE
%doc README.rst
-%{python_sitelib}/dj_database_url.py
+%{python_sitelib}/dj_database_url
%{python_sitelib}/dj_database_url-%{version}.dist-info
-%pycache_only %{python_sitelib}/__pycache__
++++++ dj-database-url-1.3.0.tar.gz -> dj-database-url-2.1.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/dj-database-url-1.3.0/MANIFEST.in
new/dj-database-url-2.1.0/MANIFEST.in
--- old/dj-database-url-1.3.0/MANIFEST.in 2023-03-27 22:56:26.000000000
+0200
+++ new/dj-database-url-2.1.0/MANIFEST.in 1970-01-01 01:00:00.000000000
+0100
@@ -1 +0,0 @@
-include py.typed
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/dj-database-url-1.3.0/PKG-INFO
new/dj-database-url-2.1.0/PKG-INFO
--- old/dj-database-url-1.3.0/PKG-INFO 2023-03-27 22:56:35.978649400 +0200
+++ new/dj-database-url-2.1.0/PKG-INFO 2023-08-15 15:12:53.640774700 +0200
@@ -1,10 +1,12 @@
Metadata-Version: 2.1
Name: dj-database-url
-Version: 1.3.0
+Version: 2.1.0
Summary: Use Database URLs in your Django Application.
Home-page: https://github.com/jazzband/dj-database-url
Author: Original Author: Kenneth Reitz, Maintained by: JazzBand Community
License: BSD
+Project-URL: GitHub, https://github.com/jazzband/dj-database-url/
+Project-URL: Release log,
https://github.com/jazzband/dj-database-url/blob/master/CHANGELOG.md
Platform: any
Classifier: Environment :: Web Environment
Classifier: Framework :: Django
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/dj-database-url-1.3.0/dj_database_url/__init__.py
new/dj-database-url-2.1.0/dj_database_url/__init__.py
--- old/dj-database-url-1.3.0/dj_database_url/__init__.py 1970-01-01
01:00:00.000000000 +0100
+++ new/dj-database-url-2.1.0/dj_database_url/__init__.py 2023-08-15
15:12:39.000000000 +0200
@@ -0,0 +1,187 @@
+import logging
+import os
+import urllib.parse as urlparse
+from typing import Any, Dict, Optional, Union
+
+from typing_extensions import TypedDict
+
+DEFAULT_ENV = "DATABASE_URL"
+
+SCHEMES = {
+ "postgres": "django.db.backends.postgresql",
+ "postgresql": "django.db.backends.postgresql",
+ "pgsql": "django.db.backends.postgresql",
+ "postgis": "django.contrib.gis.db.backends.postgis",
+ "mysql": "django.db.backends.mysql",
+ "mysql2": "django.db.backends.mysql",
+ "mysqlgis": "django.contrib.gis.db.backends.mysql",
+ "mysql-connector": "mysql.connector.django",
+ "mssql": "sql_server.pyodbc",
+ "mssqlms": "mssql",
+ "spatialite": "django.contrib.gis.db.backends.spatialite",
+ "sqlite": "django.db.backends.sqlite3",
+ "oracle": "django.db.backends.oracle",
+ "oraclegis": "django.contrib.gis.db.backends.oracle",
+ "redshift": "django_redshift_backend",
+ "cockroach": "django_cockroachdb",
+ "timescale": "timescale.db.backends.postgresql",
+ "timescalegis": "timescale.db.backends.postgis",
+}
+
+# Register database schemes in URLs.
+for key in SCHEMES.keys():
+ urlparse.uses_netloc.append(key)
+
+
+# From https://docs.djangoproject.com/en/4.0/ref/settings/#databases
+class DBConfig(TypedDict, total=False):
+ ATOMIC_REQUESTS: bool
+ AUTOCOMMIT: bool
+ CONN_MAX_AGE: Optional[int]
+ CONN_HEALTH_CHECKS: bool
+ DISABLE_SERVER_SIDE_CURSORS: bool
+ ENGINE: str
+ HOST: str
+ NAME: str
+ OPTIONS: Optional[Dict[str, Any]]
+ PASSWORD: str
+ PORT: Union[str, int]
+ TEST: Dict[str, Any]
+ TIME_ZONE: str
+ USER: str
+
+
+def config(
+ env: str = DEFAULT_ENV,
+ default: Optional[str] = None,
+ engine: Optional[str] = None,
+ conn_max_age: Optional[int] = 0,
+ conn_health_checks: bool = False,
+ ssl_require: bool = False,
+ test_options: Optional[Dict] = None,
+) -> DBConfig:
+ """Returns configured DATABASE dictionary from DATABASE_URL."""
+ s = os.environ.get(env, default)
+
+ if s is None:
+ logging.warning(
+ "No %s environment variable set, and so no databases setup" % env
+ )
+
+ if s:
+ return parse(
+ s, engine, conn_max_age, conn_health_checks, ssl_require,
test_options
+ )
+
+ return {}
+
+
+def parse(
+ url: str,
+ engine: Optional[str] = None,
+ conn_max_age: Optional[int] = 0,
+ conn_health_checks: bool = False,
+ ssl_require: bool = False,
+ test_options: Optional[dict] = None,
+) -> DBConfig:
+ """Parses a database URL."""
+ if url == "sqlite://:memory:":
+ # this is a special case, because if we pass this URL into
+ # urlparse, urlparse will choke trying to interpret "memory"
+ # as a port number
+ return {"ENGINE": SCHEMES["sqlite"], "NAME": ":memory:"}
+ # note: no other settings are required for sqlite
+
+ # otherwise parse the url as normal
+ parsed_config: DBConfig = {}
+
+ if test_options is None:
+ test_options = {}
+
+ spliturl = urlparse.urlsplit(url)
+
+ # Split query strings from path.
+ path = spliturl.path[1:]
+ query = urlparse.parse_qs(spliturl.query)
+
+ # If we are using sqlite and we have no path, then assume we
+ # want an in-memory database (this is the behaviour of sqlalchemy)
+ if spliturl.scheme == "sqlite" and path == "":
+ path = ":memory:"
+
+ # Handle postgres percent-encoded paths.
+ hostname = spliturl.hostname or ""
+ if "%" in hostname:
+ # Switch to url.netloc to avoid lower cased paths
+ hostname = spliturl.netloc
+ if "@" in hostname:
+ hostname = hostname.rsplit("@", 1)[1]
+ # Use URL Parse library to decode % encodes
+ hostname = urlparse.unquote(hostname)
+
+ # Lookup specified engine.
+ if engine is None:
+ engine = SCHEMES.get(spliturl.scheme)
+ if engine is None:
+ raise ValueError(
+ "No support for '%s'. We support: %s"
+ % (spliturl.scheme, ", ".join(sorted(SCHEMES.keys())))
+ )
+
+ port = (
+ str(spliturl.port)
+ if spliturl.port
+ and engine in (SCHEMES["oracle"], SCHEMES["mssql"], SCHEMES["mssqlms"])
+ else spliturl.port
+ )
+
+ # Update with environment configuration.
+ parsed_config.update(
+ {
+ "NAME": urlparse.unquote(path or ""),
+ "USER": urlparse.unquote(spliturl.username or ""),
+ "PASSWORD": urlparse.unquote(spliturl.password or ""),
+ "HOST": hostname,
+ "PORT": port or "",
+ "CONN_MAX_AGE": conn_max_age,
+ "CONN_HEALTH_CHECKS": conn_health_checks,
+ "ENGINE": engine,
+ }
+ )
+ if test_options:
+ parsed_config.update(
+ {
+ 'TEST': test_options,
+ }
+ )
+
+ # Pass the query string into OPTIONS.
+ options: Dict[str, Any] = {}
+ for key, values in query.items():
+ if spliturl.scheme == "mysql" and key == "ssl-ca":
+ options["ssl"] = {"ca": values[-1]}
+ continue
+
+ try:
+ options[key] = int(values[-1])
+ except (TypeError, ValueError):
+ options[key] = values[-1]
+
+ if ssl_require:
+ options["sslmode"] = "require"
+
+ # Support for Postgres Schema URLs
+ if "currentSchema" in options and engine in (
+ "django.contrib.gis.db.backends.postgis",
+ "django.db.backends.postgresql_psycopg2",
+ "django.db.backends.postgresql",
+ "django_redshift_backend",
+ "timescale.db.backends.postgresql",
+ "timescale.db.backends.postgis",
+ ):
+ options["options"] = "-c
search_path={0}".format(options.pop("currentSchema"))
+
+ if options:
+ parsed_config["OPTIONS"] = options
+
+ return parsed_config
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/dj-database-url-1.3.0/dj_database_url.egg-info/PKG-INFO
new/dj-database-url-2.1.0/dj_database_url.egg-info/PKG-INFO
--- old/dj-database-url-1.3.0/dj_database_url.egg-info/PKG-INFO 2023-03-27
22:56:35.000000000 +0200
+++ new/dj-database-url-2.1.0/dj_database_url.egg-info/PKG-INFO 2023-08-15
15:12:53.000000000 +0200
@@ -1,10 +1,12 @@
Metadata-Version: 2.1
Name: dj-database-url
-Version: 1.3.0
+Version: 2.1.0
Summary: Use Database URLs in your Django Application.
Home-page: https://github.com/jazzband/dj-database-url
Author: Original Author: Kenneth Reitz, Maintained by: JazzBand Community
License: BSD
+Project-URL: GitHub, https://github.com/jazzband/dj-database-url/
+Project-URL: Release log,
https://github.com/jazzband/dj-database-url/blob/master/CHANGELOG.md
Platform: any
Classifier: Environment :: Web Environment
Classifier: Framework :: Django
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/dj-database-url-1.3.0/dj_database_url.egg-info/SOURCES.txt
new/dj-database-url-2.1.0/dj_database_url.egg-info/SOURCES.txt
--- old/dj-database-url-1.3.0/dj_database_url.egg-info/SOURCES.txt
2023-03-27 22:56:35.000000000 +0200
+++ new/dj-database-url-2.1.0/dj_database_url.egg-info/SOURCES.txt
2023-08-15 15:12:53.000000000 +0200
@@ -1,13 +1,12 @@
LICENSE
-MANIFEST.in
README.rst
-dj_database_url.py
-py.typed
pyproject.toml
setup.py
+dj_database_url/__init__.py
+dj_database_url/py.typed
dj_database_url.egg-info/PKG-INFO
dj_database_url.egg-info/SOURCES.txt
dj_database_url.egg-info/dependency_links.txt
-dj_database_url.egg-info/not-zip-safe
dj_database_url.egg-info/requires.txt
-dj_database_url.egg-info/top_level.txt
\ No newline at end of file
+dj_database_url.egg-info/top_level.txt
+tests/test_dj_database_url.py
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/dj-database-url-1.3.0/dj_database_url.egg-info/not-zip-safe
new/dj-database-url-2.1.0/dj_database_url.egg-info/not-zip-safe
--- old/dj-database-url-1.3.0/dj_database_url.egg-info/not-zip-safe
2023-03-27 22:56:35.000000000 +0200
+++ new/dj-database-url-2.1.0/dj_database_url.egg-info/not-zip-safe
1970-01-01 01:00:00.000000000 +0100
@@ -1 +0,0 @@
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/dj-database-url-1.3.0/dj_database_url.py
new/dj-database-url-2.1.0/dj_database_url.py
--- old/dj-database-url-1.3.0/dj_database_url.py 2023-03-27
22:56:26.000000000 +0200
+++ new/dj-database-url-2.1.0/dj_database_url.py 1970-01-01
01:00:00.000000000 +0100
@@ -1,184 +0,0 @@
-import logging
-import os
-import urllib.parse as urlparse
-from typing import Any, Dict, Optional, Union
-
-from typing_extensions import TypedDict
-
-DEFAULT_ENV = "DATABASE_URL"
-
-SCHEMES = {
- "postgres": "django.db.backends.postgresql",
- "postgresql": "django.db.backends.postgresql",
- "pgsql": "django.db.backends.postgresql",
- "postgis": "django.contrib.gis.db.backends.postgis",
- "mysql": "django.db.backends.mysql",
- "mysql2": "django.db.backends.mysql",
- "mysqlgis": "django.contrib.gis.db.backends.mysql",
- "mysql-connector": "mysql.connector.django",
- "mssql": "sql_server.pyodbc",
- "mssqlms": "mssql",
- "spatialite": "django.contrib.gis.db.backends.spatialite",
- "sqlite": "django.db.backends.sqlite3",
- "oracle": "django.db.backends.oracle",
- "oraclegis": "django.contrib.gis.db.backends.oracle",
- "redshift": "django_redshift_backend",
- "cockroach": "django_cockroachdb",
- "timescale": "timescale.db.backends.postgresql",
- "timescalegis": "timescale.db.backends.postgis",
-}
-
-# Register database schemes in URLs.
-for key in SCHEMES.keys():
- urlparse.uses_netloc.append(key)
-
-
-# From https://docs.djangoproject.com/en/4.0/ref/settings/#databases
-class DBConfig(TypedDict, total=False):
- ATOMIC_REQUESTS: bool
- AUTOCOMMIT: bool
- CONN_MAX_AGE: Optional[int]
- CONN_HEALTH_CHECKS: bool
- DISABLE_SERVER_SIDE_CURSORS: bool
- ENGINE: str
- HOST: str
- NAME: str
- OPTIONS: Optional[Dict[str, Any]]
- PASSWORD: str
- PORT: Union[str, int]
- TEST: Dict[str, Any]
- TIME_ZONE: str
- USER: str
-
-
-def config(
- env: str = DEFAULT_ENV,
- default: Optional[str] = None,
- engine: Optional[str] = None,
- conn_max_age: Optional[int] = 0,
- conn_health_checks: bool = False,
- ssl_require: bool = False,
- test_options: Optional[Dict] = None,
-) -> DBConfig:
- """Returns configured DATABASE dictionary from DATABASE_URL."""
- s = os.environ.get(env, default)
-
- if s is None:
- logging.warning(
- "No %s environment variable set, and so no databases setup" % env
- )
-
- if s:
- return parse(
- s, engine, conn_max_age, conn_health_checks, ssl_require,
test_options
- )
-
- return {}
-
-
-def parse(
- url: str,
- engine: Optional[str] = None,
- conn_max_age: Optional[int] = 0,
- conn_health_checks: bool = False,
- ssl_require: bool = False,
- test_options: Optional[dict] = None,
-) -> DBConfig:
- """Parses a database URL."""
- if url == "sqlite://:memory:":
- # this is a special case, because if we pass this URL into
- # urlparse, urlparse will choke trying to interpret "memory"
- # as a port number
- return {"ENGINE": SCHEMES["sqlite"], "NAME": ":memory:"}
- # note: no other settings are required for sqlite
-
- # otherwise parse the url as normal
- parsed_config: DBConfig = {}
-
- if test_options is None:
- test_options = {}
-
- spliturl = urlparse.urlsplit(url)
-
- # Split query strings from path.
- path = spliturl.path[1:]
- query = urlparse.parse_qs(spliturl.query)
-
- # If we are using sqlite and we have no path, then assume we
- # want an in-memory database (this is the behaviour of sqlalchemy)
- if spliturl.scheme == "sqlite" and path == "":
- path = ":memory:"
-
- # Handle postgres percent-encoded paths.
- hostname = spliturl.hostname or ""
- if "%" in hostname:
- # Switch to url.netloc to avoid lower cased paths
- hostname = spliturl.netloc
- if "@" in hostname:
- hostname = hostname.rsplit("@", 1)[1]
- # Use URL Parse library to decode % encodes
- hostname = urlparse.unquote(hostname)
-
- # Lookup specified engine.
- if engine is None:
- engine = SCHEMES.get(spliturl.scheme)
- if engine is None:
- raise ValueError(
- "No support for '%s'. We support: %s"
- % (spliturl.scheme, ", ".join(sorted(SCHEMES.keys())))
- )
-
- port = (
- str(spliturl.port)
- if spliturl.port
- and engine in (SCHEMES["oracle"], SCHEMES["mssql"], SCHEMES["mssqlms"])
- else spliturl.port
- )
-
- # Update with environment configuration.
- parsed_config.update(
- {
- "NAME": urlparse.unquote(path or ""),
- "USER": urlparse.unquote(spliturl.username or ""),
- "PASSWORD": urlparse.unquote(spliturl.password or ""),
- "HOST": hostname,
- "PORT": port or "",
- "CONN_MAX_AGE": conn_max_age,
- "CONN_HEALTH_CHECKS": conn_health_checks,
- "ENGINE": engine,
- }
- )
- if test_options:
- parsed_config.update(
- {
- 'TEST': test_options,
- }
- )
-
- # Pass the query string into OPTIONS.
- options: Dict[str, Any] = {}
- for key, values in query.items():
- if spliturl.scheme == "mysql" and key == "ssl-ca":
- options["ssl"] = {"ca": values[-1]}
- continue
-
- options[key] = values[-1]
-
- if ssl_require:
- options["sslmode"] = "require"
-
- # Support for Postgres Schema URLs
- if "currentSchema" in options and engine in (
- "django.contrib.gis.db.backends.postgis",
- "django.db.backends.postgresql_psycopg2",
- "django.db.backends.postgresql",
- "django_redshift_backend",
- "timescale.db.backends.postgresql",
- "timescale.db.backends.postgis",
- ):
- options["options"] = "-c
search_path={0}".format(options.pop("currentSchema"))
-
- if options:
- parsed_config["OPTIONS"] = options
-
- return parsed_config
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/dj-database-url-1.3.0/setup.py
new/dj-database-url-2.1.0/setup.py
--- old/dj-database-url-1.3.0/setup.py 2023-03-27 22:56:26.000000000 +0200
+++ new/dj-database-url-2.1.0/setup.py 2023-08-15 15:12:39.000000000 +0200
@@ -6,19 +6,21 @@
setup(
name="dj-database-url",
- version="1.3.0",
+ version="2.1.0",
url="https://github.com/jazzband/dj-database-url",
license="BSD",
author="Original Author: Kenneth Reitz, Maintained by: JazzBand Community",
description="Use Database URLs in your Django Application.",
long_description=readme,
long_description_content_type="text/x-rst",
- py_modules=["dj_database_url"],
+ packages=["dj_database_url"],
install_requires=["Django>=3.2", "typing_extensions >= 3.10.0.0"],
- zip_safe=False,
include_package_data=True,
+ package_data={
+ "dj_database_url": ["py.typed"],
+ },
platforms="any",
- project_links={
+ project_urls={
"GitHub": "https://github.com/jazzband/dj-database-url/",
"Release log": (
"https://github.com/jazzband/dj-database-url/blob/master/CHANGELOG.md"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/dj-database-url-1.3.0/tests/test_dj_database_url.py
new/dj-database-url-2.1.0/tests/test_dj_database_url.py
--- old/dj-database-url-1.3.0/tests/test_dj_database_url.py 1970-01-01
01:00:00.000000000 +0100
+++ new/dj-database-url-2.1.0/tests/test_dj_database_url.py 2023-08-15
15:12:39.000000000 +0200
@@ -0,0 +1,597 @@
+import os
+import unittest
+from unittest import mock
+
+import dj_database_url
+
+POSTGIS_URL =
"postgis://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn"
+
+
+class DatabaseTestSuite(unittest.TestCase):
+ def test_postgres_parsing(self):
+ url =
"postgres://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn"
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "django.db.backends.postgresql"
+ assert url["NAME"] == "d8r82722r2kuvn"
+ assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+ assert url["USER"] == "uf07k1i6d8ia0v"
+ assert url["PASSWORD"] == "wegauwhgeuioweg"
+ assert url["PORT"] == 5431
+
+ def test_postgres_unix_socket_parsing(self):
+ url = "postgres://%2Fvar%2Frun%2Fpostgresql/d8r82722r2kuvn"
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "django.db.backends.postgresql"
+ assert url["NAME"] == "d8r82722r2kuvn"
+ assert url["HOST"] == "/var/run/postgresql"
+ assert url["USER"] == ""
+ assert url["PASSWORD"] == ""
+ assert url["PORT"] == ""
+
+ url = "postgres://%2FUsers%2Fpostgres%2FRuN/d8r82722r2kuvn"
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "django.db.backends.postgresql"
+ assert url["HOST"] == "/Users/postgres/RuN"
+ assert url["USER"] == ""
+ assert url["PASSWORD"] == ""
+ assert url["PORT"] == ""
+
+ def test_postgres_google_cloud_parsing(self):
+ url =
"postgres://uf07k1i6d8ia0v:wegauwhgeuioweg@%2Fcloudsql%2Fproject_id%3Aregion%3Ainstance_id/d8r82722r2kuvn"
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "django.db.backends.postgresql"
+ assert url["NAME"] == "d8r82722r2kuvn"
+ assert url["HOST"] == "/cloudsql/project_id:region:instance_id"
+ assert url["USER"] == "uf07k1i6d8ia0v"
+ assert url["PASSWORD"] == "wegauwhgeuioweg"
+ assert url["PORT"] == ""
+
+ def test_ipv6_parsing(self):
+ url =
"postgres://ieRaekei9wilaim7:wegauwhgeuioweg@[2001:db8:1234::1234:5678:90af]:5431/d8r82722r2kuvn"
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "django.db.backends.postgresql"
+ assert url["NAME"] == "d8r82722r2kuvn"
+ assert url["HOST"] == "2001:db8:1234::1234:5678:90af"
+ assert url["USER"] == "ieRaekei9wilaim7"
+ assert url["PASSWORD"] == "wegauwhgeuioweg"
+ assert url["PORT"] == 5431
+
+ def test_postgres_search_path_parsing(self):
+ url =
"postgres://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn?currentSchema=otherschema"
+ url = dj_database_url.parse(url)
+ assert url["ENGINE"] == "django.db.backends.postgresql"
+ assert url["NAME"] == "d8r82722r2kuvn"
+ assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+ assert url["USER"] == "uf07k1i6d8ia0v"
+ assert url["PASSWORD"] == "wegauwhgeuioweg"
+ assert url["PORT"] == 5431
+ assert url["OPTIONS"]["options"] == "-c search_path=otherschema"
+ assert "currentSchema" not in url["OPTIONS"]
+
+ def test_postgres_parsing_with_special_characters(self):
+ url =
"postgres://%23user:%[email protected]:5431/%23database"
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "django.db.backends.postgresql"
+ assert url["NAME"] == "#database"
+ assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+ assert url["USER"] == "#user"
+ assert url["PASSWORD"] == "#password"
+ assert url["PORT"] == 5431
+
+ def test_postgis_parsing(self):
+ url =
"postgis://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn"
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "django.contrib.gis.db.backends.postgis"
+ assert url["NAME"] == "d8r82722r2kuvn"
+ assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+ assert url["USER"] == "uf07k1i6d8ia0v"
+ assert url["PASSWORD"] == "wegauwhgeuioweg"
+ assert url["PORT"] == 5431
+
+ def test_postgis_search_path_parsing(self):
+ url =
"postgis://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn?currentSchema=otherschema"
+ url = dj_database_url.parse(url)
+ assert url["ENGINE"] == "django.contrib.gis.db.backends.postgis"
+ assert url["NAME"] == "d8r82722r2kuvn"
+ assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+ assert url["USER"] == "uf07k1i6d8ia0v"
+ assert url["PASSWORD"] == "wegauwhgeuioweg"
+ assert url["PORT"] == 5431
+ assert url["OPTIONS"]["options"] == "-c search_path=otherschema"
+ assert "currentSchema" not in url["OPTIONS"]
+
+ def test_mysql_gis_parsing(self):
+ url =
"mysqlgis://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn"
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "django.contrib.gis.db.backends.mysql"
+ assert url["NAME"] == "d8r82722r2kuvn"
+ assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+ assert url["USER"] == "uf07k1i6d8ia0v"
+ assert url["PASSWORD"] == "wegauwhgeuioweg"
+ assert url["PORT"] == 5431
+
+ def test_mysql_connector_parsing(self):
+ url =
"mysql-connector://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn"
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "mysql.connector.django"
+ assert url["NAME"] == "d8r82722r2kuvn"
+ assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+ assert url["USER"] == "uf07k1i6d8ia0v"
+ assert url["PASSWORD"] == "wegauwhgeuioweg"
+ assert url["PORT"] == 5431
+
+ def test_config_test_options(self):
+ with mock.patch.dict(
+ os.environ,
+ {
+ "DATABASE_URL":
"postgres://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn?"
+ },
+ ):
+ test_db_config = {
+ 'NAME': 'mytestdatabase',
+ }
+ url = dj_database_url.config(test_options=test_db_config)
+
+ assert url['TEST']['NAME'] == 'mytestdatabase'
+
+ def test_cleardb_parsing(self):
+ url =
"mysql://bea6eb025ca0d8:[email protected]/heroku_97681db3eff7580?reconnect=true"
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "django.db.backends.mysql"
+ assert url["NAME"] == "heroku_97681db3eff7580"
+ assert url["HOST"] == "us-cdbr-east.cleardb.com"
+ assert url["USER"] == "bea6eb025ca0d8"
+ assert url["PASSWORD"] == "69772142"
+ assert url["PORT"] == ""
+
+ def test_database_url(self):
+ with mock.patch.dict(os.environ, clear=True):
+ a = dj_database_url.config()
+ assert not a
+
+ with mock.patch.dict(
+ os.environ,
+ {
+ "DATABASE_URL":
"postgres://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn"
+ },
+ ):
+ url = dj_database_url.config()
+
+ assert url["ENGINE"] == "django.db.backends.postgresql"
+ assert url["NAME"] == "d8r82722r2kuvn"
+ assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+ assert url["USER"] == "uf07k1i6d8ia0v"
+ assert url["PASSWORD"] == "wegauwhgeuioweg"
+ assert url["PORT"] == 5431
+
+ def test_empty_sqlite_url(self):
+ url = "sqlite://"
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "django.db.backends.sqlite3"
+ assert url["NAME"] == ":memory:"
+
+ def test_memory_sqlite_url(self):
+ url = "sqlite://:memory:"
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "django.db.backends.sqlite3"
+ assert url["NAME"] == ":memory:"
+
+ def test_parse_engine_setting(self):
+ engine = "django_mysqlpool.backends.mysqlpool"
+ url =
"mysql://bea6eb025ca0d8:[email protected]/heroku_97681db3eff7580?reconnect=true"
+ url = dj_database_url.parse(url, engine)
+
+ assert url["ENGINE"] == engine
+
+ def test_config_engine_setting(self):
+ engine = "django_mysqlpool.backends.mysqlpool"
+ with mock.patch.dict(
+ os.environ,
+ {
+ "DATABASE_URL":
"mysql://bea6eb025ca0d8:[email protected]/heroku_97681db3eff7580?reconnect=true"
+ },
+ ):
+ url = dj_database_url.config(engine=engine)
+
+ assert url["ENGINE"] == engine
+
+ def test_parse_conn_max_age_setting(self):
+ conn_max_age = 600
+ url =
"mysql://bea6eb025ca0d8:[email protected]/heroku_97681db3eff7580?reconnect=true"
+ url = dj_database_url.parse(url, conn_max_age=conn_max_age)
+
+ assert url["CONN_MAX_AGE"] == conn_max_age
+
+ def test_config_conn_max_age_setting(self):
+ conn_max_age = 600
+ with mock.patch.dict(
+ os.environ,
+ {
+ "DATABASE_URL":
"mysql://bea6eb025ca0d8:[email protected]/heroku_97681db3eff7580?reconnect=true"
+ },
+ ):
+ url = dj_database_url.config(conn_max_age=conn_max_age)
+
+ assert url["CONN_MAX_AGE"] == conn_max_age
+
+ def test_database_url_with_options(self):
+ # Test full options
+ with mock.patch.dict(
+ os.environ,
+ {
+ "DATABASE_URL":
"postgres://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn?sslrootcert=rds-combined-ca-bundle.pem&sslmode=verify-full"
+ },
+ ):
+ url = dj_database_url.config()
+
+ assert url["ENGINE"] == "django.db.backends.postgresql"
+ assert url["NAME"] == "d8r82722r2kuvn"
+ assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+ assert url["USER"] == "uf07k1i6d8ia0v"
+ assert url["PASSWORD"] == "wegauwhgeuioweg"
+ assert url["PORT"] == 5431
+ assert url["OPTIONS"] == {
+ "sslrootcert": "rds-combined-ca-bundle.pem",
+ "sslmode": "verify-full",
+ }
+
+ # Test empty options
+ with mock.patch.dict(
+ os.environ,
+ {
+ "DATABASE_URL":
"postgres://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn?"
+ },
+ ):
+ url = dj_database_url.config()
+ assert "OPTIONS" not in url
+
+ def test_mysql_database_url_with_sslca_options(self):
+ with mock.patch.dict(
+ os.environ,
+ {
+ "DATABASE_URL":
"mysql://uf07k1i6d8ia0v:[email protected]:3306/d8r82722r2kuvn?ssl-ca=rds-combined-ca-bundle.pem"
+ },
+ ):
+ url = dj_database_url.config()
+
+ assert url["ENGINE"] == "django.db.backends.mysql"
+ assert url["NAME"] == "d8r82722r2kuvn"
+ assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+ assert url["USER"] == "uf07k1i6d8ia0v"
+ assert url["PASSWORD"] == "wegauwhgeuioweg"
+ assert url["PORT"] == 3306
+ assert url["OPTIONS"] == {"ssl": {"ca": "rds-combined-ca-bundle.pem"}}
+
+ # Test empty options
+ with mock.patch.dict(
+ os.environ,
+ {
+ "DATABASE_URL":
"mysql://uf07k1i6d8ia0v:[email protected]:3306/d8r82722r2kuvn?"
+ },
+ ):
+ url = dj_database_url.config()
+ assert "OPTIONS" not in url
+
+ def test_oracle_parsing(self):
+ url = "oracle://scott:tiger@oraclehost:1521/hr"
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "django.db.backends.oracle"
+ assert url["NAME"] == "hr"
+ assert url["HOST"] == "oraclehost"
+ assert url["USER"] == "scott"
+ assert url["PASSWORD"] == "tiger"
+ assert url["PORT"] == "1521"
+
+ def test_oracle_gis_parsing(self):
+ url = "oraclegis://scott:tiger@oraclehost:1521/hr"
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "django.contrib.gis.db.backends.oracle"
+ assert url["NAME"] == "hr"
+ assert url["HOST"] == "oraclehost"
+ assert url["USER"] == "scott"
+ assert url["PASSWORD"] == "tiger"
+ assert url["PORT"] == 1521
+
+ def test_oracle_dsn_parsing(self):
+ url = (
+ "oracle://scott:tiger@/"
+ "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)"
+ "(HOST=oraclehost)(PORT=1521)))"
+ "(CONNECT_DATA=(SID=hr)))"
+ )
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "django.db.backends.oracle"
+ assert url["USER"] == "scott"
+ assert url["PASSWORD"] == "tiger"
+ assert url["HOST"] == ""
+ assert url["PORT"] == ""
+
+ dsn = (
+ "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)"
+ "(HOST=oraclehost)(PORT=1521)))"
+ "(CONNECT_DATA=(SID=hr)))"
+ )
+
+ assert url["NAME"] == dsn
+
+ def test_oracle_tns_parsing(self):
+ url = "oracle://scott:tiger@/tnsname"
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "django.db.backends.oracle"
+ assert url["USER"] == "scott"
+ assert url["PASSWORD"] == "tiger"
+ assert url["NAME"] == "tnsname"
+ assert url["HOST"] == ""
+ assert url["PORT"] == ""
+
+ def test_redshift_parsing(self):
+ url =
"redshift://uf07k1i6d8ia0v:[email protected]:5439/d8r82722r2kuvn?currentSchema=otherschema"
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "django_redshift_backend"
+ assert url["NAME"] == "d8r82722r2kuvn"
+ assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+ assert url["USER"] == "uf07k1i6d8ia0v"
+ assert url["PASSWORD"] == "wegauwhgeuioweg"
+ assert url["PORT"] == 5439
+ assert url["OPTIONS"]["options"] == "-c search_path=otherschema"
+ assert "currentSchema" not in url["OPTIONS"]
+
+ def test_mssql_parsing(self):
+ url =
"mssql://uf07k1i6d8ia0v:[email protected]/d8r82722r2kuvn?driver=ODBC
Driver 13 for SQL Server"
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "sql_server.pyodbc"
+ assert url["NAME"] == "d8r82722r2kuvn"
+ assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+ assert url["USER"] == "uf07k1i6d8ia0v"
+ assert url["PASSWORD"] == "wegauwhgeuioweg"
+ assert url["PORT"] == ""
+ assert url["OPTIONS"]["driver"] == "ODBC Driver 13 for SQL Server"
+ assert "currentSchema" not in url["OPTIONS"]
+
+ def test_mssql_instance_port_parsing(self):
+ url =
"mssql://uf07k1i6d8ia0v:[email protected]\\insnsnss:12345/d8r82722r2kuvn?driver=ODBC
Driver 13 for SQL Server"
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "sql_server.pyodbc"
+ assert url["NAME"] == "d8r82722r2kuvn"
+ assert url["HOST"] ==
"ec2-107-21-253-135.compute-1.amazonaws.com\\insnsnss"
+ assert url["USER"] == "uf07k1i6d8ia0v"
+ assert url["PASSWORD"] == "wegauwhgeuioweg"
+ assert url["PORT"] == "12345"
+ assert url["OPTIONS"]["driver"] == "ODBC Driver 13 for SQL Server"
+ assert "currentSchema" not in url["OPTIONS"]
+
+ def test_cockroach(self):
+ url =
"cockroach://testuser:testpass@testhost:26257/cockroach?sslmode=verify-full&sslrootcert=/certs/ca.crt&sslcert=/certs/client.myprojectuser.crt&sslkey=/certs/client.myprojectuser.key"
+ url = dj_database_url.parse(url)
+ assert url['ENGINE'] == 'django_cockroachdb'
+ assert url['NAME'] == 'cockroach'
+ assert url['HOST'] == 'testhost'
+ assert url['USER'] == 'testuser'
+ assert url['PASSWORD'] == 'testpass'
+ assert url['PORT'] == 26257
+ assert url['OPTIONS']['sslmode'] == 'verify-full'
+ assert url['OPTIONS']['sslrootcert'] == '/certs/ca.crt'
+ assert url['OPTIONS']['sslcert'] == '/certs/client.myprojectuser.crt'
+ assert url['OPTIONS']['sslkey'] == '/certs/client.myprojectuser.key'
+
+ def test_mssqlms_parsing(self):
+ url =
"mssqlms://uf07k1i6d8ia0v:[email protected]/d8r82722r2kuvn?driver=ODBC
Driver 13 for SQL Server"
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "mssql"
+ assert url["NAME"] == "d8r82722r2kuvn"
+ assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+ assert url["USER"] == "uf07k1i6d8ia0v"
+ assert url["PASSWORD"] == "wegauwhgeuioweg"
+ assert url["PORT"] == ""
+ assert url["OPTIONS"]["driver"] == "ODBC Driver 13 for SQL Server"
+ assert "currentSchema" not in url["OPTIONS"]
+
+ def test_timescale_parsing(self):
+ url =
"timescale://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn"
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "timescale.db.backends.postgresql"
+ assert url["NAME"] == "d8r82722r2kuvn"
+ assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+ assert url["USER"] == "uf07k1i6d8ia0v"
+ assert url["PASSWORD"] == "wegauwhgeuioweg"
+ assert url["PORT"] == 5431
+
+ def test_timescale_unix_socket_parsing(self):
+ url = "timescale://%2Fvar%2Frun%2Fpostgresql/d8r82722r2kuvn"
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "timescale.db.backends.postgresql"
+ assert url["NAME"] == "d8r82722r2kuvn"
+ assert url["HOST"] == "/var/run/postgresql"
+ assert url["USER"] == ""
+ assert url["PASSWORD"] == ""
+ assert url["PORT"] == ""
+
+ url = "timescale://%2FUsers%2Fpostgres%2FRuN/d8r82722r2kuvn"
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "timescale.db.backends.postgresql"
+ assert url["HOST"] == "/Users/postgres/RuN"
+ assert url["USER"] == ""
+ assert url["PASSWORD"] == ""
+ assert url["PORT"] == ""
+
+ def test_timescale_ipv6_parsing(self):
+ url =
"timescale://ieRaekei9wilaim7:wegauwhgeuioweg@[2001:db8:1234::1234:5678:90af]:5431/d8r82722r2kuvn"
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "timescale.db.backends.postgresql"
+ assert url["NAME"] == "d8r82722r2kuvn"
+ assert url["HOST"] == "2001:db8:1234::1234:5678:90af"
+ assert url["USER"] == "ieRaekei9wilaim7"
+ assert url["PASSWORD"] == "wegauwhgeuioweg"
+ assert url["PORT"] == 5431
+
+ def test_timescale_search_path_parsing(self):
+ url =
"timescale://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn?currentSchema=otherschema"
+ url = dj_database_url.parse(url)
+ assert url["ENGINE"] == "timescale.db.backends.postgresql"
+ assert url["NAME"] == "d8r82722r2kuvn"
+ assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+ assert url["USER"] == "uf07k1i6d8ia0v"
+ assert url["PASSWORD"] == "wegauwhgeuioweg"
+ assert url["PORT"] == 5431
+ assert url["OPTIONS"]["options"] == "-c search_path=otherschema"
+ assert "currentSchema" not in url["OPTIONS"]
+
+ def test_timescale_parsing_with_special_characters(self):
+ url =
"timescale://%23user:%[email protected]:5431/%23database"
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "timescale.db.backends.postgresql"
+ assert url["NAME"] == "#database"
+ assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+ assert url["USER"] == "#user"
+ assert url["PASSWORD"] == "#password"
+ assert url["PORT"] == 5431
+
+ def test_timescalegis_parsing(self):
+ url =
"timescalegis://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn"
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "timescale.db.backends.postgis"
+ assert url["NAME"] == "d8r82722r2kuvn"
+ assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+ assert url["USER"] == "uf07k1i6d8ia0v"
+ assert url["PASSWORD"] == "wegauwhgeuioweg"
+ assert url["PORT"] == 5431
+
+ def test_timescalegis_unix_socket_parsing(self):
+ url = "timescalegis://%2Fvar%2Frun%2Fpostgresql/d8r82722r2kuvn"
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "timescale.db.backends.postgis"
+ assert url["NAME"] == "d8r82722r2kuvn"
+ assert url["HOST"] == "/var/run/postgresql"
+ assert url["USER"] == ""
+ assert url["PASSWORD"] == ""
+ assert url["PORT"] == ""
+
+ url = "timescalegis://%2FUsers%2Fpostgres%2FRuN/d8r82722r2kuvn"
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "timescale.db.backends.postgis"
+ assert url["HOST"] == "/Users/postgres/RuN"
+ assert url["USER"] == ""
+ assert url["PASSWORD"] == ""
+ assert url["PORT"] == ""
+
+ def test_timescalegis_ipv6_parsing(self):
+ url =
"timescalegis://ieRaekei9wilaim7:wegauwhgeuioweg@[2001:db8:1234::1234:5678:90af]:5431/d8r82722r2kuvn"
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "timescale.db.backends.postgis"
+ assert url["NAME"] == "d8r82722r2kuvn"
+ assert url["HOST"] == "2001:db8:1234::1234:5678:90af"
+ assert url["USER"] == "ieRaekei9wilaim7"
+ assert url["PASSWORD"] == "wegauwhgeuioweg"
+ assert url["PORT"] == 5431
+
+ def test_timescalegis_search_path_parsing(self):
+ url =
"timescalegis://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn?currentSchema=otherschema"
+ url = dj_database_url.parse(url)
+ assert url["ENGINE"] == "timescale.db.backends.postgis"
+ assert url["NAME"] == "d8r82722r2kuvn"
+ assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+ assert url["USER"] == "uf07k1i6d8ia0v"
+ assert url["PASSWORD"] == "wegauwhgeuioweg"
+ assert url["PORT"] == 5431
+ assert url["OPTIONS"]["options"] == "-c search_path=otherschema"
+ assert "currentSchema" not in url["OPTIONS"]
+
+ def test_timescalegis_parsing_with_special_characters(self):
+ url =
"timescalegis://%23user:%[email protected]:5431/%23database"
+ url = dj_database_url.parse(url)
+
+ assert url["ENGINE"] == "timescale.db.backends.postgis"
+ assert url["NAME"] == "#database"
+ assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+ assert url["USER"] == "#user"
+ assert url["PASSWORD"] == "#password"
+ assert url["PORT"] == 5431
+
+ def test_persistent_connection_variables(self):
+ url = dj_database_url.parse(
+ "sqlite://myfile.db", conn_max_age=600, conn_health_checks=True
+ )
+
+ assert url["CONN_MAX_AGE"] == 600
+ assert url["CONN_HEALTH_CHECKS"] is True
+
+ def test_sqlite_memory_persistent_connection_variables(self):
+ # memory sqlite ignores connection.close(), so persistent connection
+ # variables arenât required
+ url = dj_database_url.parse(
+ "sqlite://:memory:", conn_max_age=600, conn_health_checks=True
+ )
+
+ assert "CONN_MAX_AGE" not in url
+ assert "CONN_HEALTH_CHECKS" not in url
+
+ @mock.patch.dict(
+ os.environ,
+ {"DATABASE_URL":
"postgres://user:[email protected]:5431/d8r8?"},
+ )
+ def test_persistent_connection_variables_config(self):
+ url = dj_database_url.config(conn_max_age=600, conn_health_checks=True)
+
+ assert url["CONN_MAX_AGE"] == 600
+ assert url["CONN_HEALTH_CHECKS"] is True
+
+ def test_no_env_variable(self):
+ with self.assertLogs() as cm:
+ with mock.patch.dict(os.environ, clear=True):
+ url = dj_database_url.config()
+ assert url == {}, url
+ assert cm.output == [
+ 'WARNING:root:No DATABASE_URL environment variable set, and so no
databases setup'
+ ], cm.output
+
+ def test_bad_url_parsing(self):
+ with self.assertRaisesRegex(ValueError, "No support for 'foo'. We
support: "):
+ dj_database_url.parse("foo://bar")
+
+ @mock.patch.dict(
+ os.environ,
+ {"DATABASE_URL":
"postgres://user:[email protected]:5431/d8r8?"},
+ )
+ def test_ssl_require(self):
+ url = dj_database_url.config(ssl_require=True)
+ assert url["OPTIONS"] == {'sslmode': 'require'}
+
+ def test_options_int_values(self):
+ """Ensure that options with integer values are parsed correctly."""
+ url = dj_database_url.parse(
+ "mysql://user:[email protected]:15036/db?connect_timout=3"
+ )
+ assert url["OPTIONS"] == {'connect_timout': 3}
+
+
+if __name__ == "__main__":
+ unittest.main()