Hello community,

here is the log from the commit of package python-geoip2 for openSUSE:Factory 
checked in at 2020-11-06 23:43:10
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-geoip2 (Old)
 and      /work/SRC/openSUSE:Factory/.python-geoip2.new.11331 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-geoip2"

Fri Nov  6 23:43:10 2020 rev:11 rq:846048 version:4.1.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-geoip2/python-geoip2.changes      
2020-08-13 10:12:21.318573514 +0200
+++ /work/SRC/openSUSE:Factory/.python-geoip2.new.11331/python-geoip2.changes   
2020-11-06 23:43:13.355480056 +0100
@@ -1,0 +2,9 @@
+Wed Nov  4 15:56:32 UTC 2020 - Paolo Stivanin <[email protected]>
+
+- update to version 4.1.0:
+  * Added the is_residential_proxy attribute to geoip2.model.AnonymousIP
+    and geoip2.record.Traits.
+  * HTTPError now provides the decoded response content in the
+    decoded_content attribute. 
+
+-------------------------------------------------------------------

Old:
----
  python-geoip2-4.0.2.tar.gz

New:
----
  python-geoip2-4.1.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-geoip2.spec ++++++
--- /var/tmp/diff_new_pack.J3J4M5/_old  2020-11-06 23:43:14.131478564 +0100
+++ /var/tmp/diff_new_pack.J3J4M5/_new  2020-11-06 23:43:14.131478564 +0100
@@ -19,7 +19,7 @@
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 %bcond_without test
 Name:           python-geoip2
-Version:        4.0.2
+Version:        4.1.0
 Release:        0
 Summary:        MaxMind GeoIP2 Python API
 License:        Apache-2.0

++++++ python-geoip2-4.0.2.tar.gz -> python-geoip2-4.1.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/geoip2-4.0.2/HISTORY.rst new/geoip2-4.1.0/HISTORY.rst
--- old/geoip2-4.0.2/HISTORY.rst        2020-07-28 19:38:41.000000000 +0200
+++ new/geoip2-4.1.0/HISTORY.rst        2020-09-25 17:55:47.000000000 +0200
@@ -3,6 +3,14 @@
 History
 -------
 
+4.1.0 (2020-09-25)
+++++++++++++++++++
+
+* Added the ``is_residential_proxy`` attribute to ``geoip2.model.AnonymousIP``
+  and ``geoip2.record.Traits``.
+* ``HTTPError`` now provides the decoded response content in the
+  ``decoded_content`` attribute. Requested by Oleg Serbokryl. GitHub #95.
+
 4.0.2 (2020-07-28)
 ++++++++++++++++++
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/geoip2-4.0.2/PKG-INFO new/geoip2-4.1.0/PKG-INFO
--- old/geoip2-4.0.2/PKG-INFO   2020-07-28 19:39:05.857445000 +0200
+++ new/geoip2-4.1.0/PKG-INFO   2020-09-25 17:56:48.259738700 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.2
 Name: geoip2
-Version: 4.0.2
+Version: 4.1.0
 Summary: MaxMind GeoIP2 API
 Home-page: http://www.maxmind.com/
 Author: Gregory Oschwald
@@ -237,6 +237,8 @@
             False
             >>>     response.is_public_proxy
             False
+            >>>     response.is_residential_proxy
+            False
             >>>     response.is_tor_exit_node
             True
             >>>     response.ip_address
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/geoip2-4.0.2/README.rst new/geoip2-4.1.0/README.rst
--- old/geoip2-4.0.2/README.rst 2020-07-21 19:58:09.000000000 +0200
+++ new/geoip2-4.1.0/README.rst 2020-09-25 17:00:20.000000000 +0200
@@ -229,6 +229,8 @@
     False
     >>>     response.is_public_proxy
     False
+    >>>     response.is_residential_proxy
+    False
     >>>     response.is_tor_exit_node
     True
     >>>     response.ip_address
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/geoip2-4.0.2/docs/html/.buildinfo 
new/geoip2-4.1.0/docs/html/.buildinfo
--- old/geoip2-4.0.2/docs/html/.buildinfo       2020-07-28 19:39:05.000000000 
+0200
+++ new/geoip2-4.1.0/docs/html/.buildinfo       2020-09-25 17:56:48.000000000 
+0200
@@ -1,4 +1,4 @@
 # Sphinx build info version 1
 # This file hashes the configuration used when building these files. When it 
is not found, a full rebuild will be done.
-config: 5eac69c34ea0e542508a51f71d7af248
+config: 6ecb4ed3c94588e953ede0156ccf7b3b
 tags: 645f666f9bcd5a90fca523b33c5a78b7
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/geoip2-4.0.2/docs/html/_static/documentation_options.js 
new/geoip2-4.1.0/docs/html/_static/documentation_options.js
--- old/geoip2-4.0.2/docs/html/_static/documentation_options.js 2020-07-28 
19:39:05.000000000 +0200
+++ new/geoip2-4.1.0/docs/html/_static/documentation_options.js 2020-09-25 
17:56:48.000000000 +0200
@@ -1,6 +1,6 @@
 var DOCUMENTATION_OPTIONS = {
     URL_ROOT: 
document.getElementById("documentation_options").getAttribute('data-url_root'),
-    VERSION: '4.0.2',
+    VERSION: '4.1.0',
     LANGUAGE: 'None',
     COLLAPSE_INDEX: false,
     BUILDER: 'html',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/geoip2-4.0.2/docs/html/genindex.html 
new/geoip2-4.1.0/docs/html/genindex.html
--- old/geoip2-4.0.2/docs/html/genindex.html    2020-07-28 19:39:05.000000000 
+0200
+++ new/geoip2-4.1.0/docs/html/genindex.html    2020-09-25 17:56:48.000000000 
+0200
@@ -5,7 +5,7 @@
   <head>
     <meta charset="utf-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>Index &#8212; geoip2 4.0.2 documentation</title>
+    <title>Index &#8212; geoip2 4.1.0 documentation</title>
     <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     <script id="documentation_options" data-url_root="./" 
src="_static/documentation_options.js"></script>
@@ -25,7 +25,7 @@
         <li class="right" >
           <a href="py-modindex.html" title="Python Module Index"
              >modules</a> |</li>
-        <li class="nav-item nav-item-0"><a href="index.html">geoip2 4.0.2 
documentation</a> &#187;</li>
+        <li class="nav-item nav-item-0"><a href="index.html">geoip2 4.1.0 
documentation</a> &#187;</li>
         <li class="nav-item nav-item-this"><a href="">Index</a></li> 
       </ul>
     </div>  
@@ -369,6 +369,12 @@
         <li><a 
href="index.html#geoip2.records.Traits.is_public_proxy">(geoip2.records.Traits 
attribute)</a>
 </li>
       </ul></li>
+      <li><a 
href="index.html#geoip2.models.AnonymousIP.is_residential_proxy">is_residential_proxy
 (geoip2.models.AnonymousIP attribute)</a>
+
+      <ul>
+        <li><a 
href="index.html#geoip2.records.Traits.is_residential_proxy">(geoip2.records.Traits
 attribute)</a>
+</li>
+      </ul></li>
       <li><a 
href="index.html#geoip2.records.Traits.is_satellite_provider">is_satellite_provider
 (geoip2.records.Traits attribute)</a>
 </li>
       <li><a 
href="index.html#geoip2.models.AnonymousIP.is_tor_exit_node">is_tor_exit_node 
(geoip2.models.AnonymousIP attribute)</a>
@@ -684,7 +690,7 @@
         <li class="right" >
           <a href="py-modindex.html" title="Python Module Index"
              >modules</a> |</li>
-        <li class="nav-item nav-item-0"><a href="index.html">geoip2 4.0.2 
documentation</a> &#187;</li>
+        <li class="nav-item nav-item-0"><a href="index.html">geoip2 4.1.0 
documentation</a> &#187;</li>
         <li class="nav-item nav-item-this"><a href="">Index</a></li> 
       </ul>
     </div>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/geoip2-4.0.2/docs/html/index.html 
new/geoip2-4.1.0/docs/html/index.html
--- old/geoip2-4.0.2/docs/html/index.html       2020-07-28 19:39:05.000000000 
+0200
+++ new/geoip2-4.1.0/docs/html/index.html       2020-09-25 17:56:48.000000000 
+0200
@@ -5,7 +5,7 @@
   <head>
     <meta charset="utf-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>MaxMind GeoIP2 Python API &#8212; geoip2 4.0.2 documentation</title>
+    <title>MaxMind GeoIP2 Python API &#8212; geoip2 4.1.0 documentation</title>
     <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     <script id="documentation_options" data-url_root="./" 
src="_static/documentation_options.js"></script>
@@ -25,7 +25,7 @@
         <li class="right" >
           <a href="py-modindex.html" title="Python Module Index"
              >modules</a> |</li>
-        <li class="nav-item nav-item-0"><a href="#">geoip2 4.0.2 
documentation</a> &#187;</li>
+        <li class="nav-item nav-item-0"><a href="#">geoip2 4.1.0 
documentation</a> &#187;</li>
         <li class="nav-item nav-item-this"><a href="">MaxMind GeoIP2 Python 
API</a></li> 
       </ul>
     </div>  
@@ -241,6 +241,8 @@
 <span class="go">False</span>
 <span class="gp">&gt;&gt;&gt; </span>    <span class="n">response</span><span 
class="o">.</span><span class="n">is_public_proxy</span>
 <span class="go">False</span>
+<span class="gp">&gt;&gt;&gt; </span>    <span class="n">response</span><span 
class="o">.</span><span class="n">is_residential_proxy</span>
+<span class="go">False</span>
 <span class="gp">&gt;&gt;&gt; </span>    <span class="n">response</span><span 
class="o">.</span><span class="n">is_tor_exit_node</span>
 <span class="go">True</span>
 <span class="gp">&gt;&gt;&gt; </span>    <span class="n">response</span><span 
class="o">.</span><span class="n">ip_address</span>
@@ -953,6 +955,18 @@
 </dd></dl>
 
 <dl class="py attribute">
+<dt id="geoip2.models.AnonymousIP.is_residential_proxy">
+<code class="sig-name descname">is_residential_proxy</code><a 
class="headerlink" href="#geoip2.models.AnonymousIP.is_residential_proxy" 
title="Permalink to this definition">¶</a></dt>
+<dd><p>This is true if the IP address is on a suspected anonymizing network
+and belongs to a residential ISP.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type</dt>
+<dd class="field-odd"><p><a class="reference external" 
href="https://docs.python.org/3/library/functions.html#bool"; title="(in Python 
v3.8)">bool</a></p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
 <dt id="geoip2.models.AnonymousIP.is_tor_exit_node">
 <code class="sig-name descname">is_tor_exit_node</code><a class="headerlink" 
href="#geoip2.models.AnonymousIP.is_tor_exit_node" title="Permalink to this 
definition">¶</a></dt>
 <dd><p>This is true if the IP address is a Tor exit node.</p>
@@ -2136,7 +2150,7 @@
 
 <dl class="py class">
 <dt id="geoip2.records.Traits">
