matrix-org / matrix-org/matrix-python-sdk

Consider using black for formatting

オープン
#218 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

enhancement question
主要言語
Python
スター
266
フォーク
118
PR マージ指標
30日以内にマージされた PR はありません

説明

Seems to always be at least a couple PEP8 issues on each pull request including mine. We should consider mandating the black formatter. Any formatting issues then can be resolved by the requester with a single simple command line invocation.

For reference, this is the diff produced by running black on the matrix_client directory currently:

--- matrix_client/client.py  (original)
+++ matrix_client/client.py  (formatted)
@@ -91,13 +91,19 @@
 
             def global_callback(incoming_event):
                 pass
     """
 
-    def __init__(self, base_url, token=None, user_id=None,
-                 valid_cert_check=True, sync_filter_limit=20,
-                 cache_level=CACHE.ALL):
+    def __init__(
+        self,
+        base_url,
+        token=None,
+        user_id=None,
+        valid_cert_check=True,
+        sync_filter_limit=20,
+        cache_level=CACHE.ALL,
+    ):
         """ Create a new Matrix Client object.
 
         Args:
             base_url (str): The url of the HS preceding /_matrix.
                 e.g. (ex: https://localhost:8008 )
@@ -134,12 +140,13 @@
             raise ValueError(
                 "cache_level must be one of CACHE.NONE, CACHE.SOME, CACHE.ALL"
             )
 
         self.sync_token = None
-        self.sync_filter = '{ "room": { "timeline" : { "limit" : %i } } }' \
-            % sync_filter_limit
+        self.sync_filter = (
+            '{ "room": { "timeline" : { "limit" : %i } } }' % sync_filter_limit
+        )
         self.sync_thread = None
         self.should_listen = False
 
         """ Time to wait before attempting a /sync request after failing."""
         self.bad_sync_timeout_limit = 60 * 60
@@ -150,22 +157,28 @@
             check_user_id(user_id)
             self.user_id = user_id
             self._sync()
 
     def get_sync_token(self):
-        warn("get_sync_token is deprecated. Directly access MatrixClient.sync_token.",
-             DeprecationWarning)
+        warn(
+            "get_sync_token is deprecated. Directly access MatrixClient.sync_token.",
+            DeprecationWarning,
+        )
         return self.sync_token
 
     def set_sync_token(self, token):
-        warn("set_sync_token is deprecated. Directly access MatrixClient.sync_token.",
-             DeprecationWarning)
+        warn(
+            "set_sync_token is deprecated. Directly access MatrixClient.sync_token.",
+            DeprecationWarning,
+        )
         self.sync_token = token
 
     def set_user_id(self, user_id):
-        warn("set_user_id is deprecated. Directly access MatrixClient.user_id.",
-             DeprecationWarning)
+        warn(
+            "set_user_id is deprecated. Directly access MatrixClient.user_id.",
+            DeprecationWarning,
+        )
         self.user_id = user_id
 
     # TODO: combine register methods into single register method controlled by kwargs
     def register_as_guest(self):
         """ Register a guest account on this HS.
@@ -173,11 +186,11 @@
         Returns:
             str: Access Token
         Raises:
             MatrixRequestError
         """
-        response = self.api.register(kind='guest')
+        response = self.api.register(kind="guest")
         return self._post_registration(response)
 
     def register_with_password(self, username, password):
         """ Register for a new account on this HS.
 
@@ -193,11 +206,11 @@
         """
         response = self.api.register(
             {
                 "auth": {"type": "m.login.dummy"},
                 "username": username,
-                "password": password
+                "password": password,
             }
         )
         return self._post_registration(response)
 
     def _post_registration(self, response):
@@ -220,13 +233,11 @@
             str: Access token
 
         Raises:
             MatrixRequestError
         """
-        response = self.api.login(
-            "m.login.password", user=username, password=password
-        )
+        response = self.api.login("m.login.password", user=username, password=password)
         self.user_id = response["user_id"]
         self.token = response["access_token"]
         self.hs = response["home_server"]
         self.api.token = self.token
         return self.token
@@ -289,23 +300,23 @@
 
         Raises:
             MatrixRequestError
         """
         response = self.api.join_room(room_id_or_alias)
-        room_id = (
-            response["room_id"] if "room_id" in response else room_id_or_alias
-        )
+        room_id = response["room_id"] if "room_id" in response else room_id_or_alias
         return self._mkroom(room_id)
 
     def get_rooms(self):
         """ Return a dict of {room_id: Room objects} that the user has joined.
 
         Returns:
             Room{}: Rooms the user has joined.
         """
-        warn("get_rooms is deprecated. Directly access MatrixClient.rooms.",
-             DeprecationWarning)
+        warn(
+            "get_rooms is deprecated. Directly access MatrixClient.rooms.",
+            DeprecationWarning,
+        )
         return self.rooms
 
     # TODO: create Listener class and push as much of this logic there as possible
     # NOTE: listeners related to things in rooms should be attached to Room objects
     def add_listener(self, callback, event_type=None):
@@ -322,26 +333,23 @@
         listener_uid = uuid4()
         # TODO: listeners should be stored in dict and accessed/deleted directly. Add
         # convenience method such that MatrixClient.listeners.new(Listener(...)) performs
         # MatrixClient.listeners[uuid4()] = Listener(...)
         self.listeners.append(
-            {
-                'uid': listener_uid,
-                'callback': callback,
-                'event_type': event_type
-            }
+            {"uid": listener_uid, "callback": callback, "event_type": event_type}
         )
         return listener_uid
 
     def remove_listener(self, uid):
         """ Remove listener with given uid.
 
         Args:
             uuid.UUID: Unique id of the listener to remove.
         """
-        self.listeners[:] = (listener for listener in self.listeners
-                             if listener['uid'] != uid)
+        self.listeners[:] = (
+            listener for listener in self.listeners if listener["uid"] != uid
+        )
 
     def add_presence_listener(self, callback):
         """ Add a presence listener that will send a callback when the client receives
         a presence update.
 
@@ -374,26 +382,23 @@
         Returns:
             uuid.UUID: Unique id of the listener, can be used to identify the listener.
         """
         listener_id = uuid4()
         self.ephemeral_listeners.append(
-            {
-                'uid': listener_id,
-                'callback': callback,
-                'event_type': event_type
-            }
+            {"uid": listener_id, "callback": callback, "event_type": event_type}
         )
         return listener_id
 
     def remove_ephemeral_listener(self, uid):
         """ Remove ephemeral listener with given uid.
 
         Args:
             uuid.UUID: Unique id of the listener to remove.
         """
-        self.ephemeral_listeners[:] = (listener for listener in self.ephemeral_listeners
-                                       if listener['uid'] != uid)
+        self.ephemeral_listeners[:] = (
+            listener for listener in self.ephemeral_listeners if listener["uid"] != uid
+        )
 
     def add_invite_listener(self, callback):
         """ Add a listener that will send a callback when the client receives
         an invite.
 
@@ -424,12 +429,13 @@
                retrying.
         """
         # TODO: see docstring
         self._sync(timeout_ms)
 
-    def listen_forever(self, timeout_ms=30000, exception_handler=None,
-                       bad_sync_timeout=5):
+    def listen_forever(
+        self, timeout_ms=30000, exception_handler=None, bad_sync_timeout=5
+    ):
         """ Keep listening for events forever.
 
         Args:
             timeout_ms (int): How long to poll the Home Server for before
                retrying.
@@ -439,23 +445,26 @@
             bad_sync_timeout (int): Base time to wait after an error before
                 retrying. Will be increased according to exponential backoff.
         """
         _bad_sync_timeout = bad_sync_timeout
         self.should_listen = True
-        while (self.should_listen):
+        while self.should_listen:
             try:
                 self._sync(timeout_ms)
                 _bad_sync_timeout = bad_sync_timeout
             # TODO: we should also handle MatrixHttpLibError for retry in case no response
             except MatrixRequestError as e:
                 logger.warning("A MatrixRequestError occured during sync.")
                 if e.code >= 500:
-                    logger.warning("Problem occured serverside. Waiting %i seconds",
-                                   bad_sync_timeout)
+                    logger.warning(
+                        "Problem occured serverside. Waiting %i seconds",
+                        bad_sync_timeout,
+                    )
                     sleep(bad_sync_timeout)
-                    _bad_sync_timeout = min(_bad_sync_timeout * 2,
-                                            self.bad_sync_timeout_limit)
+                    _bad_sync_timeout = min(
+                        _bad_sync_timeout * 2, self.bad_sync_timeout_limit
+                    )
                 elif exception_handler is not None:
                     exception_handler(e)
                 else:
                     raise
             except Exception as e:
@@ -474,12 +483,13 @@
             exception_handler (func(exception)): Optional exception handler
                function which can be used to handle exceptions in the caller
                thread.
         """
         try:
-            thread = Thread(target=self.listen_forever,
-                            args=(timeout_ms, exception_handler))
+            thread = Thread(
+                target=self.listen_forever, args=(timeout_ms, exception_handler)
+            )
             thread.daemon = True
             self.sync_thread = thread
             self.should_listen = True
             thread.start()
         except RuntimeError:
@@ -513,73 +523,70 @@
             else:
                 raise MatrixUnexpectedResponse(
                     "The upload was successful, but content_uri wasn't found."
                 )
         except MatrixRequestError as e:
-            raise MatrixRequestError(
-                code=e.code,
-                content="Upload failed: %s" % e
-            )
+            raise MatrixRequestError(code=e.code, content="Upload failed: %s" % e)
 
     def _mkroom(self, room_id):
         self.rooms[room_id] = Room(self, room_id)
         return self.rooms[room_id]
 
     def _sync(self, timeout_ms=30000):
         response = self.api.sync(self.sync_token, timeout_ms, filter=self.sync_filter)
         self.sync_token = response["next_batch"]
 
-        for presence_update in response['presence']['events']:
+        for presence_update in response["presence"]["events"]:
             for callback in self.presence_listeners.values():
                 callback(presence_update)
 
-        for room_id, invite_room in response['rooms']['invite'].items():
+        for room_id, invite_room in response["rooms"]["invite"].items():
             for listener in self.invite_listeners:
-                listener(room_id, invite_room['invite_state'])
-
-        for room_id, left_room in response['rooms']['leave'].items():
+                listener(room_id, invite_room["invite_state"])
+
+        for room_id, left_room in response["rooms"]["leave"].items():
             for listener in self.left_listeners:
                 listener(room_id, left_room)
             if room_id in self.rooms:
                 del self.rooms[room_id]
 
-        for room_id, sync_room in response['rooms']['join'].items():
+        for room_id, sync_room in response["rooms"]["join"].items():
             if room_id not in self.rooms:
                 self._mkroom(room_id)
             room = self.rooms[room_id]
             # TODO: the rest of this for loop should be in room object method
             room.prev_batch = sync_room["timeline"]["prev_batch"]
 
             for event in sync_room["state"]["events"]:
-                event['room_id'] = room_id
+                event["room_id"] = room_id
                 room._process_state_event(event)
 
             for event in sync_room["timeline"]["events"]:
-                event['room_id'] = room_id
+                event["room_id"] = room_id
                 room._put_event(event)
 
                 # TODO: global listeners can still exist but work by each
                 # room.listeners[uuid] having reference to global listener
 
                 # Dispatch for client (global) listeners
                 for listener in self.listeners:
                     if (
-                        listener['event_type'] is None or
-                        listener['event_type'] == event['type']
+                        listener["event_type"] is None
+                        or listener["event_type"] == event["type"]
                     ):
-                        listener['callback'](event)
-
-            for event in sync_room['ephemeral']['events']:
-                event['room_id'] = room_id
+                        listener["callback"](event)
+
+            for event in sync_room["ephemeral"]["events"]:
+                event["room_id"] = room_id
                 room._put_ephemeral_event(event)
 
                 for listener in self.ephemeral_listeners:
                     if (
-                        listener['event_type'] is None or
-                        listener['event_type'] == event['type']
+                        listener["event_type"] is None
+                        or listener["event_type"] == event["type"]
                     ):
-                        listener['callback'](event)
+                        listener["callback"](event)
 
     def get_user(self, user_id):
         """ Return a User by their id.
 
         NOTE: This function only returns a user object, it does not verify
--- matrix_client/errors.py  (original)
+++ matrix_client/errors.py  (formatted)
@@ -39,11 +39,11 @@
 class MatrixHttpLibError(MatrixError):
     """The library used for http requests raised an exception."""
 
     def __init__(self, original_exception, method, endpoint):
         super(MatrixHttpLibError, self).__init__(
-            "Something went wrong in {} requesting {}: {}".format(method,
-                                                                  endpoint,
-                                                                  original_exception)
+            "Something went wrong in {} requesting {}: {}".format(
+                method, endpoint, original_exception
+            )
         )
         self.original_exception = original_exception
 
--- matrix_client/room.py  (original)
+++ matrix_client/room.py  (formatted)
@@ -46,14 +46,16 @@
         self.invite_only = None
         self.guest_access = None
         self._prev_batch = None
         self._members = []
 
-    def set_user_profile(self,
-                         displayname=None,
-                         avatar_url=None,
-                         reason="Changing room profile information"):
+    def set_user_profile(
+        self,
+        displayname=None,
+        avatar_url=None,
+        reason="Changing room profile information",
+    ):
         """Set user profile within a room.
 
         This sets displayname and avatar_url for the logged in user only in a
         specific room. It does not change the user's global user profile.
         """
@@ -65,15 +67,13 @@
         if avatar_url is None:
             avatar_url = member["avatar_url"]
         self.client.api.set_membership(
             self.room_id,
             self.client.user_id,
-            'join',
-            reason, {
-                "displayname": displayname,
-                "avatar_url": avatar_url
-            }
+            "join",
+            reason,
+            {"displayname": displayname, "avatar_url": avatar_url},
         )
 
     @property
     def display_name(self):
         """Calculates the display name for a room."""
@@ -82,23 +82,20 @@
         elif self.canonical_alias:
             return self.canonical_alias
 
         members = self.get_joined_members()
         # members without me
-        members[:] = [u.get_display_name() for u in members if
-                      self.client.user_id != u.user_id]
+        members[:] = [
+            u.get_display_name() for u in members if self.client.user_id != u.user_id
+        ]
         first_two = members[:2]
         if len(first_two) == 1:
             return first_two[0]
         elif len(members) == 2:
-            return "{0} and {1}".format(
-                first_two[0],
-                first_two[1])
+            return "{0} and {1}".format(first_two[0], first_two[1])
         elif len(members) > 2:
-            return "{0} and {1} others".format(
-                first_two[0],
-                len(members) - 1)
+            return "{0} and {1} others".format(first_two[0], len(members) - 1)
         elif len(first_two) == 0:
             # TODO i18n
             return "Empty room"
         # TODO i18n
         return "Empty room"
@@ -107,42 +104,41 @@
         """Send a plain text message to the room."""
         return self.client.api.send_message(self.room_id, text)
 
     def get_html_content(self, html, body=None, msgtype="m.text"):
         return {
-            "body": body if body else re.sub('<[^<]+?>', '', html),
+            "body": body if body else re.sub("<[^<]+?>", "", html),
             "msgtype": msgtype,
             "format": "org.matrix.custom.html",
-            "formatted_body": html
+            "formatted_body": html,
         }
 
     def send_html(self, html, body=None, msgtype="m.text"):
         """Send an html formatted message.
 
         Args:
             html (str): The html formatted message to be sent.
             body (str): The unformatted body of the message to be sent.
         """
         return self.client.api.send_message_event(
-            self.room_id, "m.room.message", self.get_html_content(html, body, msgtype))
+            self.room_id, "m.room.message", self.get_html_content(html, body, msgtype)
+        )
 
     def set_account_data(self, type, account_data):
         return self.client.api.set_room_account_data(
-            self.client.user_id, self.room_id, type, account_data)
+            self.client.user_id, self.room_id, type, account_data
+        )
 
     def get_tags(self):
         return self.client.api.get_user_tags(self.client.user_id, self.room_id)
 
     def remove_tag(self, tag):
