Browse Source

Replace all remaining six usage with native Python 3 equivalents (#7704)

Dagfinn Ilmari Mannsåker 3 years ago
parent
commit
a3f11567d9
73 changed files with 111 additions and 237 deletions
  1. 1 0
      changelog.d/7704.misc
  2. 1 3
      contrib/graph/graph3.py
  3. 1 2
      scripts-dev/federation_client.py
  4. 1 3
      scripts/synapse_port_db
  5. 1 1
      setup.cfg
  6. 0 2
      synapse/_scripts/register_new_matrix_user.py
  7. 3 4
      synapse/api/errors.py
  8. 1 3
      synapse/api/filtering.py
  9. 1 2
      synapse/api/urls.py
  10. 1 3
      synapse/appservice/__init__.py
  11. 1 2
      synapse/appservice/api.py
  12. 2 4
      synapse/config/_base.py
  13. 4 9
      synapse/config/appservice.py
  14. 1 3
      synapse/config/tls.py
  15. 2 4
      synapse/crypto/keyring.py
  16. 1 3
      synapse/events/utils.py
  17. 5 7
      synapse/events/validator.py
  18. 1 3
      synapse/federation/federation_base.py
  19. 1 3
      synapse/federation/federation_server.py
  20. 1 2
      synapse/federation/transport/client.py
  21. 1 3
      synapse/groups/groups_server.py
  22. 1 2
      synapse/handlers/cas_handler.py
  23. 4 5
      synapse/handlers/federation.py
  24. 1 3
      synapse/handlers/message.py
  25. 3 5
      synapse/handlers/profile.py
  26. 1 3
      synapse/handlers/room.py
  27. 3 4
      synapse/handlers/room_member.py
  28. 3 5
      synapse/http/client.py
  29. 5 7
      synapse/http/matrixfederationclient.py
  30. 2 2
      synapse/http/server.py
  31. 1 2
      synapse/logging/formatter.py
  32. 1 2
      synapse/push/mailer.py
  33. 1 3
      synapse/push/push_rule_evaluator.py
  34. 0 1
      synapse/python_dependencies.py
  35. 2 4
      synapse/replication/http/_base.py
  36. 6 14
      synapse/rest/admin/users.py
  37. 1 3
      synapse/rest/client/v1/presence.py
  38. 1 2
      synapse/rest/client/v1/room.py
  39. 2 3
      synapse/rest/client/v2_alpha/account.py
  40. 3 8
      synapse/rest/client/v2_alpha/register.py
  41. 4 6
      synapse/rest/client/v2_alpha/report_event.py
  42. 2 3
      synapse/rest/consent/consent_resource.py
  43. 1 2
      synapse/rest/media/v1/_base.py
  44. 1 5
      synapse/rest/media/v1/media_storage.py
  45. 3 6
      synapse/rest/media/v1/preview_url_resource.py
  46. 1 3
      synapse/server_notices/consent_server_notices.py
  47. 1 2
      synapse/storage/data_stores/main/event_federation.py
  48. 3 7
      synapse/storage/data_stores/main/events.py
  49. 1 3
      synapse/storage/data_stores/main/events_bg_updates.py
  50. 0 2
      synapse/storage/data_stores/main/schema/delta/30/as_users.py
  51. 1 3
      synapse/storage/data_stores/main/search.py
  52. 0 2
      synapse/storage/data_stores/main/stream.py
  53. 0 2
      synapse/storage/data_stores/main/tags.py
  54. 0 2
      synapse/storage/data_stores/state/store.py
  55. 1 2
      synapse/storage/database.py
  56. 0 2
      synapse/storage/persist_events.py
  57. 0 2
      synapse/util/async_helpers.py
  58. 1 3
      synapse/util/caches/stream_change_cache.py
  59. 1 1
      synapse/util/file_consumer.py
  60. 2 4
      synapse/util/frozenutils.py
  61. 0 2
      synapse/util/wheel_timer.py
  62. 0 2
      synapse/visibility.py
  63. 2 4
      synctl
  64. 1 1
      tests/rest/client/v1/test_rooms.py
  65. 4 5
      tests/rest/client/v2_alpha/test_relations.py
  66. 1 1
      tests/rest/media/v1/test_media_storage.py
  67. 1 3
      tests/server.py
  68. 0 2
      tests/state/test_v2.py
  69. 1 2
      tests/test_server.py
  70. 4 5
      tests/test_terms_auth.py
  71. 1 1
      tests/util/test_file_consumer.py
  72. 0 2
      tests/util/test_linearizer.py
  73. 1 1
      tests/utils.py

+ 1 - 0
changelog.d/7704.misc

@@ -0,0 +1 @@
+Replace all remaining uses of `six` with native Python 3 equivalents. Contributed by @ilmari.

+ 1 - 3
contrib/graph/graph3.py

@@ -24,8 +24,6 @@ import argparse
 from synapse.events import FrozenEvent
 from synapse.events import FrozenEvent
 from synapse.util.frozenutils import unfreeze
 from synapse.util.frozenutils import unfreeze
 
 
-from six import string_types
-
 
 
 def make_graph(file_name, room_id, file_prefix, limit):
 def make_graph(file_name, room_id, file_prefix, limit):
     print("Reading lines")
     print("Reading lines")
@@ -62,7 +60,7 @@ def make_graph(file_name, room_id, file_prefix, limit):
         for key, value in unfreeze(event.get_dict()["content"]).items():
         for key, value in unfreeze(event.get_dict()["content"]).items():
             if value is None:
             if value is None:
                 value = "<null>"
                 value = "<null>"
-            elif isinstance(value, string_types):
+            elif isinstance(value, str):
                 pass
                 pass
             else:
             else:
                 value = json.dumps(value)
                 value = json.dumps(value)

+ 1 - 2
scripts-dev/federation_client.py

@@ -21,8 +21,7 @@ import argparse
 import base64
 import base64
 import json
 import json
 import sys
 import sys
-
-from six.moves.urllib import parse as urlparse
+from urllib import parse as urlparse
 
 
 import nacl.signing
 import nacl.signing
 import requests
 import requests

+ 1 - 3
scripts/synapse_port_db

@@ -23,8 +23,6 @@ import sys
 import time
 import time
 import traceback
 import traceback
 
 
-from six import string_types
-
 import yaml
 import yaml
 
 
 from twisted.internet import defer, reactor
 from twisted.internet import defer, reactor
@@ -635,7 +633,7 @@ class Porter(object):
                 return bool(col)
                 return bool(col)
             if isinstance(col, bytes):
             if isinstance(col, bytes):
                 return bytearray(col)
                 return bytearray(col)
-            elif isinstance(col, string_types) and "\0" in col:
+            elif isinstance(col, str) and "\0" in col:
                 logger.warning(
                 logger.warning(
                     "DROPPING ROW: NUL value in table %s col %s: %r",
                     "DROPPING ROW: NUL value in table %s col %s: %r",
                     table,
                     table,

+ 1 - 1
setup.cfg

@@ -31,7 +31,7 @@ sections=FUTURE,STDLIB,COMPAT,THIRDPARTY,TWISTED,FIRSTPARTY,TESTS,LOCALFOLDER
 default_section=THIRDPARTY
 default_section=THIRDPARTY
 known_first_party = synapse
 known_first_party = synapse
 known_tests=tests
 known_tests=tests
-known_compat = mock,six
+known_compat = mock
 known_twisted=twisted,OpenSSL
 known_twisted=twisted,OpenSSL
 multi_line_output=3
 multi_line_output=3
 include_trailing_comma=true
 include_trailing_comma=true

+ 0 - 2
synapse/_scripts/register_new_matrix_user.py

@@ -23,8 +23,6 @@ import hmac
 import logging
 import logging
 import sys
 import sys
 
 
-from six.moves import input
-
 import requests as _requests
 import requests as _requests
 import yaml
 import yaml
 
 

+ 3 - 4
synapse/api/errors.py

@@ -17,10 +17,9 @@
 """Contains exceptions and error codes."""
 """Contains exceptions and error codes."""
 
 
 import logging
 import logging
+from http import HTTPStatus
 from typing import Dict, List
 from typing import Dict, List
 
 
-from six.moves import http_client
-
 from canonicaljson import json
 from canonicaljson import json
 
 
 from twisted.web import http
 from twisted.web import http
@@ -173,7 +172,7 @@ class ConsentNotGivenError(SynapseError):
             consent_url (str): The URL where the user can give their consent
             consent_url (str): The URL where the user can give their consent
         """
         """
         super(ConsentNotGivenError, self).__init__(
         super(ConsentNotGivenError, self).__init__(
-            code=http_client.FORBIDDEN, msg=msg, errcode=Codes.CONSENT_NOT_GIVEN
+            code=HTTPStatus.FORBIDDEN, msg=msg, errcode=Codes.CONSENT_NOT_GIVEN
         )
         )
         self._consent_uri = consent_uri
         self._consent_uri = consent_uri
 
 
@@ -193,7 +192,7 @@ class UserDeactivatedError(SynapseError):
             msg (str): The human-readable error message
             msg (str): The human-readable error message
         """
         """
         super(UserDeactivatedError, self).__init__(
         super(UserDeactivatedError, self).__init__(
-            code=http_client.FORBIDDEN, msg=msg, errcode=Codes.USER_DEACTIVATED
+            code=HTTPStatus.FORBIDDEN, msg=msg, errcode=Codes.USER_DEACTIVATED
         )
         )
 
 
 
 

+ 1 - 3
synapse/api/filtering.py

@@ -17,8 +17,6 @@
 # limitations under the License.
 # limitations under the License.
 from typing import List
 from typing import List
 
 
-from six import text_type
-
 import jsonschema
 import jsonschema
 from canonicaljson import json
 from canonicaljson import json
 from jsonschema import FormatChecker
 from jsonschema import FormatChecker
@@ -313,7 +311,7 @@ class Filter(object):
 
 
             content = event.get("content", {})
             content = event.get("content", {})
             # check if there is a string url field in the content for filtering purposes
             # check if there is a string url field in the content for filtering purposes
-            contains_url = isinstance(content.get("url"), text_type)
+            contains_url = isinstance(content.get("url"), str)
             labels = content.get(EventContentFields.LABELS, [])
             labels = content.get(EventContentFields.LABELS, [])
 
 
         return self.check_fields(room_id, sender, ev_type, labels, contains_url)
         return self.check_fields(room_id, sender, ev_type, labels, contains_url)

+ 1 - 2
synapse/api/urls.py

@@ -17,8 +17,7 @@
 """Contains the URL paths to prefix various aspects of the server with. """
 """Contains the URL paths to prefix various aspects of the server with. """
 import hmac
 import hmac
 from hashlib import sha256
 from hashlib import sha256
-
-from six.moves.urllib.parse import urlencode
+from urllib.parse import urlencode
 
 
 from synapse.config import ConfigError
 from synapse.config import ConfigError
 
 

+ 1 - 3
synapse/appservice/__init__.py

@@ -15,8 +15,6 @@
 import logging
 import logging
 import re
 import re
 
 
-from six import string_types
-
 from twisted.internet import defer
 from twisted.internet import defer
 
 
 from synapse.api.constants import EventTypes
 from synapse.api.constants import EventTypes
@@ -156,7 +154,7 @@ class ApplicationService(object):
                         )
                         )
 
 
                 regex = regex_obj.get("regex")
                 regex = regex_obj.get("regex")
-                if isinstance(regex, string_types):
+                if isinstance(regex, str):
                     regex_obj["regex"] = re.compile(regex)  # Pre-compile regex
                     regex_obj["regex"] = re.compile(regex)  # Pre-compile regex
                 else:
                 else:
                     raise ValueError("Expected string for 'regex' in ns '%s'" % ns)
                     raise ValueError("Expected string for 'regex' in ns '%s'" % ns)

+ 1 - 2
synapse/appservice/api.py

@@ -13,8 +13,7 @@
 # See the License for the specific language governing permissions and
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # limitations under the License.
 import logging
 import logging
-
-from six.moves import urllib
+import urllib
 
 
 from prometheus_client import Counter
 from prometheus_client import Counter
 
 

+ 2 - 4
synapse/config/_base.py

@@ -22,8 +22,6 @@ from collections import OrderedDict
 from textwrap import dedent
 from textwrap import dedent
 from typing import Any, MutableMapping, Optional
 from typing import Any, MutableMapping, Optional
 
 
-from six import integer_types
-
 import yaml
 import yaml
 
 
 
 
@@ -117,7 +115,7 @@ class Config(object):
 
 
     @staticmethod
     @staticmethod
     def parse_size(value):
     def parse_size(value):
-        if isinstance(value, integer_types):
+        if isinstance(value, int):
             return value
             return value
         sizes = {"K": 1024, "M": 1024 * 1024}
         sizes = {"K": 1024, "M": 1024 * 1024}
         size = 1
         size = 1
@@ -129,7 +127,7 @@ class Config(object):
 
 
     @staticmethod
     @staticmethod
     def parse_duration(value):
     def parse_duration(value):
-        if isinstance(value, integer_types):
+        if isinstance(value, int):
             return value
             return value
         second = 1000
         second = 1000
         minute = 60 * second
         minute = 60 * second

+ 4 - 9
synapse/config/appservice.py

@@ -14,9 +14,7 @@
 
 
 import logging
 import logging
 from typing import Dict
 from typing import Dict
-
-from six import string_types
-from six.moves.urllib import parse as urlparse
+from urllib import parse as urlparse
 
 
 import yaml
 import yaml
 from netaddr import IPSet
 from netaddr import IPSet
@@ -98,17 +96,14 @@ def load_appservices(hostname, config_files):
 def _load_appservice(hostname, as_info, config_filename):
 def _load_appservice(hostname, as_info, config_filename):
     required_string_fields = ["id", "as_token", "hs_token", "sender_localpart"]
     required_string_fields = ["id", "as_token", "hs_token", "sender_localpart"]
     for field in required_string_fields:
     for field in required_string_fields:
-        if not isinstance(as_info.get(field), string_types):
+        if not isinstance(as_info.get(field), str):
             raise KeyError(
             raise KeyError(
                 "Required string field: '%s' (%s)" % (field, config_filename)
                 "Required string field: '%s' (%s)" % (field, config_filename)
             )
             )
 
 
     # 'url' must either be a string or explicitly null, not missing
     # 'url' must either be a string or explicitly null, not missing
     # to avoid accidentally turning off push for ASes.
     # to avoid accidentally turning off push for ASes.
-    if (
-        not isinstance(as_info.get("url"), string_types)
-        and as_info.get("url", "") is not None
-    ):
+    if not isinstance(as_info.get("url"), str) and as_info.get("url", "") is not None:
         raise KeyError(
         raise KeyError(
             "Required string field or explicit null: 'url' (%s)" % (config_filename,)
             "Required string field or explicit null: 'url' (%s)" % (config_filename,)
         )
         )
@@ -138,7 +133,7 @@ def _load_appservice(hostname, as_info, config_filename):
                         ns,
                         ns,
                         regex_obj,
                         regex_obj,
                     )
                     )