-<em class="property">class </em><code class="sig-prename 
descclassname">geoip2.records.</code><code class="sig-name 
descname">Traits</code><span class="sig-paren">(</span><em 
class="sig-param"><span class="n">autonomous_system_number</span><span 
class="p">:</span> <span class="n">Optional<span class="p">[</span><a 
class="reference external" 
href="https://docs.python.org/3/library/functions.html#int"; title="(in Python 
v3.8)">int</a><span class="p">]</span></span> <span class="o">=</span> <span 
class="default_value">None</span></em>, <em class="sig-param"><span 
class="n">autonomous_system_organization</span><span class="p">:</span> <span 
class="n">Optional<span class="p">[</span><a class="reference external" 
href="https://docs.python.org/3/library/stdtypes.html#str"; title="(in Python 
v3.8)">str</a><span class="p">]</span></span> <span class="o">=</span> <span 
class="default_value">None</span></em>, <em class="sig-param"><span 
class="n">connection_type</span><span class="p">:</span> <span 
class="n">Optional<span class="p">[</span><a class="reference external" 
href="https://docs.python.org/3/library/stdtypes.html#str"; title="(in Python 
v3.8)">str</a><span class="p">]</span></span> <span class="o">=</span> <span 
class="default_value">None</span></em>, <em class="sig-param"><span 
class="n">domain</span><span class="p">:</span> <span class="n">Optional<span 
class="p">[</span><a class="reference external" 
href="https://docs.python.org/3/library/stdtypes.html#str"; title="(in Python 
v3.8)">str</a><span class="p">]</span></span> <span class="o">=</span> <span 
class="default_value">None</span></em>, <em class="sig-param"><span 
class="n">is_anonymous</span><span class="p">:</span> <span class="n"><a 
class="reference external" 
href="https://docs.python.org/3/library/functions.html#bool"; title="(in Python 
v3.8)">bool</a></span> <span class="o">=</span> <span 
class="default_value">False</span></em>, <em class="sig-param"><span 
class="n">is_anonymous_proxy</span><span class="p">:</span> <span class="n"><a 
class="reference external" 
href="https://docs.python.org/3/library/functions.html#bool"; title="(in Python 
v3.8)">bool</a></span> <span class="o">=</span> <span 
class="default_value">False</span></em>, <em class="sig-param"><span 
class="n">is_anonymous_vpn</span><span class="p">:</span> <span class="n"><a 
class="reference external" 
href="https://docs.python.org/3/library/functions.html#bool"; title="(in Python 
v3.8)">bool</a></span> <span class="o">=</span> <span 
class="default_value">False</span></em>, <em class="sig-param"><span 
class="n">is_hosting_provider</span><span class="p">:</span> <span class="n"><a 
class="reference external" 
href="https://docs.python.org/3/library/functions.html#bool"; title="(in Python 
v3.8)">bool</a></span> <span class="o">=</span> <span 
class="default_value">False</span></em>, <em class="sig-param"><span 
class="n">is_legitimate_proxy</span><span class="p">:</span> <span class="n"><a 
class="reference external" 
href="https://docs.python.org/3/library/functions.html#bool"; title="(in Python 
v3.8)">bool</a></span> <span class="o">=</span> <span 
class="default_value">False</span></em>, <em class="sig-param"><span 
class="n">is_public_proxy</span><span class="p">:</span> <span class="n"><a 
class="reference external" 
href="https://docs.python.org/3/library/functions.html#bool"; title="(in Python 
v3.8)">bool</a></span> <span class="o">=</span> <span 
class="default_value">False</span></em>, <em class="sig-param"><span 
class="n">is_satellite_provider</span><span class="p">:</span> <span 
class="n"><a class="reference external" 
href="https://docs.python.org/3/library/functions.html#bool"; title="(in Python 
v3.8)">bool</a></span> <span class="o">=</span> <span 
class="default_value">False</span></em>, <em class="sig-param"><span 
class="n">is_tor_exit_node</span><span class="p">:</span> <span class="n"><a 
class="reference external" 
href="https://docs.python.org/3/library/functions.html#bool"; title="(in Python 
v3.8)">bool</a></span> <span class="o">=</span> <span 
class="default_value">False</span></em>, <em class="sig-param"><span 
class="n">isp</span><span class="p">:</span> <span class="n">Optional<span 
class="p">[</span><a class="reference external" 
href="https://docs.python.org/3/library/stdtypes.html#str"; title="(in Python 
v3.8)">str</a><span class="p">]</span></span> <span class="o">=</span> <span 
class="default_value">None</span></em>, <em class="sig-param"><span 
class="n">ip_address</span><span class="p">:</span> <span 
class="n">Optional<span class="p">[</span><a class="reference external" 
href="https://docs.python.org/3/library/stdtypes.html#str"; title="(in Python 
v3.8)">str</a><span class="p">]</span></span> <span class="o">=</span> <span 
class="default_value">None</span></em>, <em class="sig-param"><span 
class="n">network</span><span class="p">:</span> <span class="n">Optional<span 
class="p">[</span><a class="reference external" 
href="https://docs.python.org/3/library/stdtypes.html#str"; title="(in Python 
v3.8)">str</a><span class="p">]</span></span> <span class="o">=</span> <span 
class="default_value">None</span></em>, <em class="sig-param"><span 
class="n">organization</span><span class="p">:</span> <span 
class="n">Optional<span class="p">[</span><a class="reference external" 
href="https://docs.python.org/3/library/stdtypes.html#str"; title="(in Python 
v3.8)">str</a><span class="p">]</span></span> <span class="o">=</span> <span 
class="default_value">None</span></em>, <em class="sig-param"><span 
class="n">prefix_len</span><span class="p">:</span> <span 
class="n">Optional<span class="p">[</span><a class="reference external" 
href="https://docs.python.org/3/library/functions.html#int"; title="(in Python 
v3.8)">int</a><span class="p">]</span></span> <span class="o">=</span> <span 
class="default_value">None</span></em>, <em class="sig-param"><span 
class="n">static_ip_score</span><span class="p">:</span> <span 
class="n">Optional<span class="p">[</span><a class="reference external" 
href="https://docs.python.org/3/library/functions.html#float"; title="(in Python 
v3.8)">float</a><span class="p">]</span></span> <span class="o">=</span> <span 
class="default_value">None</span></em>, <em class="sig-param"><span 
class="n">user_count</span><span class="p">:</span> <span 
class="n">Optional<span class="p">[</span><a class="reference external" 
href="https://docs.python.org/3/library/functions.html#int"; title="(in Python 
v3.8)">int</a><span class="p">]</span></span> <span class="o">=</span> <span 
class="default_value">None</span></em>, <em class="sig-param"><span 
class="n">user_type</span><span class="p">:</span> <span 
class="n">Optional<span class="p">[</span><a class="reference external" 
href="https://docs.python.org/3/library/stdtypes.html#str"; title="(in Python 
v3.8)">str</a><span class="p">]</span></span> <span class="o">=</span> <span 
class="default_value">None</span></em>, <em class="sig-param"><span 
class="o">**</span><span class="n">_</span></em><span 
class="sig-paren">)</span><a class="headerlink" href="#geoip2.records.Traits" 
title="Permalink to this definition">¶</a></dt>
+<em class="property">class </em><code class="sig-prename 
descclassname">geoip2.records.</code><code class="sig-name 
descname">Traits</code><span class="sig-paren">(</span><em 
class="sig-param"><span class="n">autonomous_system_number</span><span 
class="p">:</span> <span class="n">Optional<span class="p">[</span><a 
class="reference external" 
href="https://docs.python.org/3/library/functions.html#int"; title="(in Python 
v3.8)">int</a><span class="p">]</span></span> <span class="o">=</span> <span 
class="default_value">None</span></em>, <em class="sig-param"><span 
class="n">autonomous_system_organization</span><span class="p">:</span> <span 
class="n">Optional<span class="p">[</span><a class="reference external" 
href="https://docs.python.org/3/library/stdtypes.html#str"; title="(in Python 
v3.8)">str</a><span class="p">]</span></span> <span class="o">=</span> <span 
class="default_value">None</span></em>, <em class="sig-param"><span 
class="n">connection_type</span><span class="p">:</span> <span 
class="n">Optional<span class="p">[</span><a class="reference external" 
href="https://docs.python.org/3/library/stdtypes.html#str"; title="(in Python 
v3.8)">str</a><span class="p">]</span></span> <span class="o">=</span> <span 
class="default_value">None</span></em>, <em class="sig-param"><span 
class="n">domain</span><span class="p">:</span> <span class="n">Optional<span 
class="p">[</span><a class="reference external" 
href="https://docs.python.org/3/library/stdtypes.html#str"; title="(in Python 
v3.8)">str</a><span class="p">]</span></span> <span class="o">=</span> <span 
class="default_value">None</span></em>, <em class="sig-param"><span 
class="n">is_anonymous</span><span class="p">:</span> <span class="n"><a 
class="reference external" 
href="https://docs.python.org/3/library/functions.html#bool"; title="(in Python 
v3.8)">bool</a></span> <span class="o">=</span> <span 
class="default_value">False</span></em>, <em class="sig-param"><span 
class="n">is_anonymous_proxy</span><span class="p">:</span> <span class="n"><a 
class="reference external" 
href="https://docs.python.org/3/library/functions.html#bool"; title="(in Python 
v3.8)">bool</a></span> <span class="o">=</span> <span 
class="default_value">False</span></em>, <em class="sig-param"><span 
class="n">is_anonymous_vpn</span><span class="p">:</span> <span class="n"><a 
class="reference external" 
href="https://docs.python.org/3/library/functions.html#bool"; title="(in Python 
v3.8)">bool</a></span> <span class="o">=</span> <span 
class="default_value">False</span></em>, <em class="sig-param"><span 
class="n">is_hosting_provider</span><span class="p">:</span> <span class="n"><a 
class="reference external" 
href="https://docs.python.org/3/library/functions.html#bool"; title="(in Python 
v3.8)">bool</a></span> <span class="o">=</span> <span 
class="default_value">False</span></em>, <em class="sig-param"><span 
class="n">is_legitimate_proxy</span><span class="p">:</span> <span class="n"><a 
class="reference external" 
href="https://docs.python.org/3/library/functions.html#bool"; title="(in Python 
v3.8)">bool</a></span> <span class="o">=</span> <span 
class="default_value">False</span></em>, <em class="sig-param"><span 
class="n">is_public_proxy</span><span class="p">:</span> <span class="n"><a 
class="reference external" 
href="https://docs.python.org/3/library/functions.html#bool"; title="(in Python 
v3.8)">bool</a></span> <span class="o">=</span> <span 
class="default_value">False</span></em>, <em class="sig-param"><span 
class="n">is_residential_proxy</span><span class="p">:</span> <span 
class="n"><a class="reference external" 
href="https://docs.python.org/3/library/functions.html#bool"; title="(in Python 
v3.8)">bool</a></span> <span class="o">=</span> <span 
class="default_value">False</span></em>, <em class="sig-param"><span 
class="n">is_satellite_provider</span><span class="p">:</span> <span 
class="n"><a class="reference external" 
href="https://docs.python.org/3/library/functions.html#bool"; title="(in Python 
v3.8)">bool</a></span> <span class="o">=</span> <span 
class="default_value">False</span></em>, <em class="sig-param"><span 
class="n">is_tor_exit_node</span><span class="p">:</span> <span class="n"><a 
class="reference external" 
href="https://docs.python.org/3/library/functions.html#bool"; title="(in Python 
v3.8)">bool</a></span> <span class="o">=</span> <span 
class="default_value">False</span></em>, <em class="sig-param"><span 
class="n">isp</span><span class="p">:</span> <span class="n">Optional<span 
class="p">[</span><a class="reference external" 
href="https://docs.python.org/3/library/stdtypes.html#str"; title="(in Python 
v3.8)">str</a><span class="p">]</span></span> <span class="o">=</span> <span 
class="default_value">None</span></em>, <em class="sig-param"><span 
class="n">ip_address</span><span class="p">:</span> <span 
class="n">Optional<span class="p">[</span><a class="reference external" 
href="https://docs.python.org/3/library/stdtypes.html#str"; title="(in Python 
v3.8)">str</a><span class="p">]</span></span> <span class="o">=</span> <span 
class="default_value">None</span></em>, <em class="sig-param"><span 
class="n">network</span><span class="p">:</span> <span class="n">Optional<span 
class="p">[</span><a class="reference external" 
href="https://docs.python.org/3/library/stdtypes.html#str"; title="(in Python 
v3.8)">str</a><span class="p">]</span></span> <span class="o">=</span> <span 
class="default_value">None</span></em>, <em class="sig-param"><span 
class="n">organization</span><span class="p">:</span> <span 
class="n">Optional<span class="p">[</span><a class="reference external" 
href="https://docs.python.org/3/library/stdtypes.html#str"; title="(in Python 
v3.8)">str</a><span class="p">]</span></span> <span class="o">=</span> <span 
class="default_value">None</span></em>, <em class="sig-param"><span 
class="n">prefix_len</span><span class="p">:</span> <span 
class="n">Optional<span class="p">[</span><a class="reference external" 
href="https://docs.python.org/3/library/functions.html#int"; title="(in Python 
v3.8)">int</a><span class="p">]</span></span> <span class="o">=</span> <span 
class="default_value">None</span></em>, <em class="sig-param"><span 
class="n">static_ip_score</span><span class="p">:</span> <span 
class="n">Optional<span class="p">[</span><a class="reference external" 
href="https://docs.python.org/3/library/functions.html#float"; title="(in Python 
v3.8)">float</a><span class="p">]</span></span> <span class="o">=</span> <span 
class="default_value">None</span></em>, <em class="sig-param"><span 
class="n">user_count</span><span class="p">:</span> <span 
class="n">Optional<span class="p">[</span><a class="reference external" 
href="https://docs.python.org/3/library/functions.html#int"; title="(in Python 
v3.8)">int</a><span class="p">]</span></span> <span class="o">=</span> <span 
class="default_value">None</span></em>, <em class="sig-param"><span 
class="n">user_type</span><span class="p">:</span> <span 
class="n">Optional<span class="p">[</span><a class="reference external" 
href="https://docs.python.org/3/library/stdtypes.html#str"; title="(in Python 
v3.8)">str</a><span class="p">]</span></span> <span class="o">=</span> <span 
class="default_value">None</span></em>, <em class="sig-param"><span 
class="o">**</span><span class="n">_</span></em><span 
class="sig-paren">)</span><a class="headerlink" href="#geoip2.records.Traits" 
title="Permalink to this definition">¶</a></dt>
 <dd><p>Contains data for the traits record associated with an IP address.</p>
 <p>This class contains the traits data associated with an IP address.</p>
 <p>This class has the following attributes:</p>