-        return self.client.api.remove_user_tag(
-            self.client.user_id, self.room_id, tag
-        )
+        return self.client.api.remove_user_tag(self.client.user_id, self.room_id, tag)
 
     def add_tag(self, tag, order=None, content=None):
         return self.client.api.add_user_tag(
-            self.client.user_id, self.room_id,
-            tag, order, content
+            self.client.user_id, self.room_id, tag, order, content
         )
 
     def send_emote(self, text):
         """Send an emote (/me style) message to the room."""
         return self.client.api.send_emote(self.room_id, text)
@@ -158,12 +154,11 @@
             name (str): The filename of the image.
             fileinfo (): Extra information about the file
         """
 
         return self.client.api.send_content(
-            self.room_id, url, name, "m.file",
-            extra_information=fileinfo
+            self.room_id, url, name, "m.file", extra_information=fileinfo
         )
 
     def send_notice(self, text):
         """Send a notice (from bot) message to the room."""
         return self.client.api.send_notice(self.room_id, text)
@@ -180,12 +175,11 @@
             url (str): The mxc url of the image.
             name (str): The filename of the image.
             imageinfo (): Extra information about the image.
         """
         return self.client.api.send_content(
-            self.room_id, url, name, "m.image",
-            extra_information=imageinfo
+            self.room_id, url, name, "m.image", extra_information=imageinfo
         )
 
     def send_location(self, geo_uri, name, thumb_url=None, **thumb_info):
         """Send a location to the room.
 
@@ -196,12 +190,13 @@
             geo_uri (str): The geo uri representing the location.
             name (str): Description for the location.
             thumb_url (str): URL to the thumbnail of the location.
             thumb_info (): Metadata about the thumbnail, type ImageInfo.
         """
