Philipp Hörist pushed to branch master at gajim / python-nbxmpp

Commits:

4 changed files:

Changes:

  • README.md
    ... ... @@ -4,7 +4,7 @@
    4 4
     
    
    5 5
     ## Runtime Requirements
    
    6 6
     
    
    7
    -- python >= 3.7.0
    
    7
    +- python >= 3.9.0
    
    8 8
     - PyGObject
    
    9 9
     - GLib >= 2.60
    
    10 10
     - libsoup
    

  • mypy.ini
    1 1
     [mypy]
    
    2
    -python_version = 3.7
    
    2
    +python_version = 3.9
    
    3 3
     warn_unused_configs = True
    
    4 4
     disallow_incomplete_defs = True
    
    5 5
     allow_redefinition = True
    

  • nbxmpp/task.py
    ... ... @@ -15,6 +15,12 @@
    15 15
     # You should have received a copy of the GNU General Public License
    
    16 16
     # along with this program; If not, see <http://www.gnu.org/licenses/>.
    
    17 17
     
    
    18
    +from __future__ import annotations
    
    19
    +
    
    20
    +from typing import Any
    
    21
    +from typing import Optional
    
    22
    +from typing import Callable
    
    23
    +
    
    18 24
     import weakref
    
    19 25
     import inspect
    
    20 26
     import logging
    
    ... ... @@ -22,11 +28,12 @@ from enum import IntEnum
    22 28
     from functools import wraps
    
    23 29
     
    
    24 30
     from gi.repository import Soup
    
    31
    +from nbxmpp.modules.base import BaseModule
    
    25 32
     
    
    33
    +from nbxmpp.simplexml import Node
    
    26 34
     from nbxmpp.errors import is_error
    
    27 35
     from nbxmpp.errors import CancelledError
    
    28 36
     from nbxmpp.errors import TimeoutStanzaError
    
    29
    -from nbxmpp.simplexml import Node
    
    30 37
     from nbxmpp.modules.util import make_func_arguments_string
    
    31 38
     
    
    32 39
     
    
    ... ... @@ -66,7 +73,10 @@ class TaskState(IntEnum):
    66 73
             return self == TaskState.CANCELLED
    
    67 74
     
    
    68 75
     
    
    69
    -def _setup_task(task, client, callback, user_data):
    
    76
    +def _setup_task(task: Task,
    
    77
    +                client: Any,
    
    78
    +                callback: Optional[Callable[..., Any]],
    
    79
    +                user_data: Any):
    
    70 80
         client.add_task(task)
    
    71 81
         task.set_finalize_func(client.remove_task)
    
    72 82
         task.set_user_data(user_data)
    
    ... ... @@ -78,7 +88,12 @@ def _setup_task(task, client, callback, user_data):
    78 88
     
    
    79 89
     def iq_request_task(func):
    
    80 90
         @wraps(func)
    
    81
    -    def func_wrapper(self, *args, timeout=None, callback=None, user_data=None, **kwargs):
    
    91
    +    def func_wrapper(self: BaseModule,
    
    92
    +                     *args,
    
    93
    +                     timeout: Optional[int] = None,
    
    94
    +                     callback: Optional[Callable[..., Any]] = None,
    
    95
    +                     user_data: Any = None,
    
    96
    +                     **kwargs):
    
    82 97
             if self._log.isEnabledFor(logging.INFO):
    
    83 98
                 self._log.info(make_func_arguments_string(func, self, args, kwargs))
    
    84 99
             task = IqRequestTask(func(self, *args, **kwargs),
    
    ... ... @@ -122,24 +137,26 @@ class Task:
    122 137
     
    
    123 138
         _process_types = (NoType,)
    
    124 139
     
    
    125
    -    def __init__(self, gen, logger=log):
    
    140
    +    def __init__(self, gen, logger: logging.Logger = log):
    
    126 141
             self._logger = logger
    
    127 142
             self._gen = gen
    
    128
    -        self._done_callbacks = []
    
    143
    +        self._done_callbacks: list[Callable[..., Any]] = []
    
    129 144
             self._sub_task = None
    
    130 145
             self._result = None
    
    131 146
             self._error = None
    
    132
    -        self._user_data = None
    
    133
    -        self._timeout = None
    
    147
    +        self._user_data: Optional[Any] = None
    
    148
    +        self._timeout: Optional[int] = None
    
    134 149
             self._finalize_func = None
    
    135 150
             self._finalize_context = None
    
    136 151
             self._state = TaskState.INIT
    
    137 152
     
    
    138 153
         @property
    
    139
    -    def state(self):
    
    154
    +    def state(self) -> TaskState:
    
    140 155
             return self._state
    
    141 156
     
    
    142
    -    def add_done_callback(self, callback, weak=True):
    
    157
    +    def add_done_callback(self,
    
    158
    +                          callback: Callable[..., Any],
    
    159
    +                          weak: bool = True):
    
    143 160
             if self._state.is_finished or self._state.is_cancelled:
    
    144 161
                 raise RuntimeError('Task is finished')
    
    145 162
     
    
    ... ... @@ -153,7 +170,7 @@ class Task:
    153 170
     
    
    154 171
             self._done_callbacks.append(callback)
    
    155 172
     
    
    156
    -    def set_timeout(self, timeout):
    
    173
    +    def set_timeout(self, timeout: Optional[int]):
    
    157 174
             self._timeout = timeout
    
    158 175
     
    
    159 176
         def start(self):
    
    ... ... @@ -170,7 +187,7 @@ class Task:
    170 187
         def _async_finished(self, *args, **kwargs):
    
    171 188
             raise NotImplementedError
    
    172 189
     
    
    173
    -    def _sub_task_completed(self, task):
    
    190
    +    def _sub_task_completed(self, task: Task):
    
    174 191
             self._sub_task = None
    
    175 192
             if not self._state.is_running:
    
    176 193
                 return
    
    ... ... @@ -255,13 +272,15 @@ class Task:
    255 272
                 raise self._error  # pylint: disable=raising-bad-type
    
    256 273
             return self._result
    
    257 274
     
    
    258
    -    def set_user_data(self, user_data):
    
    275
    +    def set_user_data(self, user_data: Any):
    
    259 276
             self._user_data = user_data
    
    260 277
     
    
    261
    -    def get_user_data(self):
    
    278
    +    def get_user_data(self) -> Any:
    
    262 279
             return self._user_data
    
    263 280
     
    
    264
    -    def set_finalize_func(self, func, context=None):
    
    281
    +    def set_finalize_func(self,
    
    282
    +                          func: Callable[..., Any],
    
    283
    +                          context: Optional[Any] = None):
    
    265 284
             self._finalize_func = func
    
    266 285
             self._finalize_context = context
    
    267 286
     
    
    ... ... @@ -302,7 +321,7 @@ class IqRequestTask(Task):
    302 321
             self._client = client
    
    303 322
             self._iq_id = None
    
    304 323
     
    
    305
    -    def _run_async(self, stanza):
    
    324
    +    def _run_async(self, stanza: Node):
    
    306 325
             self._iq_id = self._client.send_stanza(stanza,
    
    307 326
                                                    callback=self._async_finished,
    
    308 327
                                                    timeout=self._timeout)
    

  • setup.cfg
    ... ... @@ -11,10 +11,10 @@ url = https://dev.gajim.org/gajim/python-nbxmpp
    11 11
     license_file = COPYING
    
    12 12
     license = GPL v3
    
    13 13
     classifiers =
    
    14
    -    Programming Language :: Python :: 3
    
    14
    +    Programming Language :: Python :: 3.9
    
    15 15
     
    
    16 16
     [options]
    
    17
    -python_requires = >=3.7
    
    17
    +python_requires = >=3.9
    
    18 18
     packages = find:
    
    19 19
     install_requires =
    
    20 20
         precis-i18n>=1.0.0