@@ -2302,6 +2316,19 @@
 </dd></dl>
 
 <dl class="py attribute">
+<dt id="geoip2.records.Traits.is_residential_proxy">
+<code class="sig-name descname">is_residential_proxy</code><a 
class="headerlink" href="#geoip2.records.Traits.is_residential_proxy" 
title="Permalink to this definition">¶</a></dt>
+<dd><p>This is true if the IP address is on a suspected anonymizing network
+and belongs to a residential ISP. This attribute is only available from
+GeoIP2 Precision Insights.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type</dt>
+<dd class="field-odd"><p><a class="reference external" 
href="https://docs.python.org/3/library/functions.html#bool"; title="(in Python 
v3.8)">bool</a></p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
 <dt id="geoip2.records.Traits.is_satellite_provider">
 <code class="sig-name descname">is_satellite_provider</code><a 
class="headerlink" href="#geoip2.records.Traits.is_satellite_provider" 
title="Permalink to this definition">¶</a></dt>
 <dd><p>This is true if the IP address is from a satellite provider that
@@ -2466,7 +2493,7 @@
 
 <dl class="py exception">
 <dt id="geoip2.errors.HTTPError">
-<em class="property">exception </em><code class="sig-prename 
descclassname">geoip2.errors.</code><code class="sig-name 
descname">HTTPError</code><span class="sig-paren">(</span><em 
class="sig-param"><span class="n">message</span><span class="p">:</span> <span 
class="n"><a class="reference external" 
href="https://docs.python.org/3/library/stdtypes.html#str"; title="(in Python 
v3.8)">str</a></span></em>, <em class="sig-param"><span 
class="n">http_status</span><span class="p">:</span> <span 
class="n">Optional<span class="p">[</span><a class="reference external" 
href="https://docs.python.org/3/library/functions.html#int"; title="(in Python 
v3.8)">int</a><span class="p">]</span></span> <span class="o">=</span> <span 
class="default_value">None</span></em>, <em class="sig-param"><span 
class="n">uri</span><span class="p">:</span> <span class="n">Optional<span 
class="p">[</span><a class="reference external" 
href="https://docs.python.org/3/library/stdtypes.html#str"; title="(in Python 
v3.8)">str</a><span class="p">]</span></span> <span class="o">=</span> <span 
class="default_value">None</span></em><span class="sig-paren">)</span><a 
class="headerlink" href="#geoip2.errors.HTTPError" title="Permalink to this 
definition">¶</a></dt>
+<em class="property">exception </em><code class="sig-prename 
descclassname">geoip2.errors.</code><code class="sig-name 
descname">HTTPError</code><span class="sig-paren">(</span><em 
class="sig-param"><span class="n">message</span><span class="p">:</span> <span 
class="n"><a class="reference external" 
href="https://docs.python.org/3/library/stdtypes.html#str"; title="(in Python 
v3.8)">str</a></span></em>, <em class="sig-param"><span 
class="n">http_status</span><span class="p">:</span> <span 
class="n">Optional<span class="p">[</span><a class="reference external" 
href="https://docs.python.org/3/library/functions.html#int"; title="(in Python 
v3.8)">int</a><span class="p">]</span></span> <span class="o">=</span> <span 
class="default_value">None</span></em>, <em class="sig-param"><span 
class="n">uri</span><span class="p">:</span> <span class="n">Optional<span 
class="p">[</span><a class="reference external" 
href="https://docs.python.org/3/library/stdtypes.html#str"; title="(in Python 
v3.8)">str</a><span class="p">]</span></span> <span class="o">=</span> <span 
class="default_value">None</span></em>, <em class="sig-param"><span 
class="n">decoded_content</span><span class="p">:</span> <span 
class="n">Optional<span class="p">[</span><a class="reference external" 
href="https://docs.python.org/3/library/stdtypes.html#str"; title="(in Python 
v3.8)">str</a><span class="p">]</span></span> <span class="o">=</span> <span 
class="default_value">None</span></em><span class="sig-paren">)</span><a 
class="headerlink" href="#geoip2.errors.HTTPError" title="Permalink to this 
definition">¶</a></dt>
 <dd><p>There was an error when making your HTTP request.</p>
 <p>This class represents an HTTP transport error. It extends
 <a class="reference internal" href="#geoip2.errors.GeoIP2Error" 
title="geoip2.errors.GeoIP2Error"><code class="xref py py-exc docutils literal 
notranslate"><span class="pre">GeoIP2Error</span></code></a> and adds 
attributes of its own.</p>
@@ -2475,6 +2502,7 @@
 <dd class="field-odd"><ul class="simple">
 <li><p><strong>http_status</strong> – The HTTP status code returned</p></li>
 <li><p><strong>uri</strong> – The URI queried</p></li>
+<li><p><strong>decoded_content</strong> – The decoded response content</p></li>
 </ul>
 </dd>
 </dl>
@@ -2603,7 +2631,7 @@
         <li class="right" >
           <a href="py-modindex.html" title="Python Module Index"
              >modules</a> |</li>
-        <li class="nav-item nav-item-0"><a href="#">geoip2 4.0.2 
documentation</a> &#187;</li>
+        <li class="nav-item nav-item-0"><a href="#">geoip2 4.1.0 
documentation</a> &#187;</li>
         <li class="nav-item nav-item-this"><a href="">MaxMind GeoIP2 Python 
API</a></li> 
       </ul>
     </div>
Binary files old/geoip2-4.0.2/docs/html/objects.inv and 
new/geoip2-4.1.0/docs/html/objects.inv differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/geoip2-4.0.2/docs/html/py-modindex.html 
new/geoip2-4.1.0/docs/html/py-modindex.html
--- old/geoip2-4.0.2/docs/html/py-modindex.html 2020-07-28 19:39:05.000000000 
+0200
+++ new/geoip2-4.1.0/docs/html/py-modindex.html 2020-09-25 17:56:48.000000000 
+0200
@@ -5,7 +5,7 @@
   <head>
     <meta charset="utf-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>Python Module Index &#8212; geoip2 4.0.2 documentation</title>
+    <title>Python Module Index &#8212; geoip2 4.1.0 documentation</title>
     <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     <script id="documentation_options" data-url_root="./" 
src="_static/documentation_options.js"></script>
@@ -28,7 +28,7 @@
         <li class="right" >
           <a href="#" title="Python Module Index"
              >modules</a> |</li>
-        <li class="nav-item nav-item-0"><a href="index.html">geoip2 4.0.2 
documentation</a> &#187;</li>
+        <li class="nav-item nav-item-0"><a href="index.html">geoip2 4.1.0 
documentation</a> &#187;</li>
         <li class="nav-item nav-item-this"><a href="">Python Module 
Index</a></li> 
       </ul>
     </div>  
@@ -112,7 +112,7 @@
         <li class="right" >
           <a href="#" title="Python Module Index"
              >modules</a> |</li>
-        <li class="nav-item nav-item-0"><a href="index.html">geoip2 4.0.2 
documentation</a> &#187;</li>
+        <li class="nav-item nav-item-0"><a href="index.html">geoip2 4.1.0 
documentation</a> &#187;</li>
         <li class="nav-item nav-item-this"><a href="">Python Module 
Index</a></li> 
       </ul>
     </div>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/geoip2-4.0.2/docs/html/search.html 
new/geoip2-4.1.0/docs/html/search.html
--- old/geoip2-4.0.2/docs/html/search.html      2020-07-28 19:39:05.000000000 
+0200
+++ new/geoip2-4.1.0/docs/html/search.html      2020-09-25 17:56:48.000000000 
+0200
@@ -5,7 +5,7 @@
   <head>
     <meta charset="utf-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>Search &#8212; geoip2 4.0.2 documentation</title>
+    <title>Search &#8212; geoip2 4.1.0 documentation</title>
     <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     
@@ -30,7 +30,7 @@
         <li class="right" >
           <a href="py-modindex.html" title="Python Module Index"
              >modules</a> |</li>
-        <li class="nav-item nav-item-0"><a href="index.html">geoip2 4.0.2 
documentation</a> &#187;</li>
+        <li class="nav-item nav-item-0"><a href="index.html">geoip2 4.1.0 
documentation</a> &#187;</li>
         <li class="nav-item nav-item-this"><a href="">Search</a></li> 
       </ul>
     </div>  