-        return self.client.api.send_location(self.room_id, geo_uri, name,
-                                             thumb_url, thumb_info)
+        return self.client.api.send_location(
+            self.room_id, geo_uri, name, thumb_url, thumb_info
+        )
 
     def send_video(self, url, name, **videoinfo):
         """Send a pre-uploaded video to the room.
 
         See http://matrix.org/docs/spec/client_server/r0.2.0.html#m-video
@@ -210,12 +205,13 @@
         Args:
             url (str): The mxc url of the video.
             name (str): The filename of the video.
             videoinfo (): Extra information about the video.
         """
-        return self.client.api.send_content(self.room_id, url, name, "m.video",
-                                            extra_information=videoinfo)
+        return self.client.api.send_content(
+            self.room_id, url, name, "m.video", extra_information=videoinfo
+        )
 
     def send_audio(self, url, name, **audioinfo):
         """Send a pre-uploaded audio to the room.
 
         See http://matrix.org/docs/spec/client_server/r0.2.0.html#m-audio
@@ -224,12 +220,13 @@
         Args:
             url (str): The mxc url of the audio.
             name (str): The filename of the audio.
             audioinfo (): Extra information about the audio.
         """
-        return self.client.api.send_content(self.room_id, url, name, "m.audio",
-                                            extra_information=audioinfo)
+        return self.client.api.send_content(
+            self.room_id, url, name, "m.audio", extra_information=audioinfo
+        )
 
     def redact_message(self, event_id, reason=None):
         """Redacts the message with specified event_id for the given reason.
 
         See https://matrix.org/docs/spec/r0.0.1/client_server.html#id112
@@ -245,22 +242,19 @@
         Returns:
             uuid.UUID: Unique id of the listener, can be used to identify the listener.
         """
         listener_id = uuid4()
         self.listeners.append(
-            {
-                'uid': listener_id,
-                'callback': callback,
-                'event_type': event_type
-            }
+            {"uid": listener_id, "callback": callback, "event_type": event_type}
         )
         return listener_id
 
     def remove_listener(self, uid):
         """Remove listener with given uid."""
-        self.listeners[:] = (listener for listener in self.listeners
-                             if listener['uid'] != uid)
+        self.listeners[:] = (
+            listener for listener in self.listeners if listener["uid"] != uid
+        )
 
     def add_ephemeral_listener(self, callback, event_type=None):
         """Add a callback handler for ephemeral events going to this room.
 
         Args:
@@ -269,54 +263,52 @@
         Returns:
             uuid.UUID: Unique id of the listener, can be used to identify the listener.
         """
         listener_id = uuid4()
         self.ephemeral_listeners.append(
-            {
-                'uid': listener_id,
-                'callback': callback,
-                'event_type': event_type
-            }
+            {"uid": listener_id, "callback": callback, "event_type": event_type}
         )
         return listener_id
 
     def remove_ephemeral_listener(self, uid):
         """Remove ephemeral listener with given uid."""
