Skip to content

Commit 1463a43

Browse files
Merge pull request #280 from twisted/py3.11
Support for Python 3.11
2 parents 5cbfca6 + afa23f5 commit 1463a43

16 files changed

+34
-42
lines changed

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
url="https://github.com/twisted/txmongo",
1111
keywords=["mongo", "mongodb", "pymongo", "gridfs", "txmongo"],
1212
packages=["txmongo", "txmongo._gridfs"],
13-
install_requires=["twisted>=14.0", "pymongo>=3.0"],
13+
install_requires=["twisted>=14.0", "pymongo>=3.0, <4.0"],
1414
extras_require={
1515
'srv': ['pymongo[srv]>=3.6'],
1616
},

tests/mongod.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import tempfile
1919
import shutil
2020

21-
from twisted.python.compat import intToBytes
2221
from twisted.python.filepath import FilePath
2322
from twisted.internet import defer, reactor
2423
from twisted.internet.error import ProcessDone
@@ -61,7 +60,7 @@ def start(self):
6160
self.__notify_waiting.append(d)
6261

6362
args = [b"mongod",
64-
b"--port", intToBytes(self.port),
63+
b"--port", (b'%d' % self.port),
6564
b"--dbpath", self.__datadir,
6665
# MongoDB 4.0 doesn't support nojournal + WiredTiger + ReplicaSet
6766
# b"--nojournal",

tests/test_bulk.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from pymongo.results import BulkWriteResult
66
from pymongo.write_concern import WriteConcern
77
from twisted.internet import defer
8-
from mock import patch
8+
from unittest.mock import patch
99

1010
from tests.utils import SingleCollectionTest
1111
from txmongo.protocol import Reply

tests/test_cancel.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import struct
22

3-
from mock import Mock
3+
from unittest.mock import Mock
44
from pymongo.uri_parser import parse_uri
55
from twisted.internet import defer
66
from twisted.internet import reactor

tests/test_connection.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
# limitations under the License.
1515

1616
from __future__ import absolute_import, division
17-
from mock import patch
17+
from unittest.mock import patch
1818
from time import time
1919
from twisted.trial import unittest
2020
from twisted.internet import defer

tests/test_count.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
# limitations under the License.
1515

1616
from __future__ import absolute_import, division
17-
from mock import patch
17+
from unittest.mock import patch
1818
from time import time
1919
from twisted.trial import unittest
2020
from twisted.internet import defer

tests/test_get_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
# limitations under the License.
1515

1616
from __future__ import absolute_import, division
17-
from mock import patch
17+
from unittest.mock import patch
1818
from time import time
1919
from twisted.trial import unittest
2020
from twisted.internet import defer

tests/test_protocol.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
from bson import BSON
1919
from twisted.trial import unittest
2020
from twisted.internet import defer
21-
from twisted.python.compat import unicode
2221

2322
from tests.utils import SingleCollectionTest
2423

@@ -56,7 +55,7 @@ def __test_encode_decode(self, request):
5655
# len and request_id are not filled in request object
5756
if field not in ("len", "request_id"):
5857
if isinstance(dec_value, bytes) and \
59-
isinstance(req_value, unicode):
58+
isinstance(req_value, str):
6059
dec_value = dec_value.decode()
6160

6261
self.assertEqual(dec_value, req_value)

tests/test_queries.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -563,7 +563,6 @@ def test_MapReduce(self):
563563

564564
result = yield self.coll.map_reduce(t_map, t_reduce, out={"inline": 1}, full_response=True)
565565
self.assertTrue(result["ok"], 1)
566-
self.assertTrue("counts" in result)
567566
self.assertTrue("results" in result)
568567

569568

tests/test_write_concern.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
from __future__ import absolute_import, division
1717

18-
from mock import patch
18+
from unittest.mock import patch
1919
from pymongo.write_concern import WriteConcern
2020
from twisted.internet import defer
2121
from twisted.trial import unittest

txmongo/_gridfs/grid_file.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
from io import BytesIO as StringIO
2121
import math
2222
import os
23-
from twisted.python.compat import unicode
2423
from twisted.internet import defer
2524
from txmongo._gridfs.errors import CorruptGridFile
2625
from txmongo.collection import Collection
@@ -224,9 +223,9 @@ def write(self, data):
224223
read = data.read
225224
except AttributeError:
226225
# string
227-
if not isinstance(data, (bytes, unicode)):
226+
if not isinstance(data, (bytes, str)):
228227
raise TypeError("TxMongo: can only write strings or file-like objects.")
229-
if isinstance(data, unicode):
228+
if isinstance(data, str):
230229
try:
231230
data = data.encode(self.encoding)
232231
except AttributeError:

txmongo/collection.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from __future__ import absolute_import, division
66
import io
77
import struct
8-
import collections
8+
import collections.abc
99
import warnings
1010
from bson import BSON, ObjectId
1111
from bson.code import Code
@@ -27,7 +27,7 @@
2727
from txmongo.utils import check_deadline, timeout
2828
from txmongo import filter as qf
2929
from twisted.internet import defer
30-
from twisted.python.compat import unicode, comparable
30+
from twisted.python.compat import comparable
3131

3232

3333
@comparable
@@ -50,8 +50,8 @@ class Collection(object):
5050
"""
5151

5252
def __init__(self, database, name, write_concern=None, codec_options=None):
53-
if not isinstance(name, (bytes, unicode)):
54-
raise TypeError("TxMongo: name must be an instance of (bytes, unicode).")
53+
if not isinstance(name, (bytes, str)):
54+
raise TypeError("TxMongo: name must be an instance of (bytes, str).")
5555

5656
if not name or ".." in name:
5757
raise InvalidName("TxMongo: collection names cannot be empty.")
@@ -66,7 +66,7 @@ def __init__(self, database, name, write_concern=None, codec_options=None):
6666
raise InvalidName("TxMongo: collection names must not contain the null character.")
6767

6868
self._database = database
69-
self._collection_name = unicode(name)
69+
self._collection_name = str(name)
7070
self.__write_concern = write_concern
7171
self.__codec_options = codec_options
7272

@@ -173,7 +173,7 @@ def _normalize_fields_projection(fields):
173173
# Consider fields as iterable
174174
as_dict = {}
175175
for field in fields:
176-
if not isinstance(field, (bytes, unicode)):
176+
if not isinstance(field, (bytes, str)):
177177
raise TypeError("TxMongo: fields must be a list of key names.")
178178
as_dict[field] = 1
179179
if not as_dict:
@@ -516,7 +516,7 @@ def group(self, keys, initial, reduce, condition=None, finalize=None, **kwargs):
516516
"$reduce": Code(reduce),
517517
}
518518

519-
if isinstance(keys, (bytes, unicode)):
519+
if isinstance(keys, (bytes, str)):
520520
body["$keyf"] = Code(keys)
521521
else:
522522
body["key"] = self._normalize_fields_projection(keys)
@@ -738,7 +738,7 @@ def insert_many(self, documents, ordered=True, _deadline=None):
738738
"""
739739
inserted_ids = []
740740
for doc in documents:
741-
if isinstance(doc, collections.Mapping):
741+
if isinstance(doc, collections.abc.Mapping):
742742
inserted_ids.append(doc.setdefault("_id", ObjectId()))
743743
else:
744744
raise TypeError("TxMongo: insert_many takes list of documents.")
@@ -1045,7 +1045,7 @@ def ensure_index(self, sort_fields, _deadline=None, **kwargs):
10451045
@timeout
10461046
def drop_index(self, index_identifier, _deadline=None):
10471047
"""drop_index(index_identifier)"""
1048-
if isinstance(index_identifier, (bytes, unicode)):
1048+
if isinstance(index_identifier, (bytes, str)):
10491049
name = index_identifier
10501050
elif isinstance(index_identifier, qf.sort):
10511051
name = self._gen_index_name(index_identifier["orderby"])
@@ -1235,7 +1235,7 @@ def find_one_and_update(self, filter, update, projection=None, sort=None,
12351235
update=update, _deadline=_deadline)
12361236

12371237
def bulk_write(self, requests, ordered=True):
1238-
if not isinstance(requests, collections.Iterable):
1238+
if not isinstance(requests, collections.abc.Iterable):
12391239
raise TypeError("requests must be iterable")
12401240

12411241
requests = list(requests)

txmongo/connection.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
from twisted.internet import defer, reactor, task
1313
from twisted.internet.protocol import ReconnectingClientFactory, ClientFactory
1414
from twisted.python import log
15-
from twisted.python.compat import StringType
1615
from txmongo.database import Database
1716
from txmongo.protocol import MongoProtocol, Query
1817
from txmongo.utils import timeout, get_err
@@ -245,7 +244,7 @@ class ConnectionPool(object):
245244

246245
def __init__(self, uri="mongodb://127.0.0.1:27017", pool_size=1, ssl_context_factory=None,
247246
ping_interval=10, ping_timeout=10, **kwargs):
248-
assert isinstance(uri, StringType)
247+
assert isinstance(uri, str)
249248
assert isinstance(pool_size, int)
250249
assert pool_size >= 1
251250

@@ -332,7 +331,7 @@ def get_default_database(self):
332331
return None
333332

334333
def drop_database(self, name_or_database):
335-
if isinstance(name_or_database, (bytes, StringType)):
334+
if isinstance(name_or_database, (bytes, str)):
336335
db = self[name_or_database]
337336
elif isinstance(name_or_database, Database):
338337
db = name_or_database

txmongo/database.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
from bson.son import SON
66
from bson.codec_options import DEFAULT_CODEC_OPTIONS
7-
from twisted.python.compat import unicode
87
from txmongo.collection import Collection
98
from txmongo.pymongo_internals import _check_command_response
109
from txmongo.utils import timeout
@@ -18,7 +17,7 @@ def __init__(self, factory, database_name, write_concern=None,
1817
self.__factory = factory
1918
self.__write_concern = write_concern
2019
self.__codec_options = codec_options
21-
self._database_name = unicode(database_name)
20+
self._database_name = str(database_name)
2221

2322
def __str__(self):
2423
return self._database_name
@@ -56,7 +55,7 @@ def codec_options(self):
5655
def command(self, command, value=1, check=True, allowable_errors=None,
5756
codec_options=DEFAULT_CODEC_OPTIONS, _deadline=None, **kwargs):
5857
"""command(command, value=1, check=True, allowable_errors=None, codec_options=DEFAULT_CODEC_OPTIONS)"""
59-
if isinstance(command, (bytes, unicode)):
58+
if isinstance(command, (bytes, str)):
6059
command = SON([(command, value)])
6160
options = kwargs.copy()
6261
command.update(options)
@@ -96,12 +95,12 @@ def drop_collection(self, name_or_collection, _deadline=None):
9695
"""drop_collection(name_or_collection)"""
9796
if isinstance(name_or_collection, Collection):
9897
name = name_or_collection._collection_name
99-
elif isinstance(name_or_collection, (bytes, unicode)):
98+
elif isinstance(name_or_collection, (bytes, str)):
10099
name = name_or_collection
101100
else:
102101
raise TypeError("TxMongo: name must be an instance of basestring or txmongo.Collection")
103102

104-
return self.command("drop", unicode(name), allowable_errors=["ns not found"],
103+
return self.command("drop", str(name), allowable_errors=["ns not found"],
105104
_deadline=_deadline)
106105

107106
@timeout
@@ -121,9 +120,9 @@ def authenticate(self, name, password, mechanism="DEFAULT"):
121120
Send an authentication command for this database.
122121
mostly stolen from pymongo
123122
"""
124-
if not isinstance(name, (bytes, unicode)):
123+
if not isinstance(name, (bytes, str)):
125124
raise TypeError("TxMongo: name must be an instance of basestring.")
126-
if not isinstance(password, (bytes, unicode)):
125+
if not isinstance(password, (bytes, str)):
127126
raise TypeError("TxMongo: password must be an instance of basestring.")
128127

129128
"""

txmongo/filter.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,12 @@
44

55
from __future__ import absolute_import, division
66
from collections import defaultdict
7-
from twisted.python.compat import unicode
87

98
"""Query filters"""
109

1110

1211
def _direction(keys, direction):
13-
if isinstance(keys, (bytes, unicode)):
12+
if isinstance(keys, (bytes, str)):
1413
return (keys, direction),
1514
elif isinstance(keys, (list, tuple)):
1615
return tuple([(k, direction) for k in keys])
@@ -78,7 +77,7 @@ def _index_document(self, operation, index_list):
7877
try:
7978
assert isinstance(index_list, (list, tuple))
8079
for key, direction in index_list:
81-
if not isinstance(key, (bytes, unicode)):
80+
if not isinstance(key, (bytes, str)):
8281
raise TypeError("TxMongo: invalid {0}ing key '{1}'"
8382
.format(name, repr(key)))
8483
if direction not in self.ALLOWED_DIRECTIONS:

txmongo/protocol.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import struct
3030
from twisted.internet import defer, protocol, error
3131
from twisted.python import failure, log
32-
from twisted.python.compat import unicode
3332
from txmongo.utils import get_err
3433

3534

@@ -484,7 +483,7 @@ def authenticate_mongo_cr(self, database_name, username, password):
484483
nonce = result["nonce"]
485484

486485
auth_cmd = SON(authenticate=1)
487-
auth_cmd["user"] = unicode(username)
486+
auth_cmd["user"] = str(username)
488487
auth_cmd["nonce"] = nonce
489488
auth_cmd["key"] = auth._auth_key(nonce, username, password)
490489

@@ -566,8 +565,8 @@ def authenticate_mongo_x509(self, database_name, username, password):
566565
@defer.inlineCallbacks
567566
def authenticate(self, database_name, username, password, mechanism):
568567
database_name = str(database_name)
569-
username = unicode(username)
570-
password = unicode(password)
568+
username = str(username)
569+
password = str(password)
571570

572571
yield self.__auth_lock.acquire()
573572

0 commit comments

Comments
 (0)