summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaude Paroz <claude@2xlibre.net>2019-08-10 11:55:22 +0200
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2019-08-13 19:44:10 +0200
commiteed2e740f7efa9a9290fb913f796437e2c4adc5f (patch)
tree9dd13dd5d3e7f6a53196b63c37c758eebaa55e70
parent88c0b907e76bccfe1a25dc6580272b07aebd45d6 (diff)
Fixed #30461 -- Made GeoIP2 and GEOIP_PATH setting accept pathlib.Path as library path.
Thanks Nikita Krokosh for the initial patch.
-rw-r--r--django/contrib/gis/geoip2/base.py6
-rw-r--r--docs/ref/contrib/gis/geoip2.txt12
-rw-r--r--docs/releases/3.0.txt5
-rw-r--r--tests/gis_tests/test_geoip2.py8
4 files changed, 24 insertions, 7 deletions
diff --git a/django/contrib/gis/geoip2/base.py b/django/contrib/gis/geoip2/base.py
index b098632d39..6b35a8acdc 100644
--- a/django/contrib/gis/geoip2/base.py
+++ b/django/contrib/gis/geoip2/base.py
@@ -1,11 +1,11 @@
import socket
-from pathlib import Path
import geoip2.database
from django.conf import settings
from django.core.exceptions import ValidationError
from django.core.validators import validate_ipv46_address
+from django.utils._os import to_path
from .resources import City, Country
@@ -76,10 +76,8 @@ class GeoIP2:
path = path or GEOIP_SETTINGS['GEOIP_PATH']
if not path:
raise GeoIP2Exception('GeoIP path must be provided via parameter or the GEOIP_PATH setting.')
- if not isinstance(path, str):
- raise TypeError('Invalid path type: %s' % type(path).__name__)
- path = Path(path)
+ path = to_path(path)
if path.is_dir():
# Constructing the GeoIP database filenames using the settings
# dictionary. If the database files for the GeoLite country
diff --git a/docs/ref/contrib/gis/geoip2.txt b/docs/ref/contrib/gis/geoip2.txt
index 2dc3dff526..abf0a7ca91 100644
--- a/docs/ref/contrib/gis/geoip2.txt
+++ b/docs/ref/contrib/gis/geoip2.txt
@@ -86,6 +86,10 @@ Keyword Arguments Description
the :setting:`GEOIP_CITY` setting.
=================== =======================================================
+.. versionchanged:: 3.0
+
+ Support for :class:`pathlib.Path` ``path`` was added.
+
Methods
=======
@@ -151,10 +155,14 @@ Settings
``GEOIP_PATH``
--------------
-A string specifying the directory where the GeoIP data files are
-located. This setting is *required* unless manually specified
+A string or :class:`pathlib.Path` specifying the directory where the GeoIP data
+files are located. This setting is *required* unless manually specified
with ``path`` keyword when initializing the :class:`GeoIP2` object.
+.. versionchanged:: 3.0
+
+ Support for :class:`pathlib.Path` was added.
+
.. setting:: GEOIP_COUNTRY
``GEOIP_COUNTRY``
diff --git a/docs/releases/3.0.txt b/docs/releases/3.0.txt
index ad303ede3e..42f4c72495 100644
--- a/docs/releases/3.0.txt
+++ b/docs/releases/3.0.txt
@@ -133,6 +133,11 @@ Minor features
* Added support for the ``furlong`` unit in
:class:`~django.contrib.gis.measure.Distance`.
+* The :setting:`GEOIP_PATH` setting now supports :class:`pathlib.Path`.
+
+* The :class:`~django.contrib.gis.geoip2.GeoIP2` class now accepts
+ :class:`pathlib.Path` ``path``.
+
:mod:`django.contrib.messages`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/tests/gis_tests/test_geoip2.py b/tests/gis_tests/test_geoip2.py
index 1fe3a1ebab..294d875ac8 100644
--- a/tests/gis_tests/test_geoip2.py
+++ b/tests/gis_tests/test_geoip2.py
@@ -1,4 +1,5 @@
import os
+import pathlib
from unittest import mock, skipUnless
from django.conf import settings
@@ -28,8 +29,13 @@ class GeoIPTest(SimpleTestCase):
path = settings.GEOIP_PATH
g2 = GeoIP2(path, 0) # Passing in data path explicitly.
g3 = GeoIP2.open(path, 0) # MaxMind Python API syntax.
+ # path accepts str and pathlib.Path.
+ if isinstance(path, str):
+ g4 = GeoIP2(pathlib.Path(path))
+ else:
+ g4 = GeoIP2(str(path))
- for g in (g1, g2, g3):
+ for g in (g1, g2, g3, g4):
self.assertTrue(g._country)
self.assertTrue(g._city)