-        self.ephemeral_listeners[:] = (listener for listener in self.ephemeral_listeners
-                                       if listener['uid'] != uid)
+        self.ephemeral_listeners[:] = (
+            listener for listener in self.ephemeral_listeners if listener["uid"] != uid
+        )
 
     def add_state_listener(self, callback, event_type=None):
         """Add a callback handler for state events going to this room.
 
         Args:
             callback (func(roomchunk)): Callback called when an event arrives.
             event_type (str): The event_type to filter for.
         """
-        self.state_listeners.append(
-            {
-                'callback': callback,
-                'event_type': event_type
-            }
-        )
+        self.state_listeners.append({"callback": callback, "event_type": event_type})
 
     def _put_event(self, event):
         self.events.append(event)
         if len(self.events) > self.event_history_limit:
             self.events.pop(0)
-        if 'state_key' in event:
+        if "state_key" in event:
             self._process_state_event(event)
 
         # Dispatch for room-specific listeners
         for listener in self.listeners:
-            if listener['event_type'] is None or listener['event_type'] == event['type']:
-                listener['callback'](self, event)
+            if (
+                listener["event_type"] is None
+                or listener["event_type"] == event["type"]
+            ):
+                listener["callback"](self, event)
 
     def _put_ephemeral_event(self, event):
         # Dispatch for room-specific listeners
         for listener in self.ephemeral_listeners:
-            if listener['event_type'] is None or listener['event_type'] == event['type']:
-                listener['callback'](self, event)
+            if (
+                listener["event_type"] is None
+                or listener["event_type"] == event["type"]
+            ):
+                listener["callback"](self, event)
 
     def get_events(self):
         """Get the most recent events for this room."""
         return self.events
 
@@ -418,14 +410,11 @@
             event_type (str): The type of event that you are sending.
             content (): An object with the content of the message.
             state_key (str, optional): A unique key to identify the state.
         """
         return self.client.api.send_state_event(
-            self.room_id,
-            event_type,
-            content,
-            state_key
+            self.room_id, event_type, content, state_key
         )
 
     def update_room_topic(self):
         """Updates self.topic and returns True if room topic has changed."""
         try:
@@ -483,13 +472,15 @@
             return self._members
         response = self.client.api.get_room_members(self.room_id)
         for event in response["chunk"]:
             if event["content"]["membership"] == "join":
                 self._mkmembers(
-                    User(self.client.api,
-                         event["state_key"],
-                         event["content"].get("displayname"))
+                    User(
+                        self.client.api,
+                        event["state_key"],
+                        event["content"].get("displayname"),
+                    )
                 )
         return self._members
 
     def _mkmembers(self, member):
         if member.user_id not in [x.user_id for x in self._members]:
@@ -504,12 +495,13 @@
         Args:
             reverse (bool): When false messages will be backfilled in their original
                 order (old to new), otherwise the order will be reversed (new to old).
             limit (int): Number of messages to go back.
         """
-        res = self.client.api.get_room_messages(self.room_id, self.prev_batch,
-                                                direction="b", limit=limit)
+        res = self.client.api.get_room_messages(
+            self.room_id, self.prev_batch, direction="b", limit=limit
+        )
         events = res["chunk"]
         if not reverse:
             events = reversed(events)
         for event in events:
             self._put_event(event)
@@ -642,23 +634,25 @@
                 self.guest_access = econtent["guest_access"] == "can_join"
             elif etype == "m.room.member" and clevel == clevel.ALL:
                 # tracking room members can be large e.g. #matrix:matrix.org
                 if econtent["membership"] == "join":
                     self._mkmembers(
-                        User(self.client.api,
-                             state_event["state_key"],
-                             econtent.get("displayname"))
+                        User(
+                            self.client.api,
+                            state_event["state_key"],
+                            econtent.get("displayname"),
+                        )
                     )
                 elif econtent["membership"] in ("leave", "kick", "invite"):
                     self._rmmembers(state_event["state_key"])
 
         for listener in self.state_listeners:
             if (
-                listener['event_type'] is None or
-                listener['event_type'] == state_event['type']
+                listener["event_type"] is None
+                or listener["event_type"] == state_event["type"]
             ):
-                listener['callback'](state_event)
+                listener["callback"](state_event)
 
     @property
     def prev_batch(self):
         return self._prev_batch
 
--- matrix_client/api.py  (original)
+++ matrix_client/api.py  (formatted)
@@ -66,15 +66,23 @@
         Perform /initialSync.
 
         Args:
             limit (int): The limit= param to provide.
         """
-        warnings.warn("initial_sync is deprecated. Use sync instead.", DeprecationWarning)
+        warnings.warn(
+            "initial_sync is deprecated. Use sync instead.", DeprecationWarning
+        )
         return self._send("GET", "/initialSync", query_params={"limit": limit})
 
-    def sync(self, since=None, timeout_ms=30000, filter=None,
-             full_state=None, set_presence=None):
+    def sync(
+        self,
+        since=None,
+        timeout_ms=30000,
+        filter=None,
+        full_state=None,
+        set_presence=None,
+    ):
         """ Perform a sync request.
 
         Args:
             since (str): Optional. A token which specifies where to continue a sync from.
             timeout_ms (int): Optional. The time in milliseconds to wait.
@@ -99,17 +107,18 @@
             request["full_state"] = full_state
 
         if set_presence:
             request["set_presence"] = set_presence
 
-        return self._send("GET", "/sync", query_params=request,
-                          api_path=MATRIX_V2_API_PATH)
+        return self._send(
+            "GET", "/sync", query_params=request, api_path=MATRIX_V2_API_PATH
+        )
 
     def validate_certificate(self, valid):
         self.validate_cert = valid
 
-    def register(self, content={}, kind='user'):
+    def register(self, content={}, kind="user"):
         """Performs /register.
 
         Args:
             content (dict): The request payload.
 
@@ -133,26 +142,21 @@
                 |         non-interactive type.
 
             kind (str): Specify kind="guest" to register as guest.
         """
         return self._send(
-            "POST",
-            "/register",
-            content=content,
-            query_params={'kind': kind}
+            "POST", "/register", content=content, query_params={"kind": kind}
         )
 
     def login(self, login_type, **kwargs):
         """Perform /login.
 
         Args:
             login_type (str): The value for the 'type' key.
             **kwargs: Additional key/values to add to the JSON submitted.
         """
-        content = {
-            "type": login_type
-        }
+        content = {"type": login_type}
         for key in kwargs:
             content[key] = kwargs[key]
 
         return self._send("POST", "/login", content)
 
