From eed2e740f7efa9a9290fb913f796437e2c4adc5f Mon Sep 17 00:00:00 2001 From: Claude Paroz Date: Sat, 10 Aug 2019 11:55:22 +0200 Subject: [PATCH] Fixed #30461 -- Made GeoIP2 and GEOIP_PATH setting accept pathlib.Path as library path. Thanks Nikita Krokosh for the initial patch. --- django/contrib/gis/geoip2/base.py | 6 ++---- docs/ref/contrib/gis/geoip2.txt | 12 ++++++++++-- docs/releases/3.0.txt | 5 +++++ tests/gis_tests/test_geoip2.py | 8 +++++++- 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)