1- # -*- coding: utf-8 -*-
2- from __future__ import absolute_import , print_function , unicode_literals
3-
41import ast
52import datetime
63import logging
74import os
85import random
96import re
107import time
8+ from importlib .metadata import PackageNotFoundError
9+ from importlib .metadata import version as _get_version
1110from xml .etree import ElementTree # noqa: ICN001
1211
1312import requests
1413
15- try :
16- from importlib .metadata import PackageNotFoundError
17- from importlib .metadata import version as _get_version
18- except ImportError :
19- # python < 3.8
20- from importlib_metadata import PackageNotFoundError
21- from importlib_metadata import version as _get_version
22-
2314try :
2415 from kazoo .client import KazooClient , KazooState
2516except ImportError :
3122except ImportError :
3223 import json
3324
34- try :
35- # Python 3.X
36- from urllib .parse import urlencode
37- except ImportError :
38- # Python 2.X
39- from urllib import urlencode
40-
41- try :
42- # Python 3.X
43- from urllib .parse import quote
44- except ImportError :
45- # Python 2.X
46- from urllib import quote
47-
48- try :
49- # Python 3.X
50- import html .entities as htmlentities
51- except ImportError :
52- # Python 2.X
53- import htmlentitydefs as htmlentities
54-
55- try :
56- # Python 3.X
57- from http .client import HTTPException
58- except ImportError :
59- from httplib import HTTPException
60-
61- try :
62- # Python 2.X
63- unicode_char = unichr
64- except NameError :
65- # Python 3.X
66- unicode_char = chr
67- # Ugh.
68- long = int # NOQA: A001
6925
26+ import html .entities as htmlentities
27+ from http .client import HTTPException
28+ from urllib .parse import quote , urlencode
7029
7130__author__ = "Daniel Lindsley, Joseph Kocherhans, Jacob Kaplan-Moss, Thomas Rieder"
7231__all__ = ["Solr" ]
@@ -110,33 +69,14 @@ def emit(self, record):
11069 LOG .addHandler (stream )
11170
11271
113- def is_py3 ():
114- try :
115- basestring
116- return False
117- except NameError :
118- return True
119-
120-
121- IS_PY3 = is_py3 ()
122-
123-
12472def force_unicode (value ):
12573 """
12674 Forces a bytestring to become a Unicode string.
12775 """
128- if IS_PY3 :
129- # Python 3.X
130- if isinstance (value , bytes ):
131- value = value .decode ("utf-8" , errors = "replace" )
132- elif not isinstance (value , str ):
133- value = str (value )
134- else :
135- # Python 2.X
136- if isinstance (value , str ):
137- value = value .decode ("utf-8" , "replace" )
138- elif not isinstance (value , basestring ): # NOQA: F821
139- value = unicode (value ) # NOQA: F821
76+ if isinstance (value , bytes ):
77+ value = value .decode ("utf-8" , errors = "replace" )
78+ elif not isinstance (value , str ):
79+ value = str (value )
14080
14181 return value
14282
@@ -145,12 +85,8 @@ def force_bytes(value):
14585 """
14686 Forces a Unicode string to become a bytestring.
14787 """
148- if IS_PY3 :
149- if isinstance (value , str ):
150- value = value .encode ("utf-8" , "backslashreplace" )
151- else :
152- if isinstance (value , unicode ): # NOQA: F821
153- value = value .encode ("utf-8" )
88+ if isinstance (value , str ):
89+ value = value .encode ("utf-8" , "backslashreplace" )
15490
15591 return value
15692
@@ -171,46 +107,30 @@ def fixup(m):
171107 # character reference
172108 try :
173109 if text [:3 ] == "&#x" :
174- return unicode_char (int (text [3 :- 1 ], 16 ))
110+ return chr (int (text [3 :- 1 ], 16 ))
175111 else :
176- return unicode_char (int (text [2 :- 1 ]))
112+ return chr (int (text [2 :- 1 ]))
177113 except ValueError :
178114 pass
179115 else :
180116 # named entity
181117 try :
182- text = unicode_char (htmlentities .name2codepoint [text [1 :- 1 ]])
118+ text = chr (htmlentities .name2codepoint [text [1 :- 1 ]])
183119 except KeyError :
184120 pass
185121 return text # leave as is
186122
187123 return re .sub (r"&#?\w+;" , fixup , text )
188124
189125
190- def safe_urlencode (params , doseq = 0 ):
126+ def safe_urlencode (params , doseq = False ):
191127 """
192- UTF-8-safe version of safe_urlencode
128+ URL-encode parameters using UTF-8 encoding.
193129
194- The stdlib safe_urlencode prior to Python 3.x chokes on UTF-8 values
195- which can't fail down to ascii .
130+ This is a wrapper around `urllib.parse.urlencode` that ensures
131+ consistent UTF-8 handling for all parameter values .
196132 """
197- if IS_PY3 :
198- return urlencode (params , doseq )
199-
200- if hasattr (params , "items" ):
201- params = params .items ()
202-
203- new_params = []
204-
205- for k , v in params :
206- k = k .encode ("utf-8" )
207-
208- if isinstance (v , (list , tuple )):
209- new_params .append ((k , [force_bytes (i ) for i in v ]))
210- else :
211- new_params .append ((k , force_bytes (v )))
212-
213- return urlencode (new_params , doseq )
133+ return urlencode (params , doseq )
214134
215135
216136def clean_xml_string (s ):
@@ -622,9 +542,9 @@ def _scrape_response(self, headers, response):
622542 full_html = ""
623543 dom_tree = None
624544
625- # In Python3, response can be made of bytes
626- if IS_PY3 and hasattr (response , "decode" ):
545+ if hasattr (response , "decode" ):
627546 response = response .decode ()
547+
628548 if response .startswith ("<?xml" ):
629549 # Try a strict XML parse
630550 try :
@@ -707,14 +627,8 @@ def _from_python(self, value):
707627 else :
708628 value = "false"
709629 else :
710- if IS_PY3 :
711- # Python 3.X
712- if isinstance (value , bytes ):
713- value = str (value , errors = "replace" ) # NOQA: F821
714- else :
715- # Python 2.X
716- if isinstance (value , str ):
717- value = unicode (value , errors = "replace" ) # NOQA: F821
630+ if isinstance (value , bytes ):
631+ value = str (value , errors = "replace" ) # NOQA: F821
718632
719633 value = "{0}" .format (value )
720634
@@ -724,7 +638,7 @@ def _to_python(self, value):
724638 """
725639 Converts values from Solr to native Python values.
726640 """
727- if isinstance (value , (int , float , long , complex )):
641+ if isinstance (value , (int , float , complex )):
728642 return value
729643
730644 if isinstance (value , (list , tuple )):
@@ -740,18 +654,11 @@ def _to_python(self, value):
740654
741655 is_string = False
742656
743- if IS_PY3 :
744- if isinstance (value , bytes ):
745- value = force_unicode (value )
746-
747- if isinstance (value , str ):
748- is_string = True
749- else :
750- if isinstance (value , str ):
751- value = force_unicode (value )
657+ if isinstance (value , bytes ):
658+ value = force_unicode (value )
752659
753- if isinstance (value , basestring ): # NOQA: F821
754- is_string = True
660+ if isinstance (value , str ):
661+ is_string = True
755662
756663 if is_string :
757664 possible_datetime = DATETIME_REGEX .search (value )
@@ -791,14 +698,8 @@ def _is_null_value(self, value):
791698 if value is None :
792699 return True
793700
794- if IS_PY3 :
795- # Python 3.X
796- if isinstance (value , str ) and len (value ) == 0 :
797- return True
798- else :
799- # Python 2.X
800- if isinstance (value , basestring ) and len (value ) == 0 : # NOQA: F821
801- return True
701+ if isinstance (value , str ) and len (value ) == 0 :
702+ return True
802703
803704 # TODO: This should probably be removed when solved in core Solr level?
804705 return False
@@ -1484,7 +1385,7 @@ def __init__(
14841385 auth = None ,
14851386 verify = True ,
14861387 * args ,
1487- ** kwargs
1388+ ** kwargs ,
14881389 ):
14891390 url = zookeeper .getRandomURL (collection )
14901391 self .auth = auth
@@ -1502,7 +1403,7 @@ def __init__(
15021403 auth = self .auth ,
15031404 verify = self .verify ,
15041405 * args ,
1505- ** kwargs
1406+ ** kwargs ,
15061407 )
15071408
15081409 def _send_request (self , method , path = "" , body = None , headers = None , files = None ):
0 commit comments