@@ -167,13 +171,11 @@
         Args:
             alias (str): Optional. The room alias name to set for this room.
             is_public (bool): Optional. The public/private visibility.
             invitees (list<str>): Optional. The list of user IDs to invite.
         """
-        content = {
-            "visibility": "public" if is_public else "private"
-        }
+        content = {"visibility": "public" if is_public else "private"}
         if alias:
             content["room_alias_name"] = alias
         if invitees:
             content["invite"] = invitees
         return self._send("POST", "/createRoom", content)
@@ -197,43 +199,41 @@
 
         Args:
             from_token (str): The 'from' query parameter.
             timeout (int): Optional. The 'timeout' query parameter.
         """
-        warnings.warn("event_stream is deprecated. Use sync instead.",
-                      DeprecationWarning)
+        warnings.warn(
+            "event_stream is deprecated. Use sync instead.", DeprecationWarning
+        )
         path = "/events"
         return self._send(
-            "GET", path, query_params={
-                "timeout": timeout,
-                "from": from_token
-            }
-        )
-
-    def send_state_event(self, room_id, event_type, content, state_key="",
-                         timestamp=None):
+            "GET", path, query_params={"timeout": timeout, "from": from_token}
+        )
+
+    def send_state_event(
+        self, room_id, event_type, content, state_key="", timestamp=None
+    ):
         """Perform PUT /rooms/$room_id/state/$event_type
 
         Args:
             room_id(str): The room ID to send the state event in.
             event_type(str): The state event type to send.
             content(dict): The JSON content to send.
             state_key(str): Optional. The state key for the event.
             timestamp (int): Set origin_server_ts (For application services only)
         """
-        path = "/rooms/%s/state/%s" % (
-            quote(room_id), quote(event_type),
-        )
+        path = "/rooms/%s/state/%s" % (quote(room_id), quote(event_type))
         if state_key:
             path += "/%s" % (quote(state_key))
         params = {}
         if timestamp:
             params["ts"] = timestamp
         return self._send("PUT", path, content, query_params=params)
 
-    def send_message_event(self, room_id, event_type, content, txn_id=None,
-                           timestamp=None):
+    def send_message_event(
+        self, room_id, event_type, content, txn_id=None, timestamp=None
+    ):
         """Perform PUT /rooms/$room_id/send/$event_type
 
         Args:
             room_id (str): The room ID to send the message event in.
             event_type (str): The event type to send.
@@ -245,11 +245,13 @@
             txn_id = str(self.txn_id) + str(int(time() * 1000))
 
         self.txn_id = self.txn_id + 1
 
         path = "/rooms/%s/send/%s/%s" % (
-            quote(room_id), quote(event_type), quote(str(txn_id)),
+            quote(room_id),
+            quote(event_type),
+            quote(str(txn_id)),
         )
         params = {}
         if timestamp:
             params["ts"] = timestamp
         return self._send("PUT", path, content, query_params=params)
@@ -266,76 +268,81 @@
         """
         if not txn_id:
             txn_id = str(self.txn_id) + str(int(time() * 1000))
 
         self.txn_id = self.txn_id + 1
-        path = '/rooms/%s/redact/%s/%s' % (
-            room_id, event_id, txn_id
-        )
+        path = "/rooms/%s/redact/%s/%s" % (room_id, event_id, txn_id)
         content = {}
         if reason:
-            content['reason'] = reason
+            content["reason"] = reason
         params = {}
         if timestamp:
             params["ts"] = timestamp
         return self._send("PUT", path, content, query_params=params)
 
     # content_type can be a image,audio or video
     # extra information should be supplied, see
     # https://matrix.org/docs/spec/r0.0.1/client_server.html
-    def send_content(self, room_id, item_url, item_name, msg_type,
-                     extra_information=None, timestamp=None):
+    def send_content(
+        self,
+        room_id,
+        item_url,
+        item_name,
+        msg_type,
+        extra_information=None,
+        timestamp=None,
+    ):
         if extra_information is None:
             extra_information = {}
 
         content_pack = {
             "url": item_url,
             "msgtype": msg_type,
             "body": item_name,
-            "info": extra_information
+            "info": extra_information,
         }
-        return self.send_message_event(room_id, "m.room.message", content_pack,
-                                       timestamp=timestamp)
+        return self.send_message_event(
+            room_id, "m.room.message", content_pack, timestamp=timestamp
+        )
 
     # http://matrix.org/docs/spec/client_server/r0.2.0.html#m-location
-    def send_location(self, room_id, geo_uri, name, thumb_url=None, thumb_info=None,
-                      timestamp=None):
+    def send_location(
+        self, room_id, geo_uri, name, thumb_url=None, thumb_info=None, timestamp=None
+    ):
         """Send m.location message event
 
         Args:
             room_id (str): The room ID to send the event in.
             geo_uri (str): The geo uri representing the location.
             name (str): Description for the location.
             thumb_url (str): URL to the thumbnail of the location.
             thumb_info (dict): Metadata about the thumbnail, type ImageInfo.
             timestamp (int): Set origin_server_ts (For application services only)
         """
-        content_pack = {
-            "geo_uri": geo_uri,
-            "msgtype": "m.location",
-            "body": name,
-        }
+        content_pack = {"geo_uri": geo_uri, "msgtype": "m.location", "body": name}
         if thumb_url:
             content_pack["thumbnail_url"] = thumb_url
         if thumb_info:
             content_pack["thumbnail_info"] = thumb_info
 
-        return self.send_message_event(room_id, "m.room.message", content_pack,
-                                       timestamp=timestamp)
+        return self.send_message_event(
+            room_id, "m.room.message", content_pack, timestamp=timestamp
+        )
 
     def send_message(self, room_id, text_content, msgtype="m.text", timestamp=None):
         """Perform PUT /rooms/$room_id/send/m.room.message
 
         Args:
             room_id (str): The room ID to send the event in.
             text_content (str): The m.text body to send.
             timestamp (int): Set origin_server_ts (For application services only)
         """
         return self.send_message_event(
-            room_id, "m.room.message",
+            room_id,
+            "m.room.message",
             self.get_text_body(text_content, msgtype),
-            timestamp=timestamp
+            timestamp=timestamp,
         )
 
     def send_emote(self, room_id, text_content, timestamp=None):
         """Perform PUT /rooms/$room_id/send/m.room.message with m.emote msgtype
 
@@ -343,29 +350,28 @@
             room_id (str): The room ID to send the event in.
             text_content (str): The m.emote body to send.
             timestamp (int): Set origin_server_ts (For application services only)
         """
         return self.send_message_event(
-            room_id, "m.room.message",
+            room_id,
+            "m.room.message",
             self.get_emote_body(text_content),
-            timestamp=timestamp
+            timestamp=timestamp,
         )
 
     def send_notice(self, room_id, text_content, timestamp=None):
         """Perform PUT /rooms/$room_id/send/m.room.message with m.notice msgtype
 
         Args:
             room_id (str): The room ID to send the event in.
             text_content (str): The m.notice body to send.
             timestamp (int): Set origin_server_ts (For application services only)
         """
-        body = {
-            "msgtype": "m.notice",
-            "body": text_content
-        }
-        return self.send_message_event(room_id, "m.room.message", body,
-                                       timestamp=timestamp)
+        body = {"msgtype": "m.notice", "body": text_content}
+        return self.send_message_event(
+            room_id, "m.room.message", body, timestamp=timestamp
+        )
 
     def get_room_messages(self, room_id, token, direction, limit=10, to=None):
         """Perform GET /rooms/{roomId}/messages.
 
         Args:
@@ -373,22 +379,21 @@
             token (str): The token to start returning events from.
             direction (str):  The direction to return events from. One of: ["b", "f"].
             limit (int): The maximum number of events to return.
             to (str): The token to stop returning events at.
         """
-        query = {
-            "roomId": room_id,
-            "from": token,
-            "dir": direction,
-            "limit": limit,
-        }
+        query = {"roomId": room_id, "from": token, "dir": direction, "limit": limit}
 
         if to:
             query["to"] = to
 
-        return self._send("GET", "/rooms/{}/messages".format(quote(room_id)),
-                          query_params=query, api_path="/_matrix/client/r0")
+        return self._send(
+            "GET",
+            "/rooms/{}/messages".format(quote(room_id)),
+            query_params=query,
+            api_path="/_matrix/client/r0",
+        )
 
     def get_room_name(self, room_id):
         """Perform GET /rooms/$room_id/state/m.room.name
         Args:
             room_id(str): The room ID
@@ -400,13 +405,11 @@
         Args:
             room_id (str): The room ID
             name (str): The new room name
             timestamp (int): Set origin_server_ts (For application services only)
         """
-        body = {
-            "name": name
-        }
+        body = {"name": name}
         return self.send_state_event(room_id, "m.room.name", body, timestamp=timestamp)
 
     def get_room_topic(self, room_id):
         """Perform GET /rooms/$room_id/state/m.room.topic
         Args:
@@ -419,23 +422,22 @@
         Args:
             room_id (str): The room ID
             topic (str): The new room topic
             timestamp (int): Set origin_server_ts (For application services only)
         """
-        body = {
-            "topic": topic
-        }
+        body = {"topic": topic}
         return self.send_state_event(room_id, "m.room.topic", body, timestamp=timestamp)
 
     def get_power_levels(self, room_id):
         """Perform GET /rooms/$room_id/state/m.room.power_levels
 
         Args:
             room_id(str): The room ID
         """
-        return self._send("GET", "/rooms/" + quote(room_id) +
-                          "/state/m.room.power_levels")
+        return self._send(
+            "GET", "/rooms/" + quote(room_id) + "/state/m.room.power_levels"
+        )
 
     def set_power_levels(self, room_id, content):
         """Perform PUT /rooms/$room_id/state/m.room.power_levels
 
         Note that any power levels which are not explicitly specified
@@ -495,13 +497,11 @@
 
         Args:
             room_id (str): The room ID
             user_id (str): The user ID of the invitee
         """
-        body = {
-            "user_id": user_id
-        }
+        body = {"user_id": user_id}
         return self._send("POST", "/rooms/" + room_id + "/invite", body)
 
     def kick_user(self, room_id, user_id, reason=""):
         """Calls set_membership with membership="leave" for the user_id provided
         """
@@ -513,100 +513,85 @@
         Args:
             room_id (str): The room ID
             user_id (str): The user ID
         """
         return self._send(
-            "GET",
-            "/rooms/%s/state/m.room.member/%s" % (room_id, user_id)
-        )
-
-    def set_membership(self, room_id, user_id, membership, reason="", profile={},
-                       timestamp=None):
+            "GET", "/rooms/%s/state/m.room.member/%s" % (room_id, user_id)
+        )
+
+    def set_membership(
+        self, room_id, user_id, membership, reason="", profile={}, timestamp=None
+    ):
         """Perform PUT /rooms/$room_id/state/m.room.member/$user_id
 
         Args:
             room_id (str): The room ID
             user_id (str): The user ID
             membership (str): New membership value
             reason (str): The reason
             timestamp (int): Set origin_server_ts (For application services only)
         """
-        body = {
-            "membership": membership,
-            "reason": reason
-        }
-        if 'displayname' in profile:
+        body = {"membership": membership, "reason": reason}
+        if "displayname" in profile:
             body["displayname"] = profile["displayname"]
-        if 'avatar_url' in profile:
+        if "avatar_url" in profile:
             body["avatar_url"] = profile["avatar_url"]
 
-        return self.send_state_event(room_id, "m.room.member", body, state_key=user_id,
-                                     timestamp=timestamp)
+        return self.send_state_event(
+            room_id, "m.room.member", body, state_key=user_id, timestamp=timestamp
+        )
 
     def ban_user(self, room_id, user_id, reason=""):
         """Perform POST /rooms/$room_id/ban
 
         Args:
             room_id (str): The room ID
             user_id (str): The user ID of the banee(sic)
             reason (str): The reason for this ban
         """
-        body = {
-            "user_id": user_id,
-            "reason": reason
-        }
+        body = {"user_id": user_id, "reason": reason}
         return self._send("POST", "/rooms/" + room_id + "/ban", body)
 
     def unban_user(self, room_id, user_id):
         """Perform POST /rooms/$room_id/unban
 
         Args:
             room_id (str): The room ID
             user_id (str): The user ID of the banee(sic)
         """
-        body = {
-            "user_id": user_id
-        }
+        body = {"user_id": user_id}
         return self._send("POST", "/rooms/" + room_id + "/unban", body)
 
     def get_user_tags(self, user_id, room_id):
-        return self._send(
-            "GET",
-            "/user/%s/rooms/%s/tags" % (user_id, room_id),
-        )
+        return self._send("GET", "/user/%s/rooms/%s/tags" % (user_id, room_id))
 
     def remove_user_tag(self, user_id, room_id, tag):
         return self._send(
-            "DELETE",
-            "/user/%s/rooms/%s/tags/%s" % (user_id, room_id, tag),
+            "DELETE", "/user/%s/rooms/%s/tags/%s" % (user_id, room_id, tag)
         )
 
     def add_user_tag(self, user_id, room_id, tag, order=None, body=None):
         if body:
             pass
         elif order:
             body = {"order": order}
         else:
             body = {}
         return self._send(
-            "PUT",
-            "/user/%s/rooms/%s/tags/%s" % (user_id, room_id, tag),
-            body,
+            "PUT", "/user/%s/rooms/%s/tags/%s" % (user_id, room_id, tag), body
         )
 
     def set_account_data(self, user_id, type, account_data):
         return self._send(
-            "PUT",
-            "/user/%s/account_data/%s" % (user_id, type),
-            account_data,
+            "PUT", "/user/%s/account_data/%s" % (user_id, type), account_data
         )
 
     def set_room_account_data(self, user_id, room_id, type, account_data):
         return self._send(
             "PUT",
             "/user/%s/rooms/%s/account_data/%s" % (user_id, room_id, type),
-            account_data
+            account_data,
         )
 
     def get_room_state(self, room_id):
         """Perform GET /rooms/$room_id/state
 