-                if not isinstance(regex_obj.get("regex"), string_types):
+                if not isinstance(regex_obj.get("regex"), str):
                     raise ValueError("Missing/bad type 'regex' key in %s", regex_obj)
                     raise ValueError("Missing/bad type 'regex' key in %s", regex_obj)
                 if not isinstance(regex_obj.get("exclusive"), bool):
                 if not isinstance(regex_obj.get("exclusive"), bool):
                     raise ValueError(
                     raise ValueError(

+ 1 - 3
synapse/config/tls.py

@@ -20,8 +20,6 @@ from datetime import datetime
 from hashlib import sha256
 from hashlib import sha256
 from typing import List
 from typing import List
 
 
-import six
-
 from unpaddedbase64 import encode_base64
 from unpaddedbase64 import encode_base64
 
 
 from OpenSSL import SSL, crypto
 from OpenSSL import SSL, crypto
@@ -59,7 +57,7 @@ class TlsConfig(Config):
             logger.warning(ACME_SUPPORT_ENABLED_WARN)
             logger.warning(ACME_SUPPORT_ENABLED_WARN)
 
 
         # hyperlink complains on py2 if this is not a Unicode
         # hyperlink complains on py2 if this is not a Unicode
-        self.acme_url = six.text_type(
+        self.acme_url = str(
             acme_config.get("url", "https://acme-v01.api.letsencrypt.org/directory")
             acme_config.get("url", "https://acme-v01.api.letsencrypt.org/directory")
         )
         )
         self.acme_port = acme_config.get("port", 80)
         self.acme_port = acme_config.get("port", 80)

+ 2 - 4
synapse/crypto/keyring.py

@@ -15,11 +15,9 @@
 # limitations under the License.
 # limitations under the License.
 
 
 import logging
 import logging
+import urllib
 from collections import defaultdict
 from collections import defaultdict
 
 
-import six
-from six.moves import urllib
-
 import attr
 import attr
 from signedjson.key import (
 from signedjson.key import (
     decode_verify_key_bytes,
     decode_verify_key_bytes,
@@ -661,7 +659,7 @@ class PerspectivesKeyFetcher(BaseV2KeyFetcher):
         for response in query_response["server_keys"]:
         for response in query_response["server_keys"]:
             # do this first, so that we can give useful errors thereafter
             # do this first, so that we can give useful errors thereafter
             server_name = response.get("server_name")
             server_name = response.get("server_name")
-            if not isinstance(server_name, six.string_types):
+            if not isinstance(server_name, str):
                 raise KeyLookupError(
                 raise KeyLookupError(
                     "Malformed response from key notary server %s: invalid server_name"
                     "Malformed response from key notary server %s: invalid server_name"
                     % (perspective_name,)
                     % (perspective_name,)

+ 1 - 3
synapse/events/utils.py

@@ -16,8 +16,6 @@ import collections
 import re
 import re
 from typing import Any, Mapping, Union
 from typing import Any, Mapping, Union
 
 
-from six import string_types
-
 from frozendict import frozendict
 from frozendict import frozendict
 
 
 from twisted.internet import defer
 from twisted.internet import defer
@@ -318,7 +316,7 @@ def serialize_event(
 
 
     if only_event_fields:
     if only_event_fields:
         if not isinstance(only_event_fields, list) or not all(
         if not isinstance(only_event_fields, list) or not all(
-            isinstance(f, string_types) for f in only_event_fields
+            isinstance(f, str) for f in only_event_fields
         ):
         ):
             raise TypeError("only_event_fields must be a list of strings")
             raise TypeError("only_event_fields must be a list of strings")
         d = only_fields(d, only_event_fields)
         d = only_fields(d, only_event_fields)

+ 5 - 7
synapse/events/validator.py

@@ -13,8 +13,6 @@
 # See the License for the specific language governing permissions and
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # limitations under the License.
 
 
-from six import integer_types, string_types
-
 from synapse.api.constants import MAX_ALIAS_LENGTH, EventTypes, Membership
 from synapse.api.constants import MAX_ALIAS_LENGTH, EventTypes, Membership
 from synapse.api.errors import Codes, SynapseError
 from synapse.api.errors import Codes, SynapseError
 from synapse.api.room_versions import EventFormatVersions
 from synapse.api.room_versions import EventFormatVersions
@@ -53,7 +51,7 @@ class EventValidator(object):
         event_strings = ["origin"]
         event_strings = ["origin"]
 
 
         for s in event_strings:
         for s in event_strings:
-            if not isinstance(getattr(event, s), string_types):
+            if not isinstance(getattr(event, s), str):
                 raise SynapseError(400, "'%s' not a string type" % (s,))
                 raise SynapseError(400, "'%s' not a string type" % (s,))
 
 
         # Depending on the room version, ensure the data is spec compliant JSON.
         # Depending on the room version, ensure the data is spec compliant JSON.
@@ -90,7 +88,7 @@ class EventValidator(object):
         max_lifetime = event.content.get("max_lifetime")
         max_lifetime = event.content.get("max_lifetime")
 
 
         if min_lifetime is not None:
         if min_lifetime is not None:
-            if not isinstance(min_lifetime, integer_types):
+            if not isinstance(min_lifetime, int):
                 raise SynapseError(
                 raise SynapseError(
                     code=400,
                     code=400,
                     msg="'min_lifetime' must be an integer",
                     msg="'min_lifetime' must be an integer",
@@ -124,7 +122,7 @@ class EventValidator(object):
                 )
                 )
 
 
         if max_lifetime is not None:
         if max_lifetime is not None:
-            if not isinstance(max_lifetime, integer_types):
+            if not isinstance(max_lifetime, int):
                 raise SynapseError(
                 raise SynapseError(
                     code=400,
                     code=400,
                     msg="'max_lifetime' must be an integer",
                     msg="'max_lifetime' must be an integer",
@@ -183,7 +181,7 @@ class EventValidator(object):
             strings.append("state_key")
             strings.append("state_key")
 
 
         for s in strings:
         for s in strings:
-            if not isinstance(getattr(event, s), string_types):
+            if not isinstance(getattr(event, s), str):
                 raise SynapseError(400, "Not '%s' a string type" % (s,))
                 raise SynapseError(400, "Not '%s' a string type" % (s,))
 
 
         RoomID.from_string(event.room_id)
         RoomID.from_string(event.room_id)
@@ -223,7 +221,7 @@ class EventValidator(object):
         for s in keys:
         for s in keys:
             if s not in d:
             if s not in d:
                 raise SynapseError(400, "'%s' not in content" % (s,))
                 raise SynapseError(400, "'%s' not in content" % (s,))
-            if not isinstance(d[s], string_types):
+            if not isinstance(d[s], str):
                 raise SynapseError(400, "'%s' not a string type" % (s,))
                 raise SynapseError(400, "'%s' not a string type" % (s,))
 
 
     def _ensure_state_event(self, event):
     def _ensure_state_event(self, event):

+ 1 - 3
synapse/federation/federation_base.py

@@ -17,8 +17,6 @@ import logging
 from collections import namedtuple
 from collections import namedtuple
 from typing import Iterable, List
 from typing import Iterable, List
 
 
-import six
-
 from twisted.internet import defer
 from twisted.internet import defer
 from twisted.internet.defer import Deferred, DeferredList
 from twisted.internet.defer import Deferred, DeferredList
 from twisted.python.failure import Failure
 from twisted.python.failure import Failure
@@ -294,7 +292,7 @@ def event_from_pdu_json(
     assert_params_in_dict(pdu_json, ("type", "depth"))
     assert_params_in_dict(pdu_json, ("type", "depth"))
 
 
     depth = pdu_json["depth"]
     depth = pdu_json["depth"]
-    if not isinstance(depth, six.integer_types):
+    if not isinstance(depth, int):
         raise SynapseError(400, "Depth %r not an intger" % (depth,), Codes.BAD_JSON)
         raise SynapseError(400, "Depth %r not an intger" % (depth,), Codes.BAD_JSON)
 
 
     if depth < 0:
     if depth < 0:

+ 1 - 3
synapse/federation/federation_server.py

@@ -17,8 +17,6 @@
 import logging
 import logging
 from typing import Any, Callable, Dict, List, Match, Optional, Tuple, Union
 from typing import Any, Callable, Dict, List, Match, Optional, Tuple, Union
 
 
-import six
-
 from canonicaljson import json
 from canonicaljson import json
 from prometheus_client import Counter
 from prometheus_client import Counter
 
 
@@ -751,7 +749,7 @@ def server_matches_acl_event(server_name: str, acl_event: EventBase) -> bool:
 
 
 
 
 def _acl_entry_matches(server_name: str, acl_entry: str) -> Match:
 def _acl_entry_matches(server_name: str, acl_entry: str) -> Match:
-    if not isinstance(acl_entry, six.string_types):
+    if not isinstance(acl_entry, str):
         logger.warning(
         logger.warning(
             "Ignoring non-str ACL entry '%s' (is %s)", acl_entry, type(acl_entry)
             "Ignoring non-str ACL entry '%s' (is %s)", acl_entry, type(acl_entry)
         )
         )

+ 1 - 2
synapse/federation/transport/client.py

@@ -15,10 +15,9 @@
 # limitations under the License.
 # limitations under the License.
 
 
 import logging
 import logging
+import urllib
 from typing import Any, Dict, Optional
 from typing import Any, Dict, Optional
 
 
-from six.moves import urllib
-
 from twisted.internet import defer
 from twisted.internet import defer
 
 
 from synapse.api.constants import Membership
 from synapse.api.constants import Membership

+ 1 - 3
synapse/groups/groups_server.py

@@ -17,8 +17,6 @@
 
 
 import logging
 import logging
 
 
-from six import string_types
-
 from synapse.api.errors import Codes, SynapseError
 from synapse.api.errors import Codes, SynapseError
 from synapse.types import GroupID, RoomID, UserID, get_domain_from_id
 from synapse.types import GroupID, RoomID, UserID, get_domain_from_id
 from synapse.util.async_helpers import concurrently_execute
 from synapse.util.async_helpers import concurrently_execute
@@ -513,7 +511,7 @@ class GroupsServerHandler(GroupsServerWorkerHandler):
         for keyname in ("name", "avatar_url", "short_description", "long_description"):
         for keyname in ("name", "avatar_url", "short_description", "long_description"):
             if keyname in content:
             if keyname in content:
                 value = content[keyname]
                 value = content[keyname]
-                if not isinstance(value, string_types):
+                if not isinstance(value, str):
                     raise SynapseError(400, "%r value is not a string" % (keyname,))
                     raise SynapseError(400, "%r value is not a string" % (keyname,))
                 profile[keyname] = value
                 profile[keyname] = value
 
 

+ 1 - 2
synapse/handlers/cas_handler.py

@@ -14,11 +14,10 @@
 # limitations under the License.
 # limitations under the License.
 
 
 import logging
 import logging
+import urllib
 import xml.etree.ElementTree as ET
 import xml.etree.ElementTree as ET
 from typing import Dict, Optional, Tuple
 from typing import Dict, Optional, Tuple
 
 
-from six.moves import urllib
-
 from twisted.web.client import PartialDownloadError
 from twisted.web.client import PartialDownloadError
 
 
 from synapse.api.errors import Codes, LoginError
 from synapse.api.errors import Codes, LoginError

+ 4 - 5
synapse/handlers/federation.py

@@ -19,10 +19,9 @@
 
 
 import itertools
 import itertools
 import logging
 import logging
+from http import HTTPStatus
 from typing import Dict, Iterable, List, Optional, Sequence, Tuple
 from typing import Dict, Iterable, List, Optional, Sequence, Tuple
 
 
-from six.moves import http_client, zip
-
 import attr
 import attr
 from signedjson.key import decode_verify_key_bytes
 from signedjson.key import decode_verify_key_bytes
 from signedjson.sign import verify_signed_json
 from signedjson.sign import verify_signed_json
@@ -1194,7 +1193,7 @@ class FederationHandler(BaseHandler):
                 ev.event_id,
                 ev.event_id,
                 len(ev.prev_event_ids()),
                 len(ev.prev_event_ids()),
             )
             )
-            raise SynapseError(http_client.BAD_REQUEST, "Too many prev_events")
+            raise SynapseError(HTTPStatus.BAD_REQUEST, "Too many prev_events")
 
 
         if len(ev.auth_event_ids()) > 10:
         if len(ev.auth_event_ids()) > 10:
             logger.warning(
             logger.warning(
@@ -1202,7 +1201,7 @@ class FederationHandler(BaseHandler):
                 ev.event_id,
                 ev.event_id,
                 len(ev.auth_event_ids()),
                 len(ev.auth_event_ids()),
             )
             )
-            raise SynapseError(http_client.BAD_REQUEST, "Too many auth_events")
+            raise SynapseError(HTTPStatus.BAD_REQUEST, "Too many auth_events")
 
 
     async def send_invite(self, target_host, event):
     async def send_invite(self, target_host, event):
         """ Sends the invite to the remote server for signing.
         """ Sends the invite to the remote server for signing.
@@ -1545,7 +1544,7 @@ class FederationHandler(BaseHandler):
 
 
         # block any attempts to invite the server notices mxid
         # block any attempts to invite the server notices mxid
         if event.state_key == self._server_notices_mxid:
         if event.state_key == self._server_notices_mxid:
-            raise SynapseError(http_client.FORBIDDEN, "Cannot invite this user")
+            raise SynapseError(HTTPStatus.FORBIDDEN, "Cannot invite this user")
 
 
         # keep a record of the room version, if we don't yet know it.
         # keep a record of the room version, if we don't yet know it.
         # (this may get overwritten if we later get a different room version in a
         # (this may get overwritten if we later get a different room version in a

+ 1 - 3
synapse/handlers/message.py

@@ -17,8 +17,6 @@
 import logging
 import logging
 from typing import Optional, Tuple
 from typing import Optional, Tuple
 
 
-from six import string_types
-
 from canonicaljson import encode_canonical_json, json
 from canonicaljson import encode_canonical_json, json
 
 
 from twisted.internet import defer
 from twisted.internet import defer
@@ -715,7 +713,7 @@ class EventCreationHandler(object):
 
 
             spam_error = self.spam_checker.check_event_for_spam(event)
             spam_error = self.spam_checker.check_event_for_spam(event)
             if spam_error:
             if spam_error:
-                if not isinstance(spam_error, string_types):
+                if not isinstance(spam_error, str):
                     spam_error = "Spam is not permitted here"
                     spam_error = "Spam is not permitted here"
                 raise SynapseError(403, spam_error, Codes.FORBIDDEN)
                 raise SynapseError(403, spam_error, Codes.FORBIDDEN)
 
 

+ 3 - 5
synapse/handlers/profile.py

@@ -15,8 +15,6 @@
 
 
 import logging
 import logging
 
 
-from six import raise_from
-
 from twisted.internet import defer
 from twisted.internet import defer
 
 
 from synapse.api.errors import (
 from synapse.api.errors import (
@@ -84,7 +82,7 @@ class BaseProfileHandler(BaseHandler):
                 )
                 )
                 return result
                 return result
             except RequestSendFailed as e:
             except RequestSendFailed as e:
-                raise_from(SynapseError(502, "Failed to fetch profile"), e)
+                raise SynapseError(502, "Failed to fetch profile") from e
             except HttpResponseException as e:
             except HttpResponseException as e:
                 raise e.to_synapse_error()
                 raise e.to_synapse_error()
 
 
@@ -135,7 +133,7 @@ class BaseProfileHandler(BaseHandler):
                     ignore_backoff=True,
                     ignore_backoff=True,
                 )
                 )
             except RequestSendFailed as e:
             except RequestSendFailed as e:
-                raise_from(SynapseError(502, "Failed to fetch profile"), e)
+                raise SynapseError(502, "Failed to fetch profile") from e
             except HttpResponseException as e:
             except HttpResponseException as e:
                 raise e.to_synapse_error()
                 raise e.to_synapse_error()
 
 
@@ -212,7 +210,7 @@ class BaseProfileHandler(BaseHandler):
                     ignore_backoff=True,
                     ignore_backoff=True,
                 )
                 )
             except RequestSendFailed as e:
             except RequestSendFailed as e:
-                raise_from(SynapseError(502, "Failed to fetch profile"), e)
+                raise SynapseError(502, "Failed to fetch profile") from e
             except HttpResponseException as e:
             except HttpResponseException as e:
                 raise e.to_synapse_error()
                 raise e.to_synapse_error()
 
 

+ 1 - 3
synapse/handlers/room.py

@@ -24,8 +24,6 @@ import string
 from collections import OrderedDict
 from collections import OrderedDict
 from typing import Tuple
 from typing import Tuple
 
 
-from six import string_types
-
 from synapse.api.constants import (
 from synapse.api.constants import (
     EventTypes,
     EventTypes,
     JoinRules,
     JoinRules,
@@ -595,7 +593,7 @@ class RoomCreationHandler(BaseHandler):
             "room_version", self.config.default_room_version.identifier
             "room_version", self.config.default_room_version.identifier
         )
         )
 
 
-        if not isinstance(room_version_id, string_types):
+        if not isinstance(room_version_id, str):
             raise SynapseError(400, "room_version must be a string", Codes.BAD_JSON)
             raise SynapseError(400, "room_version must be a string", Codes.BAD_JSON)
 
 
         room_version = KNOWN_ROOM_VERSIONS.get(room_version_id)
         room_version = KNOWN_ROOM_VERSIONS.get(room_version_id)

+ 3 - 4
synapse/handlers/room_member.py

@@ -17,10 +17,9 @@
 
 
 import abc
 import abc
 import logging
 import logging
+from http import HTTPStatus
 from typing import Dict, Iterable, List, Optional, Tuple
 from typing import Dict, Iterable, List, Optional, Tuple
 
 
-from six.moves import http_client
-
 from synapse import types
 from synapse import types
 from synapse.api.constants import EventTypes, Membership
 from synapse.api.constants import EventTypes, Membership
 from synapse.api.errors import AuthError, Codes, SynapseError
 from synapse.api.errors import AuthError, Codes, SynapseError
@@ -361,7 +360,7 @@ class RoomMemberHandler(object):
         if effective_membership_state == Membership.INVITE:
         if effective_membership_state == Membership.INVITE:
             # block any attempts to invite the server notices mxid
             # block any attempts to invite the server notices mxid
             if target.to_string() == self._server_notices_mxid:
             if target.to_string() == self._server_notices_mxid:
-                raise SynapseError(http_client.FORBIDDEN, "Cannot invite this user")
+                raise SynapseError(HTTPStatus.FORBIDDEN, "Cannot invite this user")
 
 
             block_invite = False
             block_invite = False
 
 
@@ -444,7 +443,7 @@ class RoomMemberHandler(object):
                 is_blocked = await self._is_server_notice_room(room_id)
                 is_blocked = await self._is_server_notice_room(room_id)
                 if is_blocked:
                 if is_blocked:
                     raise SynapseError(
                     raise SynapseError(
-                        http_client.FORBIDDEN,
+                        HTTPStatus.FORBIDDEN,
                         "You cannot reject this invite",
                         "You cannot reject this invite",
                         errcode=Codes.CANNOT_LEAVE_SERVER_NOTICE_ROOM,
                         errcode=Codes.CANNOT_LEAVE_SERVER_NOTICE_ROOM,
                     )
                     )

+ 3 - 5
synapse/http/client.py

@@ -15,11 +15,9 @@
 # limitations under the License.
 # limitations under the License.
 
 
 import logging
 import logging
+import urllib
 from io import BytesIO
 from io import BytesIO
 
 
-from six import raise_from, text_type
-from six.moves import urllib
-
 import treq
 import treq
 from canonicaljson import encode_canonical_json, json
 from canonicaljson import encode_canonical_json, json
 from netaddr import IPAddress
 from netaddr import IPAddress
@@ -577,7 +575,7 @@ class SimpleHttpClient(object):
             # This can happen e.g. because the body is too large.
             # This can happen e.g. because the body is too large.
             raise
             raise
         except Exception as e:
         except Exception as e:
-            raise_from(SynapseError(502, ("Failed to download remote body: %s" % e)), e)
+            raise SynapseError(502, ("Failed to download remote body: %s" % e)) from e
 
 
         return (
         return (
             length,
             length,
@@ -638,7 +636,7 @@ def encode_urlencode_args(args):
 
 
 
 
 def encode_urlencode_arg(arg):
 def encode_urlencode_arg(arg):
-    if isinstance(arg, text_type):
+    if isinstance(arg, str):
         return arg.encode("utf-8")
         return arg.encode("utf-8")
     elif isinstance(arg, list):
     elif isinstance(arg, list):
         return [encode_urlencode_arg(i) for i in arg]
         return [encode_urlencode_arg(i) for i in arg]

+ 5 - 7
synapse/http/matrixfederationclient.py

@@ -17,11 +17,9 @@ import cgi
 import logging
 import logging
 import random
 import random
 import sys
 import sys
+import urllib
 from io import BytesIO
 from io import BytesIO
 
 
-from six import raise_from, string_types
-from six.moves import urllib
-
 import attr
 import attr
 import treq
 import treq
 from canonicaljson import encode_canonical_json
 from canonicaljson import encode_canonical_json
@@ -432,10 +430,10 @@ class MatrixFederationHttpClient(object):
                     except TimeoutError as e:
                     except TimeoutError as e:
                         raise RequestSendFailed(e, can_retry=True) from e
                         raise RequestSendFailed(e, can_retry=True) from e
                     except DNSLookupError as e:
                     except DNSLookupError as e:
-                        raise_from(RequestSendFailed(e, can_retry=retry_on_dns_fail), e)
+                        raise RequestSendFailed(e, can_retry=retry_on_dns_fail) from e
                     except Exception as e:
                     except Exception as e:
                         logger.info("Failed to send request: %s", e)
                         logger.info("Failed to send request: %s", e)
-                        raise_from(RequestSendFailed(e, can_retry=True), e)
+                        raise RequestSendFailed(e, can_retry=True) from e
 
 
                     incoming_responses_counter.labels(
                     incoming_responses_counter.labels(
                         request.method, response.code
                         request.method, response.code
@@ -487,7 +485,7 @@ class MatrixFederationHttpClient(object):
                         # Retry if the error is a 429 (Too Many Requests),
                         # Retry if the error is a 429 (Too Many Requests),
                         # otherwise just raise a standard HttpResponseException
                         # otherwise just raise a standard HttpResponseException
                         if response.code == 429:
                         if response.code == 429:
-                            raise_from(RequestSendFailed(e, can_retry=True), e)
+                            raise RequestSendFailed(e, can_retry=True) from e
                         else:
                         else:
                             raise e
                             raise e
 
 
@@ -998,7 +996,7 @@ def encode_query_args(args):
 
 
     encoded_args = {}
     encoded_args = {}
     for k, vs in args.items():
     for k, vs in args.items():
-        if isinstance(vs, string_types):
+        if isinstance(vs, str):
             vs = [vs]
             vs = [vs]
         encoded_args[k] = [v.encode("UTF-8") for v in vs]
         encoded_args[k] = [v.encode("UTF-8") for v in vs]
 
 

+ 2 - 2
synapse/http/server.py

@@ -16,10 +16,10 @@
 
 
 import collections
 import collections
 import html
 import html
-import http.client
 import logging
 import logging
 import types
 import types
 import urllib
 import urllib
+from http import HTTPStatus
 from io import BytesIO
 from io import BytesIO
 from typing import Awaitable, Callable, TypeVar, Union
 from typing import Awaitable, Callable, TypeVar, Union
 
 
@@ -188,7 +188,7 @@ def return_html_error(
                 exc_info=(f.type, f.value, f.getTracebackObject()),
                 exc_info=(f.type, f.value, f.getTracebackObject()),
             )
             )
     else:
     else:
-        code = http.HTTPStatus.INTERNAL_SERVER_ERROR
+        code = HTTPStatus.INTERNAL_SERVER_ERROR
         msg = "Internal server error"
         msg = "Internal server error"
 
 
         logger.error(
         logger.error(

+ 1 - 2
synapse/logging/formatter.py

@@ -16,8 +16,7 @@
 
 
 import logging
 import logging
 import traceback
 import traceback
-
-from six import StringIO
+from io import StringIO
 
 
 
 
 class LogFormatter(logging.Formatter):
 class LogFormatter(logging.Formatter):

+ 1 - 2
synapse/push/mailer.py

@@ -17,12 +17,11 @@ import email.mime.multipart
 import email.utils
 import email.utils
 import logging
 import logging
 import time
 import time
+import urllib
 from email.mime.multipart import MIMEMultipart
 from email.mime.multipart import MIMEMultipart
 from email.mime.text import MIMEText
 from email.mime.text import MIMEText
 from typing import Iterable, List, TypeVar
 from typing import Iterable, List, TypeVar
 
 
-from six.moves import urllib
-
 import bleach
 import bleach
 import jinja2
 import jinja2
 
 

+ 1 - 3
synapse/push/push_rule_evaluator.py

@@ -18,8 +18,6 @@ import logging
 import re
 import re
 from typing import Pattern
 from typing import Pattern
 
 
-from six import string_types
-
 from synapse.events import EventBase
 from synapse.events import EventBase
 from synapse.types import UserID
 from synapse.types import UserID
 from synapse.util.caches import register_cache
 from synapse.util.caches import register_cache
@@ -244,7 +242,7 @@ def _flatten_dict(d, prefix=[], result=None):
     if result is None:
     if result is None:
         result = {}
         result = {}
     for key, value in d.items():
     for key, value in d.items():
-        if isinstance(value, string_types):
+        if isinstance(value, str):
             result[".".join(prefix + [key])] = value.lower()
             result[".".join(prefix + [key])] = value.lower()
         elif hasattr(value, "items"):
         elif hasattr(value, "items"):
             _flatten_dict(value, prefix=(prefix + [key]), result=result)
             _flatten_dict(value, prefix=(prefix + [key]), result=result)

+ 0 - 1
synapse/python_dependencies.py

@@ -66,7 +66,6 @@ REQUIREMENTS = [
     "pymacaroons>=0.13.0",
     "pymacaroons>=0.13.0",
     "msgpack>=0.5.2",
     "msgpack>=0.5.2",
     "phonenumbers>=8.2.0",
     "phonenumbers>=8.2.0",
-    "six>=1.10",
     "prometheus_client>=0.0.18,<0.8.0",
     "prometheus_client>=0.0.18,<0.8.0",
     # we use attr.validators.deep_iterable, which arrived in 19.1.0
     # we use attr.validators.deep_iterable, which arrived in 19.1.0
     "attrs>=19.1.0",
     "attrs>=19.1.0",

+ 2 - 4
synapse/replication/http/_base.py

@@ -16,12 +16,10 @@
 import abc
 import abc
 import logging
 import logging
 import re
 import re
+import urllib
 from inspect import signature
 from inspect import signature
 from typing import Dict, List, Tuple
 from typing import Dict, List, Tuple
 
 
-from six import raise_from
-from six.moves import urllib
-
 from twisted.internet import defer
 from twisted.internet import defer
 
 
 from synapse.api.errors import (
 from synapse.api.errors import (
@@ -220,7 +218,7 @@ class ReplicationEndpoint(object):
                 # importantly, not stack traces everywhere)
                 # importantly, not stack traces everywhere)
                 raise e.to_synapse_error()
                 raise e.to_synapse_error()
             except RequestSendFailed as e:
             except RequestSendFailed as e:
-                raise_from(SynapseError(502, "Failed to talk to master"), e)
+                raise SynapseError(502, "Failed to talk to master") from e
 
 
             return result
             return result
 
 

+ 6 - 14
synapse/rest/admin/users.py

@@ -16,9 +16,7 @@ import hashlib
 import hmac
 import hmac
 import logging
 import logging
 import re
 import re
-
-from six import text_type
-from six.moves import http_client
+from http import HTTPStatus
 
 
 from synapse.api.constants import UserTypes
 from synapse.api.constants import UserTypes
 from synapse.api.errors import Codes, NotFoundError, SynapseError
 from synapse.api.errors import Codes, NotFoundError, SynapseError
@@ -215,10 +213,7 @@ class UserRestServletV2(RestServlet):
                     await self.store.set_server_admin(target_user, set_admin_to)
                     await self.store.set_server_admin(target_user, set_admin_to)
 
 
             if "password" in body:
             if "password" in body:
-                if (
-                    not isinstance(body["password"], text_type)
-                    or len(body["password"]) > 512
-                ):
+                if not isinstance(body["password"], str) or len(body["password"]) > 512:
                     raise SynapseError(400, "Invalid password")
                     raise SynapseError(400, "Invalid password")
                 else:
                 else:
                     new_password = body["password"]
                     new_password = body["password"]
@@ -252,7 +247,7 @@ class UserRestServletV2(RestServlet):
             password = body.get("password")
             password = body.get("password")
             password_hash = None
             password_hash = None
             if password is not None:
             if password is not None:
-                if not isinstance(password, text_type) or len(password) > 512:
+                if not isinstance(password, str) or len(password) > 512:
                     raise SynapseError(400, "Invalid password")
                     raise SynapseError(400, "Invalid password")
                 password_hash = await self.auth_handler.hash(password)
                 password_hash = await self.auth_handler.hash(password)
 
 
@@ -370,10 +365,7 @@ class UserRegisterServlet(RestServlet):
                 400, "username must be specified", errcode=Codes.BAD_JSON
                 400, "username must be specified", errcode=Codes.BAD_JSON
             )
             )
         else:
         else:
-            if (
-                not isinstance(body["username"], text_type)
-                or len(body["username"]) > 512
-            ):
+            if not isinstance(body["username"], str) or len(body["username"]) > 512:
                 raise SynapseError(400, "Invalid username")
                 raise SynapseError(400, "Invalid username")
 
 
             username = body["username"].encode("utf-8")
             username = body["username"].encode("utf-8")
@@ -386,7 +378,7 @@ class UserRegisterServlet(RestServlet):
             )
             )
         else:
         else:
             password = body["password"]
             password = body["password"]
-            if not isinstance(password, text_type) or len(password) > 512:
+            if not isinstance(password, str) or len(password) > 512:
                 raise SynapseError(400, "Invalid password")
                 raise SynapseError(400, "Invalid password")
 
 
             password_bytes = password.encode("utf-8")
             password_bytes = password.encode("utf-8")
@@ -477,7 +469,7 @@ class DeactivateAccountRestServlet(RestServlet):
         erase = body.get("erase", False)
         erase = body.get("erase", False)
         if not isinstance(erase, bool):
         if not isinstance(erase, bool):
             raise SynapseError(
             raise SynapseError(
-                http_client.BAD_REQUEST,
+                HTTPStatus.BAD_REQUEST,
                 "Param 'erase' must be a boolean, if given",
                 "Param 'erase' must be a boolean, if given",
                 Codes.BAD_JSON,
                 Codes.BAD_JSON,
             )
             )

+ 1 - 3
synapse/rest/client/v1/presence.py

@@ -17,8 +17,6 @@
 """
 """
 import logging
 import logging
 
 
-from six import string_types
-
 from synapse.api.errors import AuthError, SynapseError
 from synapse.api.errors import AuthError, SynapseError
 from synapse.handlers.presence import format_user_presence_state
 from synapse.handlers.presence import format_user_presence_state
 from synapse.http.servlet import RestServlet, parse_json_object_from_request
 from synapse.http.servlet import RestServlet, parse_json_object_from_request
@@ -73,7 +71,7 @@ class PresenceStatusRestServlet(RestServlet):
 
 
             if "status_msg" in content:
             if "status_msg" in content:
                 state["status_msg"] = content.pop("status_msg")
                 state["status_msg"] = content.pop("status_msg")
-                if not isinstance(state["status_msg"], string_types):
+                if not isinstance(state["status_msg"], str):
                     raise SynapseError(400, "status_msg must be a string.")
                     raise SynapseError(400, "status_msg must be a string.")
 
 
             if content:
             if content:

+ 1 - 2
synapse/rest/client/v1/room.py

@@ -18,8 +18,7 @@
 import logging
 import logging
 import re
 import re
 from typing import List, Optional
 from typing import List, Optional
-
-from six.moves.urllib import parse as urlparse
+from urllib import parse as urlparse
 
 
 from canonicaljson import json
 from canonicaljson import json
 
 

+ 2 - 3
synapse/rest/client/v2_alpha/account.py

@@ -15,8 +15,7 @@
 # See the License for the specific language governing permissions and
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # limitations under the License.
 import logging
 import logging
-
-from six.moves import http_client
+from http import HTTPStatus
 
 
 from synapse.api.constants import LoginType
 from synapse.api.constants import LoginType
 from synapse.api.errors import Codes, SynapseError, ThreepidValidationError
 from synapse.api.errors import Codes, SynapseError, ThreepidValidationError
@@ -321,7 +320,7 @@ class DeactivateAccountRestServlet(RestServlet):
         erase = body.get("erase", False)
         erase = body.get("erase", False)
         if not isinstance(erase, bool):
         if not isinstance(erase, bool):
             raise SynapseError(
             raise SynapseError(
-                http_client.BAD_REQUEST,
+                HTTPStatus.BAD_REQUEST,
                 "Param 'erase' must be a boolean, if given",
                 "Param 'erase' must be a boolean, if given",
                 Codes.BAD_JSON,
                 Codes.BAD_JSON,
             )
             )

+ 3 - 8
synapse/rest/client/v2_alpha/register.py

@@ -18,8 +18,6 @@ import hmac
 import logging
 import logging
 from typing import List, Union
 from typing import List, Union
 
 
-from six import string_types
-
 import synapse
 import synapse
 import synapse.api.auth
 import synapse.api.auth
 import synapse.types
 import synapse.types
@@ -413,7 +411,7 @@ class RegisterRestServlet(RestServlet):
         # in sessions. Pull out the username/password provided to us.
         # in sessions. Pull out the username/password provided to us.
         if "password" in body:
         if "password" in body:
             password = body.pop("password")
             password = body.pop("password")
-            if not isinstance(password, string_types) or len(password) > 512:
+            if not isinstance(password, str) or len(password) > 512:
                 raise SynapseError(400, "Invalid password")
                 raise SynapseError(400, "Invalid password")
             self.password_policy_handler.validate_password(password)
             self.password_policy_handler.validate_password(password)
 
 
@@ -425,10 +423,7 @@ class RegisterRestServlet(RestServlet):
 
 
         desired_username = None
         desired_username = None
         if "username" in body:
         if "username" in body:
-            if (
-                not isinstance(body["username"], string_types)
-                or len(body["username"]) > 512
-            ):
+            if not isinstance(body["username"], str) or len(body["username"]) > 512:
                 raise SynapseError(400, "Invalid username")
                 raise SynapseError(400, "Invalid username")
             desired_username = body["username"]
             desired_username = body["username"]
 
 
@@ -453,7 +448,7 @@ class RegisterRestServlet(RestServlet):
 
 
             access_token = self.auth.get_access_token_from_request(request)
             access_token = self.auth.get_access_token_from_request(request)
 
 
-            if isinstance(desired_username, string_types):
+            if isinstance(desired_username, str):
                 result = await self._do_appservice_registration(
                 result = await self._do_appservice_registration(
                     desired_username, access_token, body
                     desired_username, access_token, body
                 )
                 )

+ 4 - 6
synapse/rest/client/v2_alpha/report_event.py

@@ -14,9 +14,7 @@
 # limitations under the License.
 # limitations under the License.
 
 
 import logging
 import logging
-
-from six import string_types
-from six.moves import http_client
+from http import HTTPStatus
 
 
 from synapse.api.errors import Codes, SynapseError
 from synapse.api.errors import Codes, SynapseError
 from synapse.http.servlet import (
 from synapse.http.servlet import (
@@ -47,15 +45,15 @@ class ReportEventRestServlet(RestServlet):
         body = parse_json_object_from_request(request)
         body = parse_json_object_from_request(request)
         assert_params_in_dict(body, ("reason", "score"))
         assert_params_in_dict(body, ("reason", "score"))
 
 
-        if not isinstance(body["reason"], string_types):
+        if not isinstance(body["reason"], str):
             raise SynapseError(
             raise SynapseError(
-                http_client.BAD_REQUEST,
+                HTTPStatus.BAD_REQUEST,
                 "Param 'reason' must be a string",
                 "Param 'reason' must be a string",
                 Codes.BAD_JSON,
                 Codes.BAD_JSON,
             )
             )
         if not isinstance(body["score"], int):
         if not isinstance(body["score"], int):
             raise SynapseError(
             raise SynapseError(
-                http_client.BAD_REQUEST,
+                HTTPStatus.BAD_REQUEST,
                 "Param 'score' must be an integer",
                 "Param 'score' must be an integer",
                 Codes.BAD_JSON,
                 Codes.BAD_JSON,
             )
             )

+ 2 - 3
synapse/rest/consent/consent_resource.py

@@ -16,10 +16,9 @@
 import hmac
 import hmac
 import logging
 import logging
 from hashlib import sha256
 from hashlib import sha256
+from http import HTTPStatus
 from os import path
 from os import path
 
 
-from six.moves import http_client
-
 import jinja2
 import jinja2
 from jinja2 import TemplateNotFound
 from jinja2 import TemplateNotFound
 
 
@@ -223,4 +222,4 @@ class ConsentResource(DirectServeResource):
         )
         )
 
 
         if not compare_digest(want_mac, userhmac):
         if not compare_digest(want_mac, userhmac):
-            raise SynapseError(http_client.FORBIDDEN, "HMAC incorrect")
+            raise SynapseError(HTTPStatus.FORBIDDEN, "HMAC incorrect")

+ 1 - 2
synapse/rest/media/v1/_base.py

@@ -16,8 +16,7 @@
 
 
 import logging
 import logging
 import os
 import os
-
-from six.moves import urllib
+import urllib
 
 
 from twisted.internet import defer
 from twisted.internet import defer
 from twisted.protocols.basic import FileSender
 from twisted.protocols.basic import FileSender

+ 1 - 5
synapse/rest/media/v1/media_storage.py

@@ -17,9 +17,6 @@ import contextlib
 import logging
 import logging
 import os
 import os
 import shutil
 import shutil
-import sys
-
-import six
 
 
 from twisted.internet import defer
 from twisted.internet import defer
 from twisted.protocols.basic import FileSender
 from twisted.protocols.basic import FileSender
@@ -117,12 +114,11 @@ class MediaStorage(object):
             with open(fname, "wb") as f:
             with open(fname, "wb") as f:
                 yield f, fname, finish
                 yield f, fname, finish
         except Exception:
         except Exception:
-            t, v, tb = sys.exc_info()
             try:
             try:
                 os.remove(fname)
                 os.remove(fname)
             except Exception:
             except Exception:
                 pass
                 pass
-            six.reraise(t, v, tb)
+            raise
 
 
         if not finished_called:
         if not finished_called:
             raise Exception("Finished callback not called")
             raise Exception("Finished callback not called")

+ 3 - 6
synapse/rest/media/v1/preview_url_resource.py

@@ -24,10 +24,7 @@ import shutil
 import sys
 import sys
 import traceback
 import traceback
 from typing import Dict, Optional
 from typing import Dict, Optional
-
-import six
-from six import string_types
-from six.moves import urllib_parse as urlparse
+from urllib import parse as urlparse
 
 
 from canonicaljson import json
 from canonicaljson import json
 
 
@@ -188,7 +185,7 @@ class PreviewUrlResource(DirectServeResource):
             # It may be stored as text in the database, not as bytes (such as
             # It may be stored as text in the database, not as bytes (such as
             # PostgreSQL). If so, encode it back before handing it on.
             # PostgreSQL). If so, encode it back before handing it on.
             og = cache_result["og"]
             og = cache_result["og"]
-            if isinstance(og, six.text_type):
+            if isinstance(og, str):
                 og = og.encode("utf8")
                 og = og.encode("utf8")
             return og
             return og
 
 
@@ -631,7 +628,7 @@ def _iterate_over_text(tree, *tags_to_ignore):
         if el is None:
         if el is None:
             return
             return
 
 
-        if isinstance(el, string_types):
+        if isinstance(el, str):
             yield el
             yield el
         elif el.tag not in tags_to_ignore:
         elif el.tag not in tags_to_ignore:
             # el.text is the text before the first child, so we can immediately
             # el.text is the text before the first child, so we can immediately

+ 1 - 3
synapse/server_notices/consent_server_notices.py

@@ -14,8 +14,6 @@
 # limitations under the License.
 # limitations under the License.
 import logging
 import logging
 
 
-from six import string_types
-
 from synapse.api.errors import SynapseError
 from synapse.api.errors import SynapseError
 from synapse.api.urls import ConsentURIBuilder
 from synapse.api.urls import ConsentURIBuilder
 from synapse.config import ConfigError
 from synapse.config import ConfigError
@@ -118,7 +116,7 @@ def copy_with_str_subst(x, substitutions):
     Returns:
     Returns:
         copy of x
         copy of x
     """
     """
-    if isinstance(x, string_types):
+    if isinstance(x, str):
         return x % substitutions
         return x % substitutions
     if isinstance(x, dict):
     if isinstance(x, dict):
         return {k: copy_with_str_subst(v, substitutions) for (k, v) in x.items()}
         return {k: copy_with_str_subst(v, substitutions) for (k, v) in x.items()}

+ 1 - 2
synapse/storage/data_stores/main/event_federation.py

@@ -14,10 +14,9 @@
 # limitations under the License.
 # limitations under the License.
 import itertools
 import itertools
 import logging
 import logging
+from queue import Empty, PriorityQueue
 from typing import Dict, List, Optional, Set, Tuple
 from typing import Dict, List, Optional, Set, Tuple
 
 
-from six.moves.queue import Empty, PriorityQueue
-
 from twisted.internet import defer
 from twisted.internet import defer
 
 
 from synapse.api.errors import StoreError
 from synapse.api.errors import StoreError

+ 3 - 7
synapse/storage/data_stores/main/events.py

@@ -21,9 +21,6 @@ from collections import OrderedDict, namedtuple
 from functools import wraps
 from functools import wraps
 from typing import TYPE_CHECKING, Dict, Iterable, List, Tuple
 from typing import TYPE_CHECKING, Dict, Iterable, List, Tuple
 
 
-from six import integer_types, text_type
-from six.moves import range
-
 import attr
 import attr
 from canonicaljson import json
 from canonicaljson import json
 from prometheus_client import Counter
 from prometheus_client import Counter
@@ -893,8 +890,7 @@ class PersistEventsStore:
                     "received_ts": self._clock.time_msec(),
                     "received_ts": self._clock.time_msec(),
                     "sender": event.sender,
                     "sender": event.sender,
                     "contains_url": (
                     "contains_url": (
-                        "url" in event.content
-                        and isinstance(event.content["url"], text_type)
+                        "url" in event.content and isinstance(event.content["url"], str)
                     ),
                     ),
                 }
                 }
                 for event, _ in events_and_contexts
                 for event, _ in events_and_contexts
@@ -1345,10 +1341,10 @@ class PersistEventsStore:
         ):
         ):
             if (
             if (
                 "min_lifetime" in event.content
                 "min_lifetime" in event.content
-                and not isinstance(event.content.get("min_lifetime"), integer_types)
+                and not isinstance(event.content.get("min_lifetime"), int)
             ) or (
             ) or (
                 "max_lifetime" in event.content
                 "max_lifetime" in event.content
-                and not isinstance(event.content.get("max_lifetime"), integer_types)
+                and not isinstance(event.content.get("max_lifetime"), int)
             ):
             ):
                 # Ignore the event if one of the value isn't an integer.
                 # Ignore the event if one of the value isn't an integer.
                 return
                 return

+ 1 - 3
synapse/storage/data_stores/main/events_bg_updates.py

@@ -15,8 +15,6 @@
 
 
 import logging
 import logging
 
 
-from six import text_type
-
 from canonicaljson import json
 from canonicaljson import json
 
 
 from twisted.internet import defer
 from twisted.internet import defer
@@ -133,7 +131,7 @@ class EventsBackgroundUpdatesStore(SQLBaseStore):
 
 
                     contains_url = "url" in content
                     contains_url = "url" in content
                     if contains_url:
                     if contains_url:
-                        contains_url &= isinstance(content["url"], text_type)
+                        contains_url &= isinstance(content["url"], str)
                 except (KeyError, AttributeError):
                 except (KeyError, AttributeError):
                     # If the event is missing a necessary field then
                     # If the event is missing a necessary field then
                     # skip over it.
                     # skip over it.

+ 0 - 2
synapse/storage/data_stores/main/schema/delta/30/as_users.py

@@ -13,8 +13,6 @@
 # limitations under the License.
 # limitations under the License.
 import logging
 import logging
 
 
-from six.moves import range
-
 from synapse.config.appservice import load_appservices
 from synapse.config.appservice import load_appservices
 
 
 logger = logging.getLogger(__name__)
 logger = logging.getLogger(__name__)

+ 1 - 3
synapse/storage/data_stores/main/search.py

@@ -17,8 +17,6 @@ import logging
 import re
 import re
 from collections import namedtuple
 from collections import namedtuple
 
 
-from six import string_types
-
 from canonicaljson import json
 from canonicaljson import json
 
 
 from twisted.internet import defer
 from twisted.internet import defer
@@ -180,7 +178,7 @@ class SearchBackgroundUpdateStore(SearchWorkerStore):
                     # skip over it.
                     # skip over it.
                     continue
                     continue
 
 
-                if not isinstance(value, string_types):
+                if not isinstance(value, str):
                     # If the event body, name or topic isn't a string
                     # If the event body, name or topic isn't a string
                     # then skip over it
                     # then skip over it
                     continue
                     continue

+ 0 - 2
synapse/storage/data_stores/main/stream.py

@@ -40,8 +40,6 @@ import abc
 import logging
 import logging
 from collections import namedtuple
 from collections import namedtuple
 
 
-from six.moves import range
-
 from twisted.internet import defer
 from twisted.internet import defer
 
 
 from synapse.logging.context import make_deferred_yieldable, run_in_background
 from synapse.logging.context import make_deferred_yieldable, run_in_background

+ 0 - 2
synapse/storage/data_stores/main/tags.py

@@ -16,8 +16,6 @@
 
 
 import logging
 import logging
 
 
-from six.moves import range
-
 from canonicaljson import json
 from canonicaljson import json
 
 
 from twisted.internet import defer
 from twisted.internet import defer

+ 0 - 2
synapse/storage/data_stores/state/store.py

@@ -17,8 +17,6 @@ import logging
 from collections import namedtuple
 from collections import namedtuple
 from typing import Dict, Iterable, List, Set, Tuple
 from typing import Dict, Iterable, List, Set, Tuple
 
 
-from six.moves import range
-
 from twisted.internet import defer
 from twisted.internet import defer
 
 
 from synapse.api.constants import EventTypes
 from synapse.api.constants import EventTypes

+ 1 - 2
synapse/storage/database.py

@@ -16,6 +16,7 @@
 # limitations under the License.
 # limitations under the License.
 import logging
 import logging
 import time
 import time
+from sys import intern
 from time import monotonic as monotonic_time
 from time import monotonic as monotonic_time
 from typing import (
 from typing import (
     Any,
     Any,
@@ -29,8 +30,6 @@ from typing import (
     TypeVar,
     TypeVar,
 )
 )
 
 
-from six.moves import intern, range
-
 from prometheus_client import Histogram
 from prometheus_client import Histogram
 
 
 from twisted.enterprise import adbapi
 from twisted.enterprise import adbapi

+ 0 - 2
synapse/storage/persist_events.py

@@ -20,8 +20,6 @@ import logging
 from collections import deque, namedtuple
 from collections import deque, namedtuple
 from typing import Iterable, List, Optional, Set, Tuple
 from typing import Iterable, List, Optional, Set, Tuple
 
 
-from six.moves import range
-
 from prometheus_client import Counter, Histogram
 from prometheus_client import Counter, Histogram
 
 
 from twisted.internet import defer
 from twisted.internet import defer

+ 0 - 2
synapse/util/async_helpers.py

@@ -19,8 +19,6 @@ import logging
 from contextlib import contextmanager
 from contextlib import contextmanager
 from typing import Dict, Sequence, Set, Union
 from typing import Dict, Sequence, Set, Union
 
 
-from six.moves import range
-
 import attr
 import attr
 
 
 from twisted.internet import defer
 from twisted.internet import defer

+ 1 - 3
synapse/util/caches/stream_change_cache.py

@@ -17,8 +17,6 @@ import logging
 import math
 import math
 from typing import Dict, FrozenSet, List, Mapping, Optional, Set, Union
 from typing import Dict, FrozenSet, List, Mapping, Optional, Set, Union
 
 
-from six import integer_types
-
 from sortedcontainers import SortedDict
 from sortedcontainers import SortedDict
 
 
 from synapse.types import Collection
 from synapse.types import Collection
@@ -88,7 +86,7 @@ class StreamChangeCache:
     def has_entity_changed(self, entity: EntityType, stream_pos: int) -> bool:
     def has_entity_changed(self, entity: EntityType, stream_pos: int) -> bool:
         """Returns True if the entity may have been updated since stream_pos
         """Returns True if the entity may have been updated since stream_pos
         """
         """
-        assert type(stream_pos) in integer_types
+        assert isinstance(stream_pos, int)
 
 
         if stream_pos < self._earliest_known_stream_pos:
         if stream_pos < self._earliest_known_stream_pos:
             self.metrics.inc_misses()
             self.metrics.inc_misses()

+ 1 - 1
synapse/util/file_consumer.py

@@ -13,7 +13,7 @@
 # See the License for the specific language governing permissions and
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # limitations under the License.
 
 
-from six.moves import queue
+import queue
 
 
 from twisted.internet import threads
 from twisted.internet import threads
 
 

+ 2 - 4
synapse/util/frozenutils.py

@@ -13,8 +13,6 @@
 # See the License for the specific language governing permissions and
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # limitations under the License.
 
 
-from six import binary_type, text_type
-
 from canonicaljson import json
 from canonicaljson import json
 from frozendict import frozendict
 from frozendict import frozendict
 
 
@@ -26,7 +24,7 @@ def freeze(o):
     if isinstance(o, frozendict):
     if isinstance(o, frozendict):
         return o
         return o
 
 
-    if isinstance(o, (binary_type, text_type)):
+    if isinstance(o, (bytes, str)):
         return o
         return o
 
 
     try:
     try:
@@ -41,7 +39,7 @@ def unfreeze(o):
     if isinstance(o, (dict, frozendict)):
     if isinstance(o, (dict, frozendict)):
         return dict({k: unfreeze(v) for k, v in o.items()})
         return dict({k: unfreeze(v) for k, v in o.items()})
 
 
-    if isinstance(o, (binary_type, text_type)):
+    if isinstance(o, (bytes, str)):
         return o
         return o
 
 
     try:
     try:

+ 0 - 2
synapse/util/wheel_timer.py

@@ -13,8 +13,6 @@
 # See the License for the specific language governing permissions and
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # limitations under the License.
 
 
-from six.moves import range
-
 
 
 class _Entry(object):
 class _Entry(object):
     __slots__ = ["end_key", "queue"]
     __slots__ = ["end_key", "queue"]

+ 0 - 2
synapse/visibility.py

@@ -16,8 +16,6 @@
 import logging
 import logging
 import operator
 import operator
 
 
-from six.moves import map
-
 from twisted.internet import defer
 from twisted.internet import defer
 
 
 from synapse.api.constants import EventTypes, Membership
 from synapse.api.constants import EventTypes, Membership

+ 2 - 4
synctl

@@ -26,8 +26,6 @@ import subprocess
 import sys
 import sys
 import time
 import time
 
 
-from six import iteritems
-
 import yaml
 import yaml
 
 
 from synapse.config import find_config_files
 from synapse.config import find_config_files
@@ -251,7 +249,7 @@ def main():
         os.environ["SYNAPSE_CACHE_FACTOR"] = str(cache_factor)
         os.environ["SYNAPSE_CACHE_FACTOR"] = str(cache_factor)
 
 
     cache_factors = config.get("synctl_cache_factors", {})
     cache_factors = config.get("synctl_cache_factors", {})
-    for cache_name, factor in iteritems(cache_factors):
+    for cache_name, factor in cache_factors.items():
         os.environ["SYNAPSE_CACHE_FACTOR_" + cache_name.upper()] = str(factor)
         os.environ["SYNAPSE_CACHE_FACTOR_" + cache_name.upper()] = str(factor)
 
 
     worker_configfiles = []
     worker_configfiles = []
@@ -362,7 +360,7 @@ def main():
             if worker.cache_factor:
             if worker.cache_factor:
                 os.environ["SYNAPSE_CACHE_FACTOR"] = str(worker.cache_factor)
                 os.environ["SYNAPSE_CACHE_FACTOR"] = str(worker.cache_factor)
 
 
-            for cache_name, factor in iteritems(worker.cache_factors):
+            for cache_name, factor in worker.cache_factors.items():
                 os.environ["SYNAPSE_CACHE_FACTOR_" + cache_name.upper()] = str(factor)
                 os.environ["SYNAPSE_CACHE_FACTOR_" + cache_name.upper()] = str(factor)
 
 
             if not start_worker(worker.app, configfile, worker.configfile):
             if not start_worker(worker.app, configfile, worker.configfile):

+ 1 - 1
tests/rest/client/v1/test_rooms.py

@@ -19,9 +19,9 @@
 """Tests REST events for /rooms paths."""
 """Tests REST events for /rooms paths."""
 
 
 import json
 import json
+from urllib import parse as urlparse
 
 
 from mock import Mock
 from mock import Mock
-from six.moves.urllib import parse as urlparse
 
 
 from twisted.internet import defer
 from twisted.internet import defer
 
 

+ 4 - 5
tests/rest/client/v2_alpha/test_relations.py

@@ -15,8 +15,7 @@
 
 
 import itertools
 import itertools
 import json
 import json
-
-import six
+import urllib
 
 
 from synapse.api.constants import EventTypes, RelationTypes
 from synapse.api.constants import EventTypes, RelationTypes
 from synapse.rest import admin
 from synapse.rest import admin
@@ -134,7 +133,7 @@ class RelationsTestCase(unittest.HomeserverTestCase):
         # Make sure next_batch has something in it that looks like it could be a
         # Make sure next_batch has something in it that looks like it could be a
         # valid token.
         # valid token.
         self.assertIsInstance(
         self.assertIsInstance(
-            channel.json_body.get("next_batch"), six.string_types, channel.json_body
+            channel.json_body.get("next_batch"), str, channel.json_body
         )
         )
 
 
     def test_repeated_paginate_relations(self):
     def test_repeated_paginate_relations(self):
@@ -278,7 +277,7 @@ class RelationsTestCase(unittest.HomeserverTestCase):
 
 
         prev_token = None
         prev_token = None
         found_event_ids = []
         found_event_ids = []
-        encoded_key = six.moves.urllib.parse.quote_plus("👍".encode("utf-8"))
+        encoded_key = urllib.parse.quote_plus("👍".encode("utf-8"))
         for _ in range(20):
         for _ in range(20):
             from_token = ""
             from_token = ""
             if prev_token:
             if prev_token:
@@ -670,7 +669,7 @@ class RelationsTestCase(unittest.HomeserverTestCase):
 
 
         query = ""
         query = ""
         if key:
         if key:
-            query = "?key=" + six.moves.urllib.parse.quote_plus(key.encode("utf-8"))
+            query = "?key=" + urllib.parse.quote_plus(key.encode("utf-8"))
 
 
         original_id = parent_id if parent_id else self.parent_id
         original_id = parent_id if parent_id else self.parent_id
 
 

+ 1 - 1
tests/rest/media/v1/test_media_storage.py

@@ -20,9 +20,9 @@ import tempfile
 from binascii import unhexlify
 from binascii import unhexlify
 from io import BytesIO
 from io import BytesIO
 from typing import Optional
 from typing import Optional
+from urllib import parse
 
 
 from mock import Mock
 from mock import Mock
-from six.moves.urllib import parse
 
 
 import attr
 import attr
 import PIL.Image as Image
 import PIL.Image as Image

+ 1 - 3
tests/server.py

@@ -2,8 +2,6 @@ import json
 import logging
 import logging
 from io import BytesIO
 from io import BytesIO
 
 
-from six import text_type
-
 import attr
 import attr
 from zope.interface import implementer
 from zope.interface import implementer
 
 
@@ -174,7 +172,7 @@ def make_request(
     if not path.startswith(b"/"):
     if not path.startswith(b"/"):
         path = b"/" + path
         path = b"/" + path
 
 
-    if isinstance(content, text_type):
+    if isinstance(content, str):
         content = content.encode("utf8")
         content = content.encode("utf8")
 
 
     site = FakeSite()
     site = FakeSite()

+ 0 - 2
tests/state/test_v2.py

@@ -15,8 +15,6 @@
 
 
 import itertools
 import itertools
 
 
-from six.moves import zip
-
 import attr
 import attr
 
 
 from synapse.api.constants import EventTypes, JoinRules, Membership
 from synapse.api.constants import EventTypes, JoinRules, Membership

+ 1 - 2
tests/test_server.py

@@ -14,8 +14,7 @@
 
 
 import logging
 import logging
 import re
 import re
-
-from six import StringIO
+from io import StringIO
 
 
 from twisted.internet.defer import Deferred
 from twisted.internet.defer import Deferred
 from twisted.python.failure import Failure
 from twisted.python.failure import Failure

+ 4 - 5
tests/test_terms_auth.py

@@ -14,7 +14,6 @@
 
 
 import json
 import json
 
 
-import six
 from mock import Mock
 from mock import Mock
 
 
 from twisted.test.proto_helpers import MemoryReactorClock
 from twisted.test.proto_helpers import MemoryReactorClock
@@ -60,7 +59,7 @@ class TermsTestCase(unittest.HomeserverTestCase):
         self.assertEquals(channel.result["code"], b"401", channel.result)
         self.assertEquals(channel.result["code"], b"401", channel.result)
 
 
         self.assertTrue(channel.json_body is not None)
         self.assertTrue(channel.json_body is not None)
-        self.assertIsInstance(channel.json_body["session"], six.text_type)
+        self.assertIsInstance(channel.json_body["session"], str)
 
 
         self.assertIsInstance(channel.json_body["flows"], list)
         self.assertIsInstance(channel.json_body["flows"], list)
         for flow in channel.json_body["flows"]:
         for flow in channel.json_body["flows"]:
@@ -125,6 +124,6 @@ class TermsTestCase(unittest.HomeserverTestCase):
         self.assertEquals(channel.result["code"], b"200", channel.result)
         self.assertEquals(channel.result["code"], b"200", channel.result)
 
 
         self.assertTrue(channel.json_body is not None)
         self.assertTrue(channel.json_body is not None)
-        self.assertIsInstance(channel.json_body["user_id"], six.text_type)
-        self.assertIsInstance(channel.json_body["access_token"], six.text_type)
-        self.assertIsInstance(channel.json_body["device_id"], six.text_type)
+        self.assertIsInstance(channel.json_body["user_id"], str)
+        self.assertIsInstance(channel.json_body["access_token"], str)
+        self.assertIsInstance(channel.json_body["device_id"], str)

+ 1 - 1
tests/util/test_file_consumer.py

@@ -15,9 +15,9 @@
 
 
 
 
 import threading
 import threading
+from io import StringIO
 
 
 from mock import NonCallableMock
 from mock import NonCallableMock
-from six import StringIO
 
 
 from twisted.internet import defer, reactor
 from twisted.internet import defer, reactor
 
 

+ 0 - 2
tests/util/test_linearizer.py

@@ -14,8 +14,6 @@
 # See the License for the specific language governing permissions and
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # limitations under the License.
 
 
-from six.moves import range
-
 from twisted.internet import defer, reactor
 from twisted.internet import defer, reactor
 from twisted.internet.defer import CancelledError
 from twisted.internet.defer import CancelledError
 
 

+ 1 - 1
tests/utils.py

@@ -21,9 +21,9 @@ import time
 import uuid
 import uuid
 import warnings
 import warnings
 from inspect import getcallargs
 from inspect import getcallargs
+from urllib import parse as urlparse
 
 
 from mock import Mock, patch
 from mock import Mock, patch
-from six.moves.urllib import parse as urlparse
 
 
 from twisted.internet import defer, reactor
 from twisted.internet import defer, reactor