@@ -81,7 +81,7 @@
         <li class="right" >
           <a href="py-modindex.html" title="Python Module Index"
              >modules</a> |</li>
-        <li class="nav-item nav-item-0"><a href="index.html">geoip2 4.0.2 
documentation</a> &#187;</li>
+        <li class="nav-item nav-item-0"><a href="index.html">geoip2 4.1.0 
documentation</a> &#187;</li>
         <li class="nav-item nav-item-this"><a href="">Search</a></li> 
       </ul>
     </div>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/geoip2-4.0.2/docs/html/searchindex.js 
new/geoip2-4.1.0/docs/html/searchindex.js
--- old/geoip2-4.0.2/docs/html/searchindex.js   2020-07-28 19:39:05.000000000 
+0200
+++ new/geoip2-4.1.0/docs/html/searchindex.js   2020-09-25 17:56:48.000000000 
+0200
@@ -1 +1 @@
-Search.setIndex({docnames:["index"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,"sphinx.ext.intersphinx":1,sphinx:56},filenames:["index.rst"],objects:{"":{geoip2:[0,0,0,"-"]},"geoip2.database":{Reader:[0,1,1,""]},"geoip2.database.Reader":{anonymous_ip:[0,2,1,""],asn:[0,2,1,""],city:[0,2,1,""],close:[0,2,1,""],connection_type:[0,2,1,""],country:[0,2,1,""],domain:[0,2,1,""],enterprise:[0,2,1,""],isp:[0,2,1,""],metadata:[0,2,1,""]},"geoip2.errors":{AddressNotFoundError:[0,3,1,""],AuthenticationError:[0,3,1,""],GeoIP2Error:[0,3,1,""],HTTPError:[0,3,1,""],InvalidRequestError:[0,3,1,""],OutOfQueriesError:[0,3,1,""],PermissionRequiredError:[0,3,1,""]},"geoip2.models":{ASN:[0,1,1,""],AnonymousIP:[0,1,1,""],City:[0,1,1,""],ConnectionType:[0,1,1,""],Country:[0,1,1,""],Domain:[0,1,1,""],Enterprise:[0,1,1,""],ISP:[0,1,1,""],Insights:[0,1,1,""],SimpleModel:[0,1,1,""]},"geoip2.models.ASN":{autonomous_system_number:[0,4,1,""],autonomous_system_organization:[0,4,1,""],ip_address:[0,4,1,""],network:[0,4,1,""]},"geoip2.models.AnonymousIP":{ip_address:[0,4,1,""],is_anonymous:[0,4,1,""],is_anonymous_vpn:[0,4,1,""],is_hosting_provider:[0,4,1,""],is_public_proxy:[0,4,1,""],is_tor_exit_node:[0,4,1,""],network:[0,4,1,""]},"geoip2.models.City":{city:[0,4,1,""],continent:[0,4,1,""],country:[0,4,1,""],location:[0,4,1,""],maxmind:[0,4,1,""],postal:[0,4,1,""],registered_country:[0,4,1,""],represented_country:[0,4,1,""],subdivisions:[0,4,1,""],traits:[0,4,1,""]},"geoip2.models.ConnectionType":{connection_type:[0,4,1,""],ip_address:[0,4,1,""],network:[0,4,1,""]},"geoip2.models.Country":{continent:[0,4,1,""],country:[0,4,1,""],maxmind:[0,4,1,""],registered_country:[0,4,1,""],represented_country:[0,4,1,""],traits:[0,4,1,""]},"geoip2.models.Domain":{domain:[0,4,1,""],ip_address:[0,4,1,""],network:[0,4,1,""]},"geoip2.models.Enterprise":{city:[0,4,1,""],continent:[0,4,1,""],country:[0,4,1,""],location:[0,4,1,""],maxmind:[0,4,1,""],registered_country:[0,4,1,""],represented_country:[0,4,1,""],subdivisions:[0,4,1,""],traits:[0,4,1,""]},"geoip2.models.ISP":{autonomous_system_number:[0,4,1,""],autonomous_system_organization:[0,4,1,""],ip_address:[0,4,1,""],isp:[0,4,1,""],network:[0,4,1,""],organization:[0,4,1,""]},"geoip2.models.Insights":{city:[0,4,1,""],continent:[0,4,1,""],country:[0,4,1,""],location:[0,4,1,""],maxmind:[0,4,1,""],registered_country:[0,4,1,""],represented_country:[0,4,1,""],subdivisions:[0,4,1,""],traits:[0,4,1,""]},"geoip2.models.SimpleModel":{network:[0,2,1,""]},"geoip2.records":{City:[0,1,1,""],Continent:[0,1,1,""],Country:[0,1,1,""],Location:[0,1,1,""],MaxMind:[0,1,1,""],PlaceRecord:[0,1,1,""],Postal:[0,1,1,""],Record:[0,1,1,""],RepresentedCountry:[0,1,1,""],Subdivision:[0,1,1,""],Subdivisions:[0,1,1,""],Traits:[0,1,1,""]},"geoip2.records.City":{confidence:[0,4,1,""],geoname_id:[0,4,1,""],name:[0,4,1,""],names:[0,4,1,""]},"geoip2.records.Continent":{code:[0,4,1,""],geoname_id:[0,4,1,""],name:[0,4,1,""],names:[0,4,1,""]},"geoip2.records.Country":{confidence:[0,4,1,""],geoname_id:[0,4,1,""],is_in_european_union:[0,4,1,""],iso_code:[0,4,1,""],name:[0,4,1,""],names:[0,4,1,""]},"geoip2.records.Location":{accuracy_radius:[0,4,1,""],average_income:[0,4,1,""],latitude:[0,4,1,""],longitude:[0,4,1,""],metro_code:[0,4,1,""],population_density:[0,4,1,""],time_zone:[0,4,1,""]},"geoip2.records.MaxMind":{queries_remaining:[0,4,1,""]},"geoip2.records.PlaceRecord":{name:[0,2,1,""]},"geoip2.records.Postal":{code:[0,4,1,""],confidence:[0,4,1,""]},"geoip2.records.RepresentedCountry":{confidence:[0,4,1,""],geoname_id:[0,4,1,""],is_in_european_union:[0,4,1,""],iso_code:[0,4,1,""],name:[0,4,1,""],names:[0,4,1,""],type:[0,4,1,""]},"geoip2.records.Subdivision":{confidence:[0,4,1,""],geoname_id:[0,4,1,""],iso_code:[0,4,1,""],name:[0,4,1,""],names:[0,4,1,""]},"geoip2.records.Subdivisions":{most_specific:[0,2,1,""]},"geoip2.records.Traits":{autonomous_system_number:[0,4,1,""],autonomous_system_organization:[0,4,1,""],connection_type:[0,4,1,""],domain:[0,4,1,""],ip_address:[0,4,1,""],is_anonymous:[0,4,1,""],is_anonymous_proxy:[0,4,1,""],is_anonymous_vpn:[0,4,1,""],is_hosting_provider:[0,4,1,""],is_legitimate_proxy:[0,4,1,""],is_public_proxy:[0,4,1,""],is_satellite_provider:[0,4,1,""],is_tor_exit_node:[0,4,1,""],isp:[0,4,1,""],network:[0,2,1,"id0"],organization:[0,4,1,""],static_ip_score:[0,4,1,""],user_count:[0,4,1,""],user_type:[0,4,1,""]},"geoip2.webservice":{AsyncClient:[0,1,1,""],Client:[0,1,1,""]},"geoip2.webservice.AsyncClient":{city:[0,2,1,""],close:[0,2,1,""],country:[0,2,1,""],insights:[0,2,1,""]},"geoip2.webservice.Client":{city:[0,2,1,""],close:[0,2,1,""],country:[0,2,1,""],insights:[0,2,1,""]},geoip2:{database:[0,0,0,"-"],errors:[0,0,0,"-"],models:[0,0,0,"-"],records:[0,0,0,"-"],webservice:[0,0,0,"-"]}},objnames:{"0":["py","module","Python
 module"],"1":["py","class","Python class"],"2":["py","method","Python 
method"],"3":["py","exception","Python 
exception"],"4":["py","attribute","Python 
attribute"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:exception","4":"py:attribute"},terms:{"4xx":0,"5xx":0,"\u7f8e\u56fd":0,"abstract":0,"case":0,"class":0,"default":0,"final":0,"float":0,"import":0,"int":0,"long":0,"public":0,"static":0,"throw":0,"true":0,"while":0,For:0,IPs:0,The:0,There:0,These:0,Use:0,abl:0,about:0,abov:0,accent:0,accept:0,access:0,account:0,account_id:0,accuraci:0,accuracy_radiu:0,across:0,add:0,added:0,addit:0,address:0,addressnotfounderror:0,adword:0,after:0,against:0,all:0,alpha:0,also:0,altern:0,alwai:0,america:0,ani:0,anonproxi:0,anonymous_ip:0,anonymousip:0,anoth:0,apach:0,appropri:0,approxim:0,argument:0,around:0,ascii:0,assign:0,assist:0,associ:0,asynccli:0,attribut:0,authent:0,authenticationerror:0,automat:0,autonom:0,autonomous_system_numb:0,autonomous_system_organ:0,avail:0,averag:0,average_incom:0,await:0,base:0,basic:0,becaus:0,becom:0,behind:0,believ:0,belong:0,besid:0,between:0,block:0,bodi:0,bool:0,both:0,brazilian:0,bug:0,busi:0,cabl:0,cafe:0,call:0,can:0,carrier:0,cellular:0,center:0,chang:0,charact:0,check:0,chines:0,circl:0,close:0,code:0,collect:0,colleg:0,com:0,confid:0,connection_typ:0,connectiontyp:0,constructor:0,contact:0,contain:0,content_delivery_network:0,contin:0,copyright:0,corpor:0,correct:0,correspond:0,corrupt:0,could:0,count:0,countri:0,coverag:0,creat:0,creation:0,current:0,custom:0,decid:0,deprec:0,descriptor:0,detail:0,dev:0,devic:0,dialup:0,dict:0,differ:0,directori:0,discourag:0,distribut:0,doc:0,document:0,doe:0,doing:0,dollar:0,download:0,dsl:0,due:0,dure:0,dynam:0,each:0,easy_instal:0,edit:0,edu:0,either:0,element:0,empti:0,end:0,endpoint:0,england:0,english:0,ensur:0,entir:0,entiti:0,estim:0,etc:0,european:0,even:0,event:0,everi:0,exist:0,exit:0,expand:0,expens:0,explicit:0,explicitli:0,extend:0,extern:0,factor:0,fail:0,fals:0,faq:0,featur:0,few:0,field:0,file:0,fileish:0,filenotfounderror:0,find:0,first:0,flag:0,follow:0,foo:0,format:0,found:0,free:0,french:0,from:0,fund:0,further:0,futur:0,gener:0,geograph:0,geoip2error:0,geoip:0,geolite2:0,geoname_id:0,german:0,get:0,github:0,given:0,googl:0,govern:0,greater:0,has:0,have:0,help:0,higher:0,host:0,hostnam:0,hour:0,household:0,how:0,http:0,http_statu:0,httperror:0,iana:0,identifi:0,imprecis:0,inc:0,includ:0,incom:0,incorpor:0,incorrect:0,incorrectli:0,increas:0,index:0,individu:0,inform:0,inher:0,insight:0,instanc:0,instead:0,instruct:0,integ:0,intern:0,internet:0,invalid:0,invaliddatabaseerror:0,invalidrequesterror:0,ip_address:0,ipaddress:0,ipv4:0,ipv4address:0,ipv4network:0,ipv6:0,ipv6address:0,ipv6network:0,is_anonym:0,is_anonymous_proxi:0,is_anonymous_vpn:0,is_hosting_provid:0,is_in_european_union:0,is_legitimate_proxi:0,is_public_proxi:0,is_satellite_provid:0,is_tor_exit_nod:0,iso:0,iso_cod:0,issu:0,its:0,itself:0,japanes:0,keyword:0,kilomet:0,kingdom:0,largest:0,latitud:0,least:0,legitim:0,level:0,libmaxminddb:0,librari:0,licens:0,license_kei:0,lifetim:0,like:0,link:0,list:0,local:0,locat:0,longitud:0,look:0,lookup:0,loop:0,ltd:0,made:0,mai:0,maintain:0,make:0,mani:0,map:0,maxminddb:0,mean:0,member:0,messag:0,metadata:0,method:0,metro:0,metro_cod:0,militari:0,minneapoli:0,minnesota:0,mistak:0,mmdb:0,mobil:0,mode:0,more:0,most:0,most_specif:0,move:0,multipl:0,must:0,my_license_kei:0,name:0,nat:0,need:0,network:0,new_york:0,node:0,non:0,none:0,north:0,note:0,now:0,number:0,object:0,occur:0,oceania:0,offer:0,often:0,older:0,onc:0,one:0,onli:0,open:0,option:0,order:0,org:0,organ:0,other:0,our:0,out:0,outofquerieserror:0,output:0,over:0,oversea:0,own:0,oxford:0,oxfordshir:0,packag:0,page:0,pai:0,paid:0,paramet:0,part:0,particular:0,pass:0,past:0,path:0,per:0,perform:0,permiss:0,permissionrequirederror:0,piec:0,pip:0,place:0,placerecord:0,pleas:0,point:0,popul:0,population_dens:0,portion:0,portugues:0,possibl:0,postal:0,precis:0,prefix_len:0,premium:0,present:0,properti:0,provid:0,proxi:0,pty:0,queri:0,queries_remain:0,radiu:0,rais:0,rang:0,raw:0,raw_respons:0,read:0,readabl:0,recommend:0,region:0,regist:0,registered_countri:0,relat:0,releas:0,relev:0,remain:0,replac:0,repres:0,represented_countri:0,representedcountri:0,request:0,resid:0,residenti:0,respons:0,result:0,reus:0,routabl:0,router:0,run:0,runtimeerror:0,russian:0,same:0,satellit:0,school:0,search:0,search_engine_spid:0,second:0,secont:0,see:0,semant:0,serv:0,session:0,set:0,share:0,should:0,signific:0,similar:0,simplemodel:0,simplifi:0,sinc:0,site:0,smallest:0,some:0,someth:0,sort:0,sourc:0,spanish:0,specif:0,specifi:0,spell:0,squar:0,state:0,static_ip_scor:0,statu:0,still:0,str:0,string:0,strongli:0,subclass:0,subdivis:0,submit:0,subnet:0,succe:0,suffici:0,sure:0,synchron:0,system:0,take:0,telstra:0,than:0,thei:0,them:0,thi:0,thing:0,thirti:0,three:0,thrown:0,time:0,time_zon:0,timeout:0,tor:0,tracker:0,trait:0,transport:0,travel:0,tupl:0,turn:0,two:0,typic:0,umn:0,unanticip:0,under:0,underli:0,unicod:0,union:0,uniqu:0,unit:0,unpopul:0,uri:0,used:0,useful:0,user:0,user_count:0,user_typ:0,uses:0,using:0,valid:0,valueerror:0,vari:0,variabl:0,veri:0,view:0,vpn:0,wait:0,want:0,were:0,when:0,where:0,whether:0,which:0,wish:0,within:0,word:0,work:0,world:0,would:0,www:0,you:0,your:0,zone:0},titles:["MaxMind
 GeoIP2 Python 
API"],titleterms:{"return":0,anonym:0,api:0,asn:0,async:0,citi:0,client:0,connect:0,data:0,databas:0,descript:0,dictionari:0,domain:0,enterpris:0,error:0,exampl:0,except:0,extens:0,geoip2:0,geoloc:0,geonam:0,indic:0,instal:0,integr:0,isp:0,kei:0,maxmind:0,model:0,modul:0,problem:0,python:0,reader:0,record:0,report:0,requir:0,servic:0,ssl:0,support:0,sync:0,tabl:0,type:0,usag:0,use:0,valu:0,version:0,web:0,webservic:0,what:0}})
\ No newline at end of file
+Search.setIndex({docnames:["index"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,"sphinx.ext.intersphinx":1,sphinx:56},filenames:["index.rst"],objects:{"":{geoip2:[0,0,0,"-"]},"geoip2.database":{Reader:[0,1,1,""]},"geoip2.database.Reader":{anonymous_ip:[0,2,1,""],asn:[0,2,1,""],city:[0,2,1,""],close:[0,2,1,""],connection_type:[0,2,1,""],country:[0,2,1,""],domain:[0,2,1,""],enterprise:[0,2,1,""],isp:[0,2,1,""],metadata:[0,2,1,""]},"geoip2.errors":{AddressNotFoundError:[0,3,1,""],AuthenticationError:[0,3,1,""],GeoIP2Error:[0,3,1,""],HTTPError:[0,3,1,""],InvalidRequestError:[0,3,1,""],OutOfQueriesError:[0,3,1,""],PermissionRequiredError:[0,3,1,""]},"geoip2.models":{ASN:[0,1,1,""],AnonymousIP:[0,1,1,""],City:[0,1,1,""],ConnectionType:[0,1,1,""],Country:[0,1,1,""],Domain:[0,1,1,""],Enterprise:[0,1,1,""],ISP:[0,1,1,""],Insights:[0,1,1,""],SimpleModel:[0,1,1,""]},"geoip2.models.ASN":{autonomous_system_number:[0,4,1,""],autonomous_system_organization:[0,4,1,""],ip_address:[0,4,1,""],network:[0,4,1,""]},"geoip2.models.AnonymousIP":{ip_address:[0,4,1,""],is_anonymous:[0,4,1,""],is_anonymous_vpn:[0,4,1,""],is_hosting_provider:[0,4,1,""],is_public_proxy:[0,4,1,""],is_residential_proxy:[0,4,1,""],is_tor_exit_node:[0,4,1,""],network:[0,4,1,""]},"geoip2.models.City":{city:[0,4,1,""],continent:[0,4,1,""],country:[0,4,1,""],location:[0,4,1,""],maxmind:[0,4,1,""],postal:[0,4,1,""],registered_country:[0,4,1,""],represented_country:[0,4,1,""],subdivisions:[0,4,1,""],traits:[0,4,1,""]},"geoip2.models.ConnectionType":{connection_type:[0,4,1,""],ip_address:[0,4,1,""],network:[0,4,1,""]},"geoip2.models.Country":{continent:[0,4,1,""],country:[0,4,1,""],maxmind:[0,4,1,""],registered_country:[0,4,1,""],represented_country:[0,4,1,""],traits:[0,4,1,""]},"geoip2.models.Domain":{domain:[0,4,1,""],ip_address:[0,4,1,""],network:[0,4,1,""]},"geoip2.models.Enterprise":{city:[0,4,1,""],continent:[0,4,1,""],country:[0,4,1,""],location:[0,4,1,""],maxmind:[0,4,1,""],registered_country:[0,4,1,""],represented_country:[0,4,1,""],subdivisions:[0,4,1,""],traits:[0,4,1,""]},"geoip2.models.ISP":{autonomous_system_number:[0,4,1,""],autonomous_system_organization:[0,4,1,""],ip_address:[0,4,1,""],isp:[0,4,1,""],network:[0,4,1,""],organization:[0,4,1,""]},"geoip2.models.Insights":{city:[0,4,1,""],continent:[0,4,1,""],country:[0,4,1,""],location:[0,4,1,""],maxmind:[0,4,1,""],registered_country:[0,4,1,""],represented_country:[0,4,1,""],subdivisions:[0,4,1,""],traits:[0,4,1,""]},"geoip2.models.SimpleModel":{network:[0,2,1,""]},"geoip2.records":{City:[0,1,1,""],Continent:[0,1,1,""],Country:[0,1,1,""],Location:[0,1,1,""],MaxMind:[0,1,1,""],PlaceRecord:[0,1,1,""],Postal:[0,1,1,""],Record:[0,1,1,""],RepresentedCountry:[0,1,1,""],Subdivision:[0,1,1,""],Subdivisions:[0,1,1,""],Traits:[0,1,1,""]},"geoip2.records.City":{confidence:[0,4,1,""],geoname_id:[0,4,1,""],name:[0,4,1,""],names:[0,4,1,""]},"geoip2.records.Continent":{code:[0,4,1,""],geoname_id:[0,4,1,""],name:[0,4,1,""],names:[0,4,1,""]},"geoip2.records.Country":{confidence:[0,4,1,""],geoname_id:[0,4,1,""],is_in_european_union:[0,4,1,""],iso_code:[0,4,1,""],name:[0,4,1,""],names:[0,4,1,""]},"geoip2.records.Location":{accuracy_radius:[0,4,1,""],average_income:[0,4,1,""],latitude:[0,4,1,""],longitude:[0,4,1,""],metro_code:[0,4,1,""],population_density:[0,4,1,""],time_zone:[0,4,1,""]},"geoip2.records.MaxMind":{queries_remaining:[0,4,1,""]},"geoip2.records.PlaceRecord":{name:[0,2,1,""]},"geoip2.records.Postal":{code:[0,4,1,""],confidence:[0,4,1,""]},"geoip2.records.RepresentedCountry":{confidence:[0,4,1,""],geoname_id:[0,4,1,""],is_in_european_union:[0,4,1,""],iso_code:[0,4,1,""],name:[0,4,1,""],names:[0,4,1,""],type:[0,4,1,""]},"geoip2.records.Subdivision":{confidence:[0,4,1,""],geoname_id:[0,4,1,""],iso_code:[0,4,1,""],name:[0,4,1,""],names:[0,4,1,""]},"geoip2.records.Subdivisions":{most_specific:[0,2,1,""]},"geoip2.records.Traits":{autonomous_system_number:[0,4,1,""],autonomous_system_organization:[0,4,1,""],connection_type:[0,4,1,""],domain:[0,4,1,""],ip_address:[0,4,1,""],is_anonymous:[0,4,1,""],is_anonymous_proxy:[0,4,1,""],is_anonymous_vpn:[0,4,1,""],is_hosting_provider:[0,4,1,""],is_legitimate_proxy:[0,4,1,""],is_public_proxy:[0,4,1,""],is_residential_proxy:[0,4,1,""],is_satellite_provider:[0,4,1,""],is_tor_exit_node:[0,4,1,""],isp:[0,4,1,""],network:[0,2,1,"id0"],organization:[0,4,1,""],static_ip_score:[0,4,1,""],user_count:[0,4,1,""],user_type:[0,4,1,""]},"geoip2.webservice":{AsyncClient:[0,1,1,""],Client:[0,1,1,""]},"geoip2.webservice.AsyncClient":{city:[0,2,1,""],close:[0,2,1,""],country:[0,2,1,""],insights:[0,2,1,""]},"geoip2.webservice.Client":{city:[0,2,1,""],close:[0,2,1,""],country:[0,2,1,""],insights:[0,2,1,""]},geoip2:{database:[0,0,0,"-"],errors:[0,0,0,"-"],models:[0,0,0,"-"],records:[0,0,0,"-"],webservice:[0,0,0,"-"]}},objnames:{"0":["py","module","Python
 module"],"1":["py","class","Python class"],"2":["py","method","Python 
method"],"3":["py","exception","Python 
exception"],"4":["py","attribute","Python 
attribute"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:exception","4":"py:attribute"},terms:{"4xx":0,"5xx":0,"\u7f8e\u56fd":0,"abstract":0,"case":0,"class":0,"default":0,"final":0,"float":0,"import":0,"int":0,"long":0,"public":0,"static":0,"throw":0,"true":0,"while":0,For:0,IPs:0,The:0,There:0,These:0,Use:0,abl:0,about:0,abov:0,accent:0,accept:0,access:0,account:0,account_id:0,accuraci:0,accuracy_radiu:0,across:0,add:0,added:0,addit:0,address:0,addressnotfounderror:0,adword:0,after:0,against:0,all:0,alpha:0,also:0,altern:0,alwai:0,america:0,ani:0,anonproxi:0,anonymous_ip:0,anonymousip:0,anoth:0,apach:0,appropri:0,approxim:0,argument:0,around:0,ascii:0,assign:0,assist:0,associ:0,asynccli:0,attribut:0,authent:0,authenticationerror:0,automat:0,autonom:0,autonomous_system_numb:0,autonomous_system_organ:0,avail:0,averag:0,average_incom:0,await:0,base:0,basic:0,becaus:0,becom:0,behind:0,believ:0,belong:0,besid:0,between:0,block:0,bodi:0,bool:0,both:0,brazilian:0,bug:0,busi:0,cabl:0,cafe:0,call:0,can:0,carrier:0,cellular:0,center:0,chang:0,charact:0,check:0,chines:0,circl:0,close:0,code:0,collect:0,colleg:0,com:0,confid:0,connection_typ:0,connectiontyp:0,constructor:0,contact:0,contain:0,content:0,content_delivery_network:0,contin:0,copyright:0,corpor:0,correct:0,correspond:0,corrupt:0,could:0,count:0,countri:0,coverag:0,creat:0,creation:0,current:0,custom:0,decid:0,decod:0,decoded_cont:0,deprec:0,descriptor:0,detail:0,dev:0,devic:0,dialup:0,dict:0,differ:0,directori:0,discourag:0,distribut:0,doc:0,document:0,doe:0,doing:0,dollar:0,download:0,dsl:0,due:0,dure:0,dynam:0,each:0,easy_instal:0,edit:0,edu:0,either:0,element:0,empti:0,end:0,endpoint:0,england:0,english:0,ensur:0,entir:0,entiti:0,estim:0,etc:0,european:0,even:0,event:0,everi:0,exist:0,exit:0,expand:0,expens:0,explicit:0,explicitli:0,extend:0,extern:0,factor:0,fail:0,fals:0,faq:0,featur:0,few:0,field:0,file:0,fileish:0,filenotfounderror:0,find:0,first:0,flag:0,follow:0,foo:0,format:0,found:0,free:0,french:0,from:0,fund:0,further:0,futur:0,gener:0,geograph:0,geoip2error:0,geoip:0,geolite2:0,geoname_id:0,german:0,get:0,github:0,given:0,googl:0,govern:0,greater:0,has:0,have:0,help:0,higher:0,host:0,hostnam:0,hour:0,household:0,how:0,http:0,http_statu:0,httperror:0,iana:0,identifi:0,imprecis:0,inc:0,includ:0,incom:0,incorpor:0,incorrect:0,incorrectli:0,increas:0,index:0,individu:0,inform:0,inher:0,insight:0,instanc:0,instead:0,instruct:0,integ:0,intern:0,internet:0,invalid:0,invaliddatabaseerror:0,invalidrequesterror:0,ip_address:0,ipaddress:0,ipv4:0,ipv4address:0,ipv4network:0,ipv6:0,ipv6address:0,ipv6network:0,is_anonym:0,is_anonymous_proxi:0,is_anonymous_vpn:0,is_hosting_provid:0,is_in_european_union:0,is_legitimate_proxi:0,is_public_proxi:0,is_residential_proxi:0,is_satellite_provid:0,is_tor_exit_nod:0,iso:0,iso_cod:0,issu:0,its:0,itself:0,japanes:0,keyword:0,kilomet:0,kingdom:0,largest:0,latitud:0,least:0,legitim:0,level:0,libmaxminddb:0,librari:0,licens:0,license_kei:0,lifetim:0,like:0,link:0,list:0,local:0,locat:0,longitud:0,look:0,lookup:0,loop:0,ltd:0,made:0,mai:0,maintain:0,make:0,mani:0,map:0,maxminddb:0,mean:0,member:0,messag:0,metadata:0,method:0,metro:0,metro_cod:0,militari:0,minneapoli:0,minnesota:0,mistak:0,mmdb:0,mobil:0,mode:0,more:0,most:0,most_specif:0,move:0,multipl:0,must:0,my_license_kei:0,name:0,nat:0,need:0,network:0,new_york:0,node:0,non:0,none:0,north:0,note:0,now:0,number:0,object:0,occur:0,oceania:0,offer:0,often:0,older:0,onc:0,one:0,onli:0,open:0,option:0,order:0,org:0,organ:0,other:0,our:0,out:0,outofquerieserror:0,output:0,over:0,oversea:0,own:0,oxford:0,oxfordshir:0,packag:0,page:0,pai:0,paid:0,paramet:0,part:0,particular:0,pass:0,past:0,path:0,per:0,perform:0,permiss:0,permissionrequirederror:0,piec:0,pip:0,place:0,placerecord:0,pleas:0,point:0,popul:0,population_dens:0,portion:0,portugues:0,possibl:0,postal:0,precis:0,prefix_len:0,premium:0,present:0,properti:0,provid:0,proxi:0,pty:0,queri:0,queries_remain:0,radiu:0,rais:0,rang:0,raw:0,raw_respons:0,read:0,readabl:0,recommend:0,region:0,regist:0,registered_countri:0,relat:0,releas:0,relev:0,remain:0,replac:0,repres:0,represented_countri:0,representedcountri:0,request:0,resid:0,residenti:0,respons:0,result:0,reus:0,routabl:0,router:0,run:0,runtimeerror:0,russian:0,same:0,satellit:0,school:0,search:0,search_engine_spid:0,second:0,secont:0,see:0,semant:0,serv:0,session:0,set:0,share:0,should:0,signific:0,similar:0,simplemodel:0,simplifi:0,sinc:0,site:0,smallest:0,some:0,someth:0,sort:0,sourc:0,spanish:0,specif:0,specifi:0,spell:0,squar:0,state:0,static_ip_scor:0,statu:0,still:0,str:0,string:0,strongli:0,subclass:0,subdivis:0,submit:0,subnet:0,succe:0,suffici:0,sure:0,suspect:0,synchron:0,system:0,take:0,telstra:0,than:0,thei:0,them:0,thi:0,thing:0,thirti:0,three:0,thrown:0,time:0,time_zon:0,timeout:0,tor:0,tracker:0,trait:0,transport:0,travel:0,tupl:0,turn:0,two:0,typic:0,umn:0,unanticip:0,under:0,underli:0,unicod:0,union:0,uniqu:0,unit:0,unpopul:0,uri:0,used:0,useful:0,user:0,user_count:0,user_typ:0,uses:0,using:0,valid:0,valueerror:0,vari:0,variabl:0,veri:0,view:0,vpn:0,wait:0,want:0,were:0,when:0,where:0,whether:0,which:0,wish:0,within:0,word:0,work:0,world:0,would:0,www:0,you:0,your:0,zone:0},titles:["MaxMind
 GeoIP2 Python 
API"],titleterms:{"return":0,anonym:0,api:0,asn:0,async:0,citi:0,client:0,connect:0,data:0,databas:0,descript:0,dictionari:0,domain:0,enterpris:0,error:0,exampl:0,except:0,extens:0,geoip2:0,geoloc:0,geonam:0,indic:0,instal:0,integr:0,isp:0,kei:0,maxmind:0,model:0,modul:0,problem:0,python:0,reader:0,record:0,report:0,requir:0,servic:0,ssl:0,support:0,sync:0,tabl:0,type:0,usag:0,use:0,valu:0,version:0,web:0,webservic:0,what:0}})
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/geoip2-4.0.2/geoip2/__init__.py 
new/geoip2-4.1.0/geoip2/__init__.py
--- old/geoip2-4.0.2/geoip2/__init__.py 2020-07-28 19:38:52.000000000 +0200
+++ new/geoip2-4.1.0/geoip2/__init__.py 2020-09-25 17:56:29.000000000 +0200
@@ -1,7 +1,7 @@
 # pylint:disable=C0111
 
 __title__ = "geoip2"
-__version__ = "4.0.2"
+__version__ = "4.1.0"
 __author__ = "Gregory Oschwald"
 __license__ = "Apache License, Version 2.0"
 __copyright__ = "Copyright (c) 2013-2020 Maxmind, Inc."
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/geoip2-4.0.2/geoip2/database.py 
new/geoip2-4.1.0/geoip2/database.py
--- old/geoip2-4.0.2/geoip2/database.py 2020-07-15 00:38:33.000000000 +0200
+++ new/geoip2-4.1.0/geoip2/database.py 2020-09-10 00:31:26.000000000 +0200
@@ -56,8 +56,7 @@
     ``geoip2.errors.AddressNotFoundError`` exception will be thrown. If the
     database is corrupt or invalid, a ``maxminddb.InvalidDatabaseError`` will
     be thrown.
-
-"""
+    """
 
     def __init__(
         self, fileish: str, locales: Optional[List[str]] = None, mode: int = 
MODE_AUTO
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/geoip2-4.0.2/geoip2/errors.py 
new/geoip2-4.1.0/geoip2/errors.py
--- old/geoip2-4.0.2/geoip2/errors.py   2020-07-14 23:41:43.000000000 +0200
+++ new/geoip2-4.1.0/geoip2/errors.py   2020-09-25 17:55:47.000000000 +0200
@@ -32,15 +32,21 @@
 
     :ivar http_status: The HTTP status code returned
     :ivar uri: The URI queried
+    :ivar decoded_content: The decoded response content
 
     """
 
     def __init__(
-        self, message: str, http_status: Optional[int] = None, uri: 
Optional[str] = None
+        self,
+        message: str,
+        http_status: Optional[int] = None,
+        uri: Optional[str] = None,
+        decoded_content: Optional[str] = None,
     ) -> None:
         super().__init__(message)
         self.http_status = http_status
         self.uri = uri
+        self.decoded_content = decoded_content
 
 
 class InvalidRequestError(GeoIP2Error):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/geoip2-4.0.2/geoip2/models.py 
new/geoip2-4.1.0/geoip2/models.py
--- old/geoip2-4.0.2/geoip2/models.py   2020-07-16 17:19:03.000000000 +0200
+++ new/geoip2-4.1.0/geoip2/models.py   2020-09-25 17:00:20.000000000 +0200
@@ -396,6 +396,13 @@
 
       :type: bool
 
+    .. attribute:: is_residential_proxy
+
+      This is true if the IP address is on a suspected anonymizing network
+      and belongs to a residential ISP.
+
+      :type: bool
+
     .. attribute:: is_tor_exit_node
 
       This is true if the IP address is a Tor exit node.
@@ -421,6 +428,7 @@
     is_anonymous_vpn: bool
     is_hosting_provider: bool
     is_public_proxy: bool
+    is_residential_proxy: bool
     is_tor_exit_node: bool
 
     def __init__(self, raw: Dict[str, bool]) -> None:
@@ -429,6 +437,7 @@
         self.is_anonymous_vpn = raw.get("is_anonymous_vpn", False)
         self.is_hosting_provider = raw.get("is_hosting_provider", False)
         self.is_public_proxy = raw.get("is_public_proxy", False)
+        self.is_residential_proxy = raw.get("is_residential_proxy", False)
         self.is_tor_exit_node = raw.get("is_tor_exit_node", False)
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/geoip2-4.0.2/geoip2/records.py 
new/geoip2-4.1.0/geoip2/records.py
--- old/geoip2-4.0.2/geoip2/records.py  2020-07-16 17:19:03.000000000 +0200
+++ new/geoip2-4.1.0/geoip2/records.py  2020-09-25 17:00:20.000000000 +0200
@@ -693,6 +693,15 @@
 
       :type: bool
 
+    .. attribute:: is_residential_proxy
+
+      This is true if the IP address is on a suspected anonymizing network
+      and belongs to a residential ISP. This attribute is only available from
+      GeoIP2 Precision Insights.
+
+      :type: bool
+
+
     .. attribute:: is_satellite_provider
 
       This is true if the IP address is from a satellite provider that
@@ -798,6 +807,7 @@
     is_hosting_provider: bool
     is_legitimate_proxy: bool
     is_public_proxy: bool
+    is_residential_proxy: bool
     is_satellite_provider: bool
     is_tor_exit_node: bool
     isp: Optional[str]
@@ -821,6 +831,7 @@
         is_hosting_provider: bool = False,
         is_legitimate_proxy: bool = False,
         is_public_proxy: bool = False,
+        is_residential_proxy: bool = False,
         is_satellite_provider: bool = False,
         is_tor_exit_node: bool = False,
         isp: Optional[str] = None,
@@ -843,6 +854,7 @@
         self.is_hosting_provider = is_hosting_provider
         self.is_legitimate_proxy = is_legitimate_proxy
         self.is_public_proxy = is_public_proxy
+        self.is_residential_proxy = is_residential_proxy
         self.is_satellite_provider = is_satellite_provider
         self.is_tor_exit_node = is_tor_exit_node
         self.isp = isp
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/geoip2-4.0.2/geoip2/webservice.py 
new/geoip2-4.1.0/geoip2/webservice.py
--- old/geoip2-4.0.2/geoip2/webservice.py       2020-07-21 18:41:13.000000000 
+0200
+++ new/geoip2-4.1.0/geoip2/webservice.py       2020-09-25 17:55:47.000000000 
+0200
@@ -104,7 +104,7 @@
                 "JSON: " % locals() + ", ".join(ex.args),
                 200,
                 uri,
-            )
+            ) from ex
 
     def _exception_for_error(
         self, status: int, content_type: str, body: str, uri: str
@@ -112,8 +112,8 @@
         if 400 <= status < 500:
             return self._exception_for_4xx_status(status, content_type, body, 
uri)
         if 500 <= status < 600:
-            return self._exception_for_5xx_status(status, uri)
-        return self._exception_for_non_200_status(status, uri)
+            return self._exception_for_5xx_status(status, uri, body)
+        return self._exception_for_non_200_status(status, uri, body)
 
     def _exception_for_4xx_status(
         self, status: int, content_type: str, body: str, uri: str
@@ -123,6 +123,7 @@
                 "Received a %(status)i error for %(uri)s " "with no body." % 
locals(),
                 status,
                 uri,
+                body,
             )
         if content_type.find("json") == -1:
             return HTTPError(
@@ -130,6 +131,7 @@
                 "body: %s" % (status, uri, str(content_type)),
                 status,
                 uri,
+                body,
             )
         try:
             decoded_body = json.loads(body)
@@ -139,9 +141,10 @@
                 " not include the expected JSON body: " % locals() + ", 
".join(ex.args),
                 status,
                 uri,
+                body,
             )
         else:
-            if "code" in body and "error" in body:
+            if "code" in decoded_body and "error" in decoded_body:
                 return self._exception_for_web_service_error(
                     decoded_body.get("error"), decoded_body.get("code"), 
status, uri
                 )
@@ -149,6 +152,7 @@
                 "Response contains JSON but it does not specify " "code or 
error keys",
                 status,
                 uri,
+                body,
             )
 
     @staticmethod
@@ -180,20 +184,26 @@
         return InvalidRequestError(message, code, status, uri)
 
     @staticmethod
-    def _exception_for_5xx_status(status: int, uri: str) -> HTTPError:
+    def _exception_for_5xx_status(
+        status: int, uri: str, body: Optional[str]
+    ) -> HTTPError:
         return HTTPError(
             "Received a server error (%(status)i) for " "%(uri)s" % locals(),
             status,
             uri,
+            body,
         )
 
     @staticmethod
-    def _exception_for_non_200_status(status: int, uri: str) -> HTTPError:
+    def _exception_for_non_200_status(
+        status: int, uri: str, body: Optional[str]
+    ) -> HTTPError:
         return HTTPError(
             "Received a very surprising HTTP status "
             "(%(status)i) for %(uri)s" % locals(),
             status,
             uri,
+            body,
         )
 
 
@@ -254,7 +264,11 @@
         timeout: float = 60,
     ) -> None:
         super().__init__(
-            account_id, license_key, host, locales, timeout,
+            account_id,
+            license_key,
+            host,
+            locales,
+            timeout,
         )
 
     async def city(self, ip_address: IPAddress = "me") -> City:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/geoip2-4.0.2/geoip2.egg-info/PKG-INFO 
new/geoip2-4.1.0/geoip2.egg-info/PKG-INFO
--- old/geoip2-4.0.2/geoip2.egg-info/PKG-INFO   2020-07-28 19:39:05.000000000 
+0200
+++ new/geoip2-4.1.0/geoip2.egg-info/PKG-INFO   2020-09-25 17:56:48.000000000 
+0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.2
 Name: geoip2
-Version: 4.0.2
+Version: 4.1.0
 Summary: MaxMind GeoIP2 API
 Home-page: http://www.maxmind.com/
 Author: Gregory Oschwald
@@ -237,6 +237,8 @@
             False
             >>>     response.is_public_proxy
             False
+            >>>     response.is_residential_proxy
+            False
             >>>     response.is_tor_exit_node
             True
             >>>     response.ip_address
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/geoip2-4.0.2/geoip2.egg-info/SOURCES.txt 
new/geoip2-4.1.0/geoip2.egg-info/SOURCES.txt
--- old/geoip2-4.0.2/geoip2.egg-info/SOURCES.txt        2020-07-28 
19:39:05.000000000 +0200
+++ new/geoip2-4.1.0/geoip2.egg-info/SOURCES.txt        2020-09-25 
17:56:48.000000000 +0200
@@ -57,6 +57,7 @@
 tests/data/test-data/GeoIP2-Enterprise-Test.mmdb
 tests/data/test-data/GeoIP2-ISP-Test.mmdb
 tests/data/test-data/GeoIP2-Precision-Enterprise-Test.mmdb
+tests/data/test-data/GeoIP2-Static-IP-Score-Test.mmdb
 tests/data/test-data/GeoIP2-User-Count-Test.mmdb
 tests/data/test-data/GeoLite2-ASN-Test.mmdb
 tests/data/test-data/MaxMind-DB-no-ipv4-search-tree.mmdb
@@ -74,4 +75,5 @@
 tests/data/test-data/MaxMind-DB-test-mixed-24.mmdb
 tests/data/test-data/MaxMind-DB-test-mixed-28.mmdb
 tests/data/test-data/MaxMind-DB-test-mixed-32.mmdb
-tests/data/test-data/MaxMind-DB-test-nested.mmdb
\ No newline at end of file
+tests/data/test-data/MaxMind-DB-test-nested.mmdb
+tests/data/test-data/MaxMind-DB-test-pointer-decoder.mmdb
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/geoip2-4.0.2/setup.py new/geoip2-4.1.0/setup.py
--- old/geoip2-4.0.2/setup.py   2020-07-28 19:27:21.000000000 +0200
+++ new/geoip2-4.1.0/setup.py   2020-09-25 17:00:20.000000000 +0200
@@ -26,7 +26,7 @@
     include_package_data=True,
     python_requires=">=3.6",
     install_requires=requirements,
-    tests_require=["mocket>=3.8.6"],
+    tests_require=["mocket>=3.8.9"],
     test_suite="tests",
     license=geoip2.__license__,
     classifiers=[
Binary files 
old/geoip2-4.0.2/tests/data/test-data/GeoIP2-Anonymous-IP-Test.mmdb and 
new/geoip2-4.1.0/tests/data/test-data/GeoIP2-Anonymous-IP-Test.mmdb differ
Binary files 
old/geoip2-4.0.2/tests/data/test-data/GeoIP2-City-Test-Broken-Double-Format.mmdb
 and 
new/geoip2-4.1.0/tests/data/test-data/GeoIP2-City-Test-Broken-Double-Format.mmdb
 differ
Binary files 
old/geoip2-4.0.2/tests/data/test-data/GeoIP2-City-Test-Invalid-Node-Count.mmdb 
and 
new/geoip2-4.1.0/tests/data/test-data/GeoIP2-City-Test-Invalid-Node-Count.mmdb 
differ
Binary files old/geoip2-4.0.2/tests/data/test-data/GeoIP2-City-Test.mmdb and 
new/geoip2-4.1.0/tests/data/test-data/GeoIP2-City-Test.mmdb differ
Binary files 
old/geoip2-4.0.2/tests/data/test-data/GeoIP2-Connection-Type-Test.mmdb and 
new/geoip2-4.1.0/tests/data/test-data/GeoIP2-Connection-Type-Test.mmdb differ
Binary files old/geoip2-4.0.2/tests/data/test-data/GeoIP2-Country-Test.mmdb and 
new/geoip2-4.1.0/tests/data/test-data/GeoIP2-Country-Test.mmdb differ
Binary files 
old/geoip2-4.0.2/tests/data/test-data/GeoIP2-DensityIncome-Test.mmdb and 
new/geoip2-4.1.0/tests/data/test-data/GeoIP2-DensityIncome-Test.mmdb differ
Binary files old/geoip2-4.0.2/tests/data/test-data/GeoIP2-Domain-Test.mmdb and 
new/geoip2-4.1.0/tests/data/test-data/GeoIP2-Domain-Test.mmdb differ
Binary files old/geoip2-4.0.2/tests/data/test-data/GeoIP2-Enterprise-Test.mmdb 
and new/geoip2-4.1.0/tests/data/test-data/GeoIP2-Enterprise-Test.mmdb differ
Binary files old/geoip2-4.0.2/tests/data/test-data/GeoIP2-ISP-Test.mmdb and 
new/geoip2-4.1.0/tests/data/test-data/GeoIP2-ISP-Test.mmdb differ
Binary files 
old/geoip2-4.0.2/tests/data/test-data/GeoIP2-Precision-Enterprise-Test.mmdb and 
new/geoip2-4.1.0/tests/data/test-data/GeoIP2-Precision-Enterprise-Test.mmdb 
differ
Binary files 
old/geoip2-4.0.2/tests/data/test-data/GeoIP2-Static-IP-Score-Test.mmdb and 
new/geoip2-4.1.0/tests/data/test-data/GeoIP2-Static-IP-Score-Test.mmdb differ
Binary files old/geoip2-4.0.2/tests/data/test-data/GeoIP2-User-Count-Test.mmdb 
and new/geoip2-4.1.0/tests/data/test-data/GeoIP2-User-Count-Test.mmdb differ
Binary files old/geoip2-4.0.2/tests/data/test-data/GeoLite2-ASN-Test.mmdb and 
new/geoip2-4.1.0/tests/data/test-data/GeoLite2-ASN-Test.mmdb differ
Binary files 
old/geoip2-4.0.2/tests/data/test-data/MaxMind-DB-no-ipv4-search-tree.mmdb and 
new/geoip2-4.1.0/tests/data/test-data/MaxMind-DB-no-ipv4-search-tree.mmdb differ
Binary files 
old/geoip2-4.0.2/tests/data/test-data/MaxMind-DB-string-value-entries.mmdb and 
new/geoip2-4.1.0/tests/data/test-data/MaxMind-DB-string-value-entries.mmdb 
differ
Binary files 
old/geoip2-4.0.2/tests/data/test-data/MaxMind-DB-test-broken-pointers-24.mmdb 
and 
new/geoip2-4.1.0/tests/data/test-data/MaxMind-DB-test-broken-pointers-24.mmdb 
differ
Binary files 
old/geoip2-4.0.2/tests/data/test-data/MaxMind-DB-test-broken-search-tree-24.mmdb
 and 
new/geoip2-4.1.0/tests/data/test-data/MaxMind-DB-test-broken-search-tree-24.mmdb
 differ
Binary files old/geoip2-4.0.2/tests/data/test-data/MaxMind-DB-test-decoder.mmdb 
and new/geoip2-4.1.0/tests/data/test-data/MaxMind-DB-test-decoder.mmdb differ
Binary files old/geoip2-4.0.2/tests/data/test-data/MaxMind-DB-test-ipv4-24.mmdb 
and new/geoip2-4.1.0/tests/data/test-data/MaxMind-DB-test-ipv4-24.mmdb differ
Binary files old/geoip2-4.0.2/tests/data/test-data/MaxMind-DB-test-ipv4-28.mmdb 
and new/geoip2-4.1.0/tests/data/test-data/MaxMind-DB-test-ipv4-28.mmdb differ
Binary files old/geoip2-4.0.2/tests/data/test-data/MaxMind-DB-test-ipv4-32.mmdb 
and new/geoip2-4.1.0/tests/data/test-data/MaxMind-DB-test-ipv4-32.mmdb differ
Binary files old/geoip2-4.0.2/tests/data/test-data/MaxMind-DB-test-ipv6-24.mmdb 
and new/geoip2-4.1.0/tests/data/test-data/MaxMind-DB-test-ipv6-24.mmdb differ
Binary files old/geoip2-4.0.2/tests/data/test-data/MaxMind-DB-test-ipv6-28.mmdb 
and new/geoip2-4.1.0/tests/data/test-data/MaxMind-DB-test-ipv6-28.mmdb differ
Binary files old/geoip2-4.0.2/tests/data/test-data/MaxMind-DB-test-ipv6-32.mmdb 
and new/geoip2-4.1.0/tests/data/test-data/MaxMind-DB-test-ipv6-32.mmdb differ
Binary files 
old/geoip2-4.0.2/tests/data/test-data/MaxMind-DB-test-metadata-pointers.mmdb 
and 
new/geoip2-4.1.0/tests/data/test-data/MaxMind-DB-test-metadata-pointers.mmdb 
differ
Binary files 
old/geoip2-4.0.2/tests/data/test-data/MaxMind-DB-test-mixed-24.mmdb and 
new/geoip2-4.1.0/tests/data/test-data/MaxMind-DB-test-mixed-24.mmdb differ
Binary files 
old/geoip2-4.0.2/tests/data/test-data/MaxMind-DB-test-mixed-28.mmdb and 
new/geoip2-4.1.0/tests/data/test-data/MaxMind-DB-test-mixed-28.mmdb differ
Binary files 
old/geoip2-4.0.2/tests/data/test-data/MaxMind-DB-test-mixed-32.mmdb and 
new/geoip2-4.1.0/tests/data/test-data/MaxMind-DB-test-mixed-32.mmdb differ
Binary files old/geoip2-4.0.2/tests/data/test-data/MaxMind-DB-test-nested.mmdb 
and new/geoip2-4.1.0/tests/data/test-data/MaxMind-DB-test-nested.mmdb differ
Binary files 
old/geoip2-4.0.2/tests/data/test-data/MaxMind-DB-test-pointer-decoder.mmdb and 
new/geoip2-4.1.0/tests/data/test-data/MaxMind-DB-test-pointer-decoder.mmdb 
differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/geoip2-4.0.2/tests/database_test.py 
new/geoip2-4.1.0/tests/database_test.py
--- old/geoip2-4.0.2/tests/database_test.py     2020-07-14 23:41:43.000000000 
+0200
+++ new/geoip2-4.1.0/tests/database_test.py     2020-09-25 17:00:20.000000000 
+0200
@@ -66,11 +66,29 @@
         self.assertEqual(record.is_anonymous_vpn, True)
         self.assertEqual(record.is_hosting_provider, False)
         self.assertEqual(record.is_public_proxy, False)
+        self.assertEqual(record.is_residential_proxy, False)
         self.assertEqual(record.is_tor_exit_node, False)
         self.assertEqual(record.ip_address, ip_address)
         self.assertEqual(record.network, ipaddress.ip_network("1.2.0.0/16"))
         reader.close()
 
+    def test_anonymous_ip_all_set(self) -> None:
+        reader = geoip2.database.Reader(
+            "tests/data/test-data/GeoIP2-Anonymous-IP-Test.mmdb"
+        )
+        ip_address = "81.2.69.1"
+
+        record = reader.anonymous_ip(ip_address)
+        self.assertEqual(record.is_anonymous, True)
+        self.assertEqual(record.is_anonymous_vpn, True)
+        self.assertEqual(record.is_hosting_provider, True)
+        self.assertEqual(record.is_public_proxy, True)
+        self.assertEqual(record.is_residential_proxy, True)
+        self.assertEqual(record.is_tor_exit_node, True)
+        self.assertEqual(record.ip_address, ip_address)
+        self.assertEqual(record.network, ipaddress.ip_network("81.2.69.0/24"))
+        reader.close()
+
     def test_asn(self) -> None:
         reader = 
geoip2.database.Reader("tests/data/test-data/GeoLite2-ASN-Test.mmdb")
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/geoip2-4.0.2/tests/models_test.py 
new/geoip2-4.1.0/tests/models_test.py
--- old/geoip2-4.0.2/tests/models_test.py       2020-07-14 23:41:43.000000000 
+0200
+++ new/geoip2-4.1.0/tests/models_test.py       2020-09-25 17:00:20.000000000 
+0200
@@ -40,7 +40,10 @@
                 "population_density": 1341,
                 "time_zone": "America/Chicago",
             },
-            "postal": {"code": "55401", "confidence": 33,},
+            "postal": {
+                "code": "55401",
+                "confidence": 33,
+            },
             "subdivisions": [
                 {
                     "confidence": 88,
@@ -48,7 +51,11 @@
                     "iso_code": "MN",
                     "names": {"en": "Minnesota"},
                 },
-                {"geoname_id": 123, "iso_code": "HP", "names": {"en": 
"Hennepin"},},
+                {
+                    "geoname_id": 123,
+                    "iso_code": "HP",
+                    "names": {"en": "Hennepin"},
+                },
             ],
             "registered_country": {
                 "geoname_id": 2,
@@ -72,6 +79,7 @@
                 "is_anonymous_vpn": True,
                 "is_hosting_provider": True,
                 "is_public_proxy": True,
+                "is_residential_proxy": True,
                 "is_satellite_provider": True,
                 "is_tor_exit_node": True,
                 "isp": "Comcast",
@@ -187,6 +195,7 @@
         self.assertIs(model.traits.is_anonymous_vpn, True)
         self.assertIs(model.traits.is_hosting_provider, True)
         self.assertIs(model.traits.is_public_proxy, True)
+        self.assertIs(model.traits.is_residential_proxy, True)
         self.assertIs(model.traits.is_satellite_provider, True)
         self.assertIs(model.traits.is_tor_exit_node, True)
         self.assertEqual(model.traits.user_count, 2)
@@ -248,7 +257,10 @@
                 "iso_code": "CA",
                 "names": {"en": "Canada"},
             },
-            "traits": {"ip_address": "1.2.3.4", "is_satellite_provider": 
True,},
+            "traits": {
+                "ip_address": "1.2.3.4",
+                "is_satellite_provider": True,
+            },
         }
         model = geoip2.models.City(raw)
         self.assertEqual(type(model), geoip2.models.City, "geoip2.models.City 
object")
@@ -331,13 +343,36 @@
         model = geoip2.models.City(
             {
                 "city": {"invalid": 0},
-                "continent": {"invalid": 0, "names": {"invalid": 0},},
-                "country": {"invalid": 0, "names": {"invalid": 0},},
+                "continent": {
+                    "invalid": 0,
+                    "names": {"invalid": 0},
+                },
+                "country": {
+                    "invalid": 0,
+                    "names": {"invalid": 0},
+                },
                 "location": {"invalid": 0},
                 "postal": {"invalid": 0},
-                "subdivisions": [{"invalid": 0, "names": {"invalid": 0,},},],
-                "registered_country": {"invalid": 0, "names": {"invalid": 
0,},},
-                "represented_country": {"invalid": 0, "names": {"invalid": 
0,},},
+                "subdivisions": [
+                    {
+                        "invalid": 0,
+                        "names": {
+                            "invalid": 0,
+                        },
+                    },
+                ],
+                "registered_country": {
+                    "invalid": 0,
+                    "names": {
+                        "invalid": 0,
+                    },
+                },
+                "represented_country": {
+                    "invalid": 0,
+                    "names": {
+                        "invalid": 0,
+                    },
+                },
                 "traits": {"ip_address": "1.2.3.4", "invalid": "blah"},
                 "unk_base": {"blah": 1},
             }
@@ -374,7 +409,9 @@
                 "zh-CN": "美国",
             },
         },
-        "traits": {"ip_address": "1.2.3.4",},
+        "traits": {
+            "ip_address": "1.2.3.4",
+        },
     }
 
     def test_names(self) -> None:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/geoip2-4.0.2/tests/webservice_test.py 
new/geoip2-4.1.0/tests/webservice_test.py
--- old/geoip2-4.0.2/tests/webservice_test.py   2020-07-21 18:41:13.000000000 
+0200
+++ new/geoip2-4.1.0/tests/webservice_test.py   2020-09-25 17:00:20.000000000 
+0200
@@ -14,7 +14,7 @@
 # httpretty currently doesn't work, but mocket with the compat interface
 # does.
 from mocket import Mocket  # type: ignore
-from mocket.plugins.httpretty import HTTPretty as httpretty, httprettified  # 
type: ignore
+from mocket.plugins.httpretty import httpretty, httprettified  # type: ignore
 import geoip2
 from geoip2.errors import (
     AddressNotFoundError,


Reply via email to