@@ -614,32 +599,37 @@
             room_id (str): The room ID
         """
         return self._send("GET", "/rooms/" + room_id + "/state")
 
     def get_text_body(self, text, msgtype="m.text"):
-        return {
-            "msgtype": msgtype,
-            "body": text
-        }
+        return {"msgtype": msgtype, "body": text}
 
     def get_emote_body(self, text):
-        return {
-            "msgtype": "m.emote",
-            "body": text
-        }
+        return {"msgtype": "m.emote", "body": text}
 
     def get_filter(self, user_id, filter_id):
-        return self._send("GET", "/user/{userId}/filter/{filterId}"
-                          .format(userId=user_id, filterId=filter_id))
+        return self._send(
+            "GET",
+            "/user/{userId}/filter/{filterId}".format(
+                userId=user_id, filterId=filter_id
+            ),
+        )
 
     def create_filter(self, user_id, filter_params):
-        return self._send("POST",
-                          "/user/{userId}/filter".format(userId=user_id),
-                          filter_params)
-
-    def _send(self, method, path, content=None, query_params={}, headers={},
-              api_path=MATRIX_V2_API_PATH):
+        return self._send(
+            "POST", "/user/{userId}/filter".format(userId=user_id), filter_params
+        )
+
+    def _send(
+        self,
+        method,
+        path,
+        content=None,
+        query_params={},
+        headers={},
+        api_path=MATRIX_V2_API_PATH,
+    ):
         method = method.upper()
         if method not in ["GET", "PUT", "DELETE", "POST"]:
             raise MatrixError("Unsupported HTTP method: %s" % method)
 
         if "Content-Type" not in headers:
@@ -655,66 +645,66 @@
             content = json.dumps(content)
 
         while True:
             try:
                 response = self.session.request(
-                    method, endpoint,
+                    method,
+                    endpoint,
                     params=query_params,
                     data=content,
                     headers=headers,
-                    verify=self.validate_cert
+                    verify=self.validate_cert,
                 )
             except RequestException as e:
                 raise MatrixHttpLibError(e, method, endpoint)
 
             if response.status_code == 429:
                 waittime = self.default_429_wait_ms / 1000
                 try:
-                    waittime = response.json()['retry_after_ms'] / 1000
+                    waittime = response.json()["retry_after_ms"] / 1000
                 except KeyError:
                     try:
-                        errordata = json.loads(response.json()['error'])
-                        waittime = errordata['retry_after_ms'] / 1000
+                        errordata = json.loads(response.json()["error"])
+                        waittime = errordata["retry_after_ms"] / 1000
                     except KeyError:
                         pass
                 sleep(waittime)
             else:
                 break
 
         if response.status_code < 200 or response.status_code >= 300:
-            raise MatrixRequestError(
-                code=response.status_code, content=response.text
-            )
+            raise MatrixRequestError(code=response.status_code, content=response.text)
 
         return response.json()
 
     def media_upload(self, content, content_type):
         return self._send(
-            "POST", "",
+            "POST",
+            "",
             content=content,
             headers={"Content-Type": content_type},
-            api_path="/_matrix/media/r0/upload"
+            api_path="/_matrix/media/r0/upload",
         )
 
     def get_display_name(self, user_id):
         content = self._send("GET", "/profile/%s/displayname" % user_id)
-        return content.get('displayname', None)
+        return content.get("displayname", None)
 
     def set_display_name(self, user_id, display_name):
         content = {"displayname": display_name}
         return self._send("PUT", "/profile/%s/displayname" % user_id, content)
 
     def get_avatar_url(self, user_id):
         content = self._send("GET", "/profile/%s/avatar_url" % user_id)
-        return content.get('avatar_url', None)
+        return content.get("avatar_url", None)
 
     def set_avatar_url(self, user_id, avatar_url):
         content = {"avatar_url": avatar_url}
         return self._send("PUT", "/profile/%s/avatar_url" % user_id, content)
 
     def get_download_url(self, mxcurl):
-        if mxcurl.startswith('mxc://'):
+        if mxcurl.startswith("mxc://"):
             return self.base_url + "/_matrix/media/r0/download/" + mxcurl[6:]
         else:
             raise ValueError("MXC URL did not begin with 'mxc://'")
 
     def get_room_id(self, room_alias):
@@ -734,16 +724,15 @@
 
         Args:
             room_id (str): The room id.
             room_alias (str): The room wanted alias name.
         """
-        data = {
-            "room_id": room_id
-        }
-
-        return self._send("PUT", "/directory/room/{}".format(quote(room_alias)),
-                          content=data)
+        data = {"room_id": room_id}
+
+        return self._send(
+            "PUT", "/directory/room/{}".format(quote(room_alias)), content=data
+        )
 
     def remove_room_alias(self, room_alias):
         """Remove mapping of an alias
 
         Args:
@@ -768,26 +757,22 @@
         Args:
             room_id(str): The room to set the rules for.
             join_rule(str): The chosen rule. One of: ["public", "knock",
                 "invite", "private"]
         """
-        content = {
-            "join_rule": join_rule
-        }
+        content = {"join_rule": join_rule}
         return self.send_state_event(room_id, "m.room.join_rules", content)
 
     def set_guest_access(self, room_id, guest_access):
         """Set the guest access policy of the room.
 
         Args:
             room_id(str): The room to set the rules for.
             guest_access(str): Wether guests can join. One of: ["can_join",
                 "forbidden"]
         """
-        content = {
-            "guest_access": guest_access
-        }
+        content = {"guest_access": guest_access}
         return self.send_state_event(room_id, "m.room.guest_access", content)
 
     def get_devices(self):
         """Gets information about all devices for the current user."""
         return self._send("GET", "/devices")
@@ -801,13 +786,11 @@
 
         Args:
             device_id (str): The device ID of the device to update.
             display_name (str): New display name for the device.
         """
-        content = {
-            "display_name": display_name
-        }
+        content = {"display_name": display_name}
         return self._send("PUT", "/devices/%s" % device_id, content=content)
 
     def delete_device(self, auth_body, device_id):
         """Deletes the given device, and invalidates any access token associated with it.
 
@@ -815,13 +798,11 @@
 
         Args:
             auth_body (dict): Authentication params.
             device_id (str): The device ID of the device to delete.
         """
-        content = {
-            "auth": auth_body
-        }
+        content = {"auth": auth_body}
         return self._send("DELETE", "/devices/%s" % device_id, content=content)
 
     def delete_devices(self, auth_body, devices):
         """Bulk deletion of devices.
 
@@ -829,11 +810,8 @@
 
         Args:
             auth_body (dict): Authentication params.
             devices (list): List of device ID"s to delete.
         """
-        content = {
-            "auth": auth_body,
-            "devices": devices
-        }
+        content = {"auth": auth_body, "devices": devices}
         return self._send("POST", "/delete_devices", content=content)
 
6 files reformatted, 2 files left unchanged.
--- matrix_client/.ropeproject/config.py  (original)
+++ matrix_client/.ropeproject/config.py  (formatted)
@@ -12,101 +12,111 @@
     # '*.pyc': matches 'test.pyc' and 'pkg/test.pyc'
     # 'mod*.pyc': matches 'test/mod1.pyc' but not 'mod/1.pyc'
     # '.svn': matches 'pkg/.svn' and all of its children
     # 'build/*.o': matches 'build/lib.o' but not 'build/sub/lib.o'
     # 'build//*.o': matches 'build/lib.o' and 'build/sub/lib.o'
-    prefs['ignored_resources'] = ['*.pyc', '*~', '.ropeproject',
-                                  '.hg', '.svn', '_svn', '.git', '.tox']
+    prefs["ignored_resources"] = [
+        "*.pyc",
+        "*~",
+        ".ropeproject",
+        ".hg",
+        ".svn",
+        "_svn",
+        ".git",
+        ".tox",
+    ]
 
     # Specifies which files should be considered python files.  It is
     # useful when you have scripts inside your project.  Only files
     # ending with ``.py`` are considered to be python files by
     # default.
-    #prefs['python_files'] = ['*.py']
+    # prefs['python_files'] = ['*.py']
 
     # Custom source folders:  By default rope searches the project
     # for finding source folders (folders that should be searched
     # for finding modules).  You can add paths to that list.  Note
     # that rope guesses project source folders correctly most of the
     # time; use this if you have any problems.
     # The folders should be relative to project root and use '/' for
     # separating folders regardless of the platform rope is running on.
     # 'src/my_source_folder' for instance.
-    #prefs.add('source_folders', 'src')
+    # prefs.add('source_folders', 'src')
 
     # You can extend python path for looking up modules
-    #prefs.add('python_path', '~/python/')
+    # prefs.add('python_path', '~/python/')
 
     # Should rope save object information or not.
-    prefs['save_objectdb'] = True
-    prefs['compress_objectdb'] = False
+    prefs["save_objectdb"] = True
+    prefs["compress_objectdb"] = False
 
     # If `True`, rope analyzes each module when it is being saved.
-    prefs['automatic_soa'] = True
+    prefs["automatic_soa"] = True
     # The depth of calls to follow in static object analysis
-    prefs['soa_followed_calls'] = 0
+    prefs["soa_followed_calls"] = 0
 
     # If `False` when running modules or unit tests "dynamic object
     # analysis" is turned off.  This makes them much faster.
-    prefs['perform_doa'] = True
+    prefs["perform_doa"] = True
 
     # Rope can check the validity of its object DB when running.
-    prefs['validate_objectdb'] = True
+    prefs["validate_objectdb"] = True
 
     # How many undos to hold?
-    prefs['max_history_items'] = 32
+    prefs["max_history_items"] = 32
 
     # Shows whether to save history across sessions.
-    prefs['save_history'] = True
-    prefs['compress_history'] = False
+    prefs["save_history"] = True
+    prefs["compress_history"] = False
 
     # Set the number spaces used for indenting.  According to
     # :PEP:`8`, it is best to use 4 spaces.  Since most of rope's
     # unit-tests use 4 spaces it is more reliable, too.
-    prefs['indent_size'] = 4
+    prefs["indent_size"] = 4
 
     # Builtin and c-extension modules that are allowed to be imported
     # and inspected by rope.
-    prefs['extension_modules'] = []
+    prefs["extension_modules"] = []
 
     # Add all standard c-extensions to extension_modules list.
-    prefs['import_dynload_stdmods'] = True
+    prefs["import_dynload_stdmods"] = True
 
     # If `True` modules with syntax errors are considered to be empty.
     # The default value is `False`; When `False` syntax errors raise
     # `rope.base.exceptions.ModuleSyntaxError` exception.
-    prefs['ignore_syntax_errors'] = False
+    prefs["ignore_syntax_errors"] = False
 
     # If `True`, rope ignores unresolvable imports.  Otherwise, they
     # appear in the importing namespace.
-    prefs['ignore_bad_imports'] = False
+    prefs["ignore_bad_imports"] = False
 
     # If `True`, rope will insert new module imports as
     # `from <package> import <module>` by default.
-    prefs['prefer_module_from_imports'] = False
+    prefs["prefer_module_from_imports"] = False
 
     # If `True`, rope will transform a comma list of imports into
     # multiple separate import statements when organizing
     # imports.
-    prefs['split_imports'] = False
+    prefs["split_imports"] = False
 
     # If `True`, rope will remove all top-level import statements and
     # reinsert them at the top of the module when making changes.
-    prefs['pull_imports_to_top'] = True
+    prefs["pull_imports_to_top"] = True
 
     # If `True`, rope will sort imports alphabetically by module name instead of
     # alphabetically by import statement, with from imports after normal
     # imports.
-    prefs['sort_imports_alphabetically'] = False
+    prefs["sort_imports_alphabetically"] = False
 
     # Location of implementation of rope.base.oi.type_hinting.interfaces.ITypeHintingFactory
     # In general case, you don't have to change this value, unless you're an rope expert.
     # Change this value to inject you own implementations of interfaces
     # listed in module rope.base.oi.type_hinting.providers.interfaces
     # For example, you can add you own providers for Django Models, or disable the search
     # type-hinting in a class hierarchy, etc.
-    prefs['type_hinting_factory'] = 'rope.base.oi.type_hinting.factory.default_type_hinting_factory'
+    prefs[
+        "type_hinting_factory"
+    ] = "rope.base.oi.type_hinting.factory.default_type_hinting_factory"
 
 
 def project_opened(project):
     """This function is called after opening the project"""
     # Do whatever you like here!
--- matrix_client/user.py  (original)
+++ matrix_client/user.py  (formatted)
@@ -16,10 +16,11 @@
 
 
 class User(object):
     """ The User class can be used to call user specific functions.
     """
+
     def __init__(self, api, user_id, displayname=None):
         check_user_id(user_id)
 
         self.user_id = user_id
         self.displayname = displayname

This would not get rid of the necessity of properly formatting docstrings.

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

matrix_client ディレクトリに対して提案されている Black の diff を確認し、現在 pull request でフォーマットがどのように扱われているかを判断します。Black の適用によって対象となる範囲と、コントリビューターがどのように実行するかを定義します。プロジェクトに、pull request 用の合意済みで再現可能なフォーマットチェックが整備された時点で作業は完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
python
領域
tooling
issue の種類
機能追加
難易度
3/5
見積もり時間
1〜2日
活発さ
停滞
明瞭さ
説明が足りない
初心者へのやさしさ
25/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。