mypy: Update zerver directory to use Text

This commit is contained in:
Juan Verhook
2016-12-26 22:09:35 -08:00
committed by showell
parent 5639f21188
commit cfa9c2eaf2
9 changed files with 49 additions and 56 deletions

View File

@@ -29,8 +29,7 @@ from io import BytesIO
from zerver.lib.mandrill_client import get_mandrill_client from zerver.lib.mandrill_client import get_mandrill_client
from six.moves import zip, urllib from six.moves import zip, urllib
from six import text_type from typing import Union, Any, Callable, Sequence, Dict, Optional, TypeVar, Text
from typing import Union, Any, Callable, Sequence, Dict, Optional, TypeVar
from zerver.lib.str_utils import force_bytes from zerver.lib.str_utils import force_bytes
if settings.ZILENCER_ENABLED: if settings.ZILENCER_ENABLED:
@@ -44,7 +43,7 @@ FuncT = TypeVar('FuncT', bound=Callable[..., Any])
ViewFuncT = TypeVar('ViewFuncT', bound=Callable[..., HttpResponse]) ViewFuncT = TypeVar('ViewFuncT', bound=Callable[..., HttpResponse])
def get_deployment_or_userprofile(role): def get_deployment_or_userprofile(role):
# type: (text_type) -> Union[UserProfile, Deployment] # type: (Text) -> Union[UserProfile, Deployment]
return get_user_profile_by_email(role) if "@" in role else get_deployment_by_domain(role) return get_user_profile_by_email(role) if "@" in role else get_deployment_by_domain(role)
class _RespondAsynchronously(object): class _RespondAsynchronously(object):
@@ -120,7 +119,7 @@ def require_realm_admin(func):
from zerver.lib.user_agent import parse_user_agent from zerver.lib.user_agent import parse_user_agent
def get_client_name(request, is_json_view): def get_client_name(request, is_json_view):
# type: (HttpRequest, bool) -> text_type # type: (HttpRequest, bool) -> Text
# If the API request specified a client in the request content, # If the API request specified a client in the request content,
# that has priority. Otherwise, extract the client from the # that has priority. Otherwise, extract the client from the
# User-Agent. # User-Agent.
@@ -150,7 +149,7 @@ def get_client_name(request, is_json_view):
return "Unspecified" return "Unspecified"
def process_client(request, user_profile, is_json_view=False, client_name=None): def process_client(request, user_profile, is_json_view=False, client_name=None):
# type: (HttpRequest, UserProfile, bool, Optional[text_type]) -> None # type: (HttpRequest, UserProfile, bool, Optional[Text]) -> None
if client_name is None: if client_name is None:
client_name = get_client_name(request, is_json_view) client_name = get_client_name(request, is_json_view)
@@ -163,7 +162,7 @@ def process_client(request, user_profile, is_json_view=False, client_name=None):
update_user_activity(request, user_profile) update_user_activity(request, user_profile)
def validate_api_key(request, role, api_key, is_webhook=False): def validate_api_key(request, role, api_key, is_webhook=False):
# type: (HttpRequest, text_type, text_type, bool) -> Union[UserProfile, Deployment] # type: (HttpRequest, Text, Text, bool) -> Union[UserProfile, Deployment]
# Remove whitespace to protect users from trivial errors. # Remove whitespace to protect users from trivial errors.
role, api_key = role.strip(), api_key.strip() role, api_key = role.strip(), api_key.strip()
@@ -204,7 +203,7 @@ def validate_api_key(request, role, api_key, is_webhook=False):
# Use this for webhook views that don't get an email passed in. # Use this for webhook views that don't get an email passed in.
def api_key_only_webhook_view(client_name): def api_key_only_webhook_view(client_name):
# type: (text_type) -> Callable[..., HttpResponse] # type: (Text) -> Callable[..., HttpResponse]
# This function can't be typed perfectly because returning a generic function # This function can't be typed perfectly because returning a generic function
# isn't supported in mypy - https://github.com/python/mypy/issues/1551. # isn't supported in mypy - https://github.com/python/mypy/issues/1551.
def _wrapped_view_func(view_func): def _wrapped_view_func(view_func):
@@ -214,7 +213,7 @@ def api_key_only_webhook_view(client_name):
@wraps(view_func) @wraps(view_func)
def _wrapped_func_arguments(request, api_key=REQ(), def _wrapped_func_arguments(request, api_key=REQ(),
*args, **kwargs): *args, **kwargs):
# type: (HttpRequest, text_type, *Any, **Any) -> HttpResponse # type: (HttpRequest, Text, *Any, **Any) -> HttpResponse
try: try:
user_profile = UserProfile.objects.get(api_key=api_key) user_profile = UserProfile.objects.get(api_key=api_key)
except UserProfile.DoesNotExist: except UserProfile.DoesNotExist:
@@ -241,7 +240,7 @@ def api_key_only_webhook_view(client_name):
# From Django 1.8, modified to leave off ?next=/ # From Django 1.8, modified to leave off ?next=/
def redirect_to_login(next, login_url=None, def redirect_to_login(next, login_url=None,
redirect_field_name=REDIRECT_FIELD_NAME): redirect_field_name=REDIRECT_FIELD_NAME):
# type: (text_type, Optional[text_type], text_type) -> HttpResponseRedirect # type: (Text, Optional[Text], Text) -> HttpResponseRedirect
""" """
Redirects the user to the login page, passing the given 'next' page Redirects the user to the login page, passing the given 'next' page
""" """
@@ -259,7 +258,7 @@ def redirect_to_login(next, login_url=None,
# From Django 1.8 # From Django 1.8
def user_passes_test(test_func, login_url=None, redirect_field_name=REDIRECT_FIELD_NAME): def user_passes_test(test_func, login_url=None, redirect_field_name=REDIRECT_FIELD_NAME):
# type: (Callable[[UserProfile], bool], Optional[text_type], text_type) -> Callable[[Callable[..., HttpResponse]], Callable[..., HttpResponse]] # type: (Callable[[UserProfile], bool], Optional[Text], Text) -> Callable[[Callable[..., HttpResponse]], Callable[..., HttpResponse]]
""" """
Decorator for views that checks that the user passes the given test, Decorator for views that checks that the user passes the given test,
redirecting to the log-in page if necessary. The test should be a callable redirecting to the log-in page if necessary. The test should be a callable
@@ -300,7 +299,7 @@ def logged_in_and_active(request):
def zulip_login_required(function=None, def zulip_login_required(function=None,
redirect_field_name=REDIRECT_FIELD_NAME, redirect_field_name=REDIRECT_FIELD_NAME,
login_url=settings.HOME_NOT_LOGGED_IN): login_url=settings.HOME_NOT_LOGGED_IN):
# type: (Optional[Callable[..., HttpResponse]], text_type, text_type) -> Union[Callable[[Callable[..., HttpResponse]], Callable[..., HttpResponse]], Callable[..., HttpResponse]] # type: (Optional[Callable[..., HttpResponse]], Text, Text) -> Union[Callable[[Callable[..., HttpResponse]], Callable[..., HttpResponse]], Callable[..., HttpResponse]]
actual_decorator = user_passes_test( actual_decorator = user_passes_test(
logged_in_and_active, logged_in_and_active,
login_url=login_url, login_url=login_url,
@@ -340,7 +339,7 @@ def authenticated_api_view(is_webhook=False):
def _wrapped_func_arguments(request, email=REQ(), api_key=REQ(default=None), def _wrapped_func_arguments(request, email=REQ(), api_key=REQ(default=None),
api_key_legacy=REQ('api-key', default=None), api_key_legacy=REQ('api-key', default=None),
*args, **kwargs): *args, **kwargs):
# type: (HttpRequest, text_type, Optional[text_type], Optional[text_type], *Any, **Any) -> HttpResponse # type: (HttpRequest, Text, Optional[Text], Optional[Text], *Any, **Any) -> HttpResponse
if not api_key and not api_key_legacy: if not api_key and not api_key_legacy:
raise RequestVariableMissingError("api_key") raise RequestVariableMissingError("api_key")
elif not api_key: elif not api_key:
@@ -478,7 +477,7 @@ def authenticated_json_view(view_func):
return _wrapped_view_func # type: ignore # https://github.com/python/mypy/issues/1927 return _wrapped_view_func # type: ignore # https://github.com/python/mypy/issues/1927
def is_local_addr(addr): def is_local_addr(addr):
# type: (text_type) -> bool # type: (Text) -> bool
return addr in ('127.0.0.1', '::1') return addr in ('127.0.0.1', '::1')
# These views are used by the main Django server to notify the Tornado server # These views are used by the main Django server to notify the Tornado server
@@ -518,14 +517,14 @@ def internal_notify_view(view_func):
# Converter functions for use with has_request_variables # Converter functions for use with has_request_variables
def to_non_negative_int(s): def to_non_negative_int(s):
# type: (text_type) -> int # type: (Text) -> int
x = int(s) x = int(s)
if x < 0: if x < 0:
raise ValueError("argument is negative") raise ValueError("argument is negative")
return x return x
def flexible_boolean(boolean): def flexible_boolean(boolean):
# type: (text_type) -> bool # type: (Text) -> bool
"""Returns True for any of "1", "true", or "True". Returns False otherwise.""" """Returns True for any of "1", "true", or "True". Returns False otherwise."""
if boolean in ("1", "true", "True"): if boolean in ("1", "true", "True"):
return True return True
@@ -533,7 +532,7 @@ def flexible_boolean(boolean):
return False return False
def statsd_increment(counter, val=1): def statsd_increment(counter, val=1):
# type: (text_type, int) -> Callable[[Callable[..., Any]], Callable[..., Any]] # type: (Text, int) -> Callable[[Callable[..., Any]], Callable[..., Any]]
"""Increments a statsd counter on completion of the """Increments a statsd counter on completion of the
decorated function. decorated function.
@@ -550,7 +549,7 @@ def statsd_increment(counter, val=1):
return wrapper return wrapper
def rate_limit_user(request, user, domain): def rate_limit_user(request, user, domain):
# type: (HttpRequest, UserProfile, text_type) -> None # type: (HttpRequest, UserProfile, Text) -> None
"""Returns whether or not a user was rate limited. Will raise a RateLimited exception """Returns whether or not a user was rate limited. Will raise a RateLimited exception
if the user has been rate limited, otherwise returns and modifies request to contain if the user has been rate limited, otherwise returns and modifies request to contain
the rate limit information""" the rate limit information"""
@@ -571,7 +570,7 @@ def rate_limit_user(request, user, domain):
request._ratelimit_secs_to_freedom = time_reset request._ratelimit_secs_to_freedom = time_reset
def rate_limit(domain='all'): def rate_limit(domain='all'):
# type: (text_type) -> Callable[[Callable[..., HttpResponse]], Callable[..., HttpResponse]] # type: (Text) -> Callable[[Callable[..., HttpResponse]], Callable[..., HttpResponse]]
"""Rate-limits a view. Takes an optional 'domain' param if you wish to rate limit different """Rate-limits a view. Takes an optional 'domain' param if you wish to rate limit different
types of API calls independently. types of API calls independently.

View File

@@ -22,8 +22,7 @@ import logging
import re import re
import DNS import DNS
from six import text_type from typing import Any, Callable, Optional, Text
from typing import Any, Callable, Optional
MIT_VALIDATION_ERROR = u'That user does not exist at MIT or is a ' + \ MIT_VALIDATION_ERROR = u'That user does not exist at MIT or is a ' + \
u'<a href="https://ist.mit.edu/email-lists">mailing list</a>. ' + \ u'<a href="https://ist.mit.edu/email-lists">mailing list</a>. ' + \
@@ -34,14 +33,14 @@ WRONG_SUBDOMAIN_ERROR = "Your Zulip account is not a member of the " + \
"Please contact %s with any questions!" % (settings.ZULIP_ADMINISTRATOR,) "Please contact %s with any questions!" % (settings.ZULIP_ADMINISTRATOR,)
def get_registration_string(domain): def get_registration_string(domain):
# type: (text_type) -> text_type # type: (Text) -> Text
register_url = reverse('register') + domain register_url = reverse('register') + domain
register_account_string = _('The organization with the domain already exists. ' register_account_string = _('The organization with the domain already exists. '
'Please register your account <a href=%(url)s>here</a>.') % {'url': register_url} 'Please register your account <a href=%(url)s>here</a>.') % {'url': register_url}
return register_account_string return register_account_string
def email_is_not_mit_mailing_list(email): def email_is_not_mit_mailing_list(email):
# type: (text_type) -> None # type: (Text) -> None
"""Prevent MIT mailing lists from signing up for Zulip""" """Prevent MIT mailing lists from signing up for Zulip"""
if "@mit.edu" in email: if "@mit.edu" in email:
username = email.rsplit("@", 1)[0] username = email.rsplit("@", 1)[0]
@@ -143,7 +142,7 @@ class HomepageForm(forms.Form):
return email return email
def email_is_not_disposable(email): def email_is_not_disposable(email):
# type: (text_type) -> None # type: (Text) -> None
if is_disposable_domain(email_to_domain(email)): if is_disposable_domain(email_to_domain(email)):
raise ValidationError(_("Please use your real email address.")) raise ValidationError(_("Please use your real email address."))

View File

@@ -21,7 +21,6 @@ import os
import os.path import os.path
import hashlib import hashlib
import six import six
from six import text_type
if False: if False:
from zerver.models import UserProfile, Realm, Message from zerver.models import UserProfile, Realm, Message
@@ -79,7 +78,7 @@ def get_or_create_key_prefix():
filename = os.path.join(settings.DEPLOY_ROOT, "var", "remote_cache_prefix") filename = os.path.join(settings.DEPLOY_ROOT, "var", "remote_cache_prefix")
try: try:
fd = os.open(filename, os.O_CREAT | os.O_EXCL | os.O_RDWR, 0o444) fd = os.open(filename, os.O_CREAT | os.O_EXCL | os.O_RDWR, 0o444)
random_hash = hashlib.sha256(text_type(random.getrandbits(256)).encode('utf-8')).digest() random_hash = hashlib.sha256(Text(random.getrandbits(256)).encode('utf-8')).digest()
prefix = base64.b16encode(random_hash)[:32].decode('utf-8').lower() + ':' prefix = base64.b16encode(random_hash)[:32].decode('utf-8').lower() + ':'
# This does close the underlying file # This does close the underlying file
with os.fdopen(fd, 'w') as f: with os.fdopen(fd, 'w') as f:
@@ -107,7 +106,7 @@ KEY_PREFIX = get_or_create_key_prefix() # type: Text
def bounce_key_prefix_for_testing(test_name): def bounce_key_prefix_for_testing(test_name):
# type: (Text) -> None # type: (Text) -> None
global KEY_PREFIX global KEY_PREFIX
KEY_PREFIX = test_name + u':' + text_type(os.getpid()) + u':' KEY_PREFIX = test_name + u':' + Text(os.getpid()) + u':'
def get_cache_backend(cache_name): def get_cache_backend(cache_name):
# type: (Optional[str]) -> BaseCache # type: (Optional[str]) -> BaseCache

View File

@@ -56,7 +56,7 @@ import time
import ujson import ujson
import unittest import unittest
from six.moves import urllib from six.moves import urllib
from six import text_type, binary_type from six import binary_type
from zerver.lib.str_utils import NonBinaryStr from zerver.lib.str_utils import NonBinaryStr
from contextlib import contextmanager from contextlib import contextmanager
@@ -250,7 +250,7 @@ class ZulipTestCase(TestCase):
user_profile=user_profile, user_profile=user_profile,
active=True, active=True,
recipient__type=Recipient.STREAM) recipient__type=Recipient.STREAM)
return [cast(text_type, get_display_recipient(sub.recipient)) for sub in subs] return [cast(Text, get_display_recipient(sub.recipient)) for sub in subs]
def send_message(self, sender_name, raw_recipients, message_type, def send_message(self, sender_name, raw_recipients, message_type,
content=u"test content", subject=u"test", **kwargs): content=u"test content", subject=u"test", **kwargs):

View File

@@ -1,7 +1,7 @@
from __future__ import absolute_import from __future__ import absolute_import
from six import text_type, binary_type from six import binary_type
from typing import Any, AnyStr, Callable, Iterable, MutableMapping, Optional from typing import Any, AnyStr, Callable, Iterable, MutableMapping, Optional, Text
from django.conf import settings from django.conf import settings
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
@@ -85,7 +85,7 @@ def format_timedelta(timedelta):
return "%.0fms" % (timedelta_ms(timedelta),) return "%.0fms" % (timedelta_ms(timedelta),)
def is_slow_query(time_delta, path): def is_slow_query(time_delta, path):
# type: (float, text_type) -> bool # type: (float, Text) -> bool
if time_delta < 1.2: if time_delta < 1.2:
return False return False
is_exempt = \ is_exempt = \
@@ -101,7 +101,7 @@ def is_slow_query(time_delta, path):
def write_log_line(log_data, path, method, remote_ip, email, client_name, def write_log_line(log_data, path, method, remote_ip, email, client_name,
status_code=200, error_content=None, error_content_iter=None): status_code=200, error_content=None, error_content_iter=None):
# type: (MutableMapping[str, Any], text_type, str, str, text_type, text_type, int, Optional[AnyStr], Optional[Iterable[AnyStr]]) -> None # type: (MutableMapping[str, Any], Text, str, str, Text, Text, int, Optional[AnyStr], Optional[Iterable[AnyStr]]) -> None
assert error_content is None or error_content_iter is None assert error_content is None or error_content_iter is None
if error_content is not None: if error_content is not None:
error_content_iter = (error_content,) error_content_iter = (error_content,)
@@ -219,7 +219,7 @@ def write_log_line(log_data, path, method, remote_ip, email, client_name,
error_content_list = list(error_content_iter) error_content_list = list(error_content_iter)
if error_content_list: if error_content_list:
error_data = u'' error_data = u''
elif isinstance(error_content_list[0], text_type): elif isinstance(error_content_list[0], Text):
error_data = u''.join(error_content_list) error_data = u''.join(error_content_list)
elif isinstance(error_content_list[0], binary_type): elif isinstance(error_content_list[0], binary_type):
error_data = repr(b''.join(error_content_list)) error_data = repr(b''.join(error_content_list))
@@ -308,7 +308,7 @@ class TagRequests(object):
request.error_format = "HTML" request.error_format = "HTML"
def csrf_failure(request, reason=""): def csrf_failure(request, reason=""):
# type: (HttpRequest, Optional[text_type]) -> HttpResponse # type: (HttpRequest, Optional[Text]) -> HttpResponse
if request.error_format == "JSON": if request.error_format == "JSON":
return json_error(_("CSRF Error: %s") % (reason,), status=403) return json_error(_("CSRF Error: %s") % (reason,), status=403)
else: else:

View File

@@ -1,5 +1,5 @@
from zerver.lib.test_classes import WebhookTestCase from zerver.lib.test_classes import WebhookTestCase
from six import text_type from typing import Text
class PapertrailHookTests(WebhookTestCase): class PapertrailHookTests(WebhookTestCase):
STREAM_NAME = 'papertrail' STREAM_NAME = 'papertrail'
@@ -42,5 +42,5 @@ May 18 20:30:02 abc cron OR server1:
content_type="application/x-www-form-urlencoded") content_type="application/x-www-form-urlencoded")
def get_body(self, fixture_name): def get_body(self, fixture_name):
# type: (text_type) -> text_type # type: (Text) -> Text
return self.fixture_data("papertrail", fixture_name, file_type="json") return self.fixture_data("papertrail", fixture_name, file_type="json")

View File

@@ -1,5 +1,5 @@
from __future__ import absolute_import from __future__ import absolute_import
from typing import cast, AbstractSet, Any, Optional, Iterable, Sequence, Mapping, MutableMapping, Callable, Union from typing import cast, AbstractSet, Any, Optional, Iterable, Sequence, Mapping, MutableMapping, Callable, Union, Text
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.conf import settings from django.conf import settings
@@ -34,7 +34,6 @@ from zerver.lib.timestamp import timestamp_to_datetime
from zerver.tornado.descriptors import clear_descriptor_by_handler_id, set_descriptor_by_handler_id from zerver.tornado.descriptors import clear_descriptor_by_handler_id, set_descriptor_by_handler_id
import copy import copy
import six import six
from six import text_type
requests_client = requests.Session() requests_client = requests.Session()
for host in ['127.0.0.1', 'localhost']: for host in ['127.0.0.1', 'localhost']:
@@ -64,7 +63,7 @@ class ClientDescriptor(object):
def __init__(self, user_profile_id, user_profile_email, realm_id, event_queue, def __init__(self, user_profile_id, user_profile_email, realm_id, event_queue,
event_types, client_type_name, apply_markdown=True, event_types, client_type_name, apply_markdown=True,
all_public_streams=False, lifespan_secs=0, narrow=[]): all_public_streams=False, lifespan_secs=0, narrow=[]):
# type: (int, text_type, int, EventQueue, Optional[Sequence[str]], text_type, bool, bool, int, Iterable[Sequence[text_type]]) -> None # type: (int, Text, int, EventQueue, Optional[Sequence[str]], Text, bool, bool, int, Iterable[Sequence[Text]]) -> None
# These objects are serialized on shutdown and restored on restart. # These objects are serialized on shutdown and restored on restart.
# If fields are added or semantics are changed, temporary code must be # If fields are added or semantics are changed, temporary code must be
# added to load_event_queues() to update the restored objects. # added to load_event_queues() to update the restored objects.
@@ -73,7 +72,7 @@ class ClientDescriptor(object):
self.user_profile_email = user_profile_email self.user_profile_email = user_profile_email
self.realm_id = realm_id self.realm_id = realm_id
self.current_handler_id = None # type: Optional[int] self.current_handler_id = None # type: Optional[int]
self.current_client_name = None # type: Optional[text_type] self.current_client_name = None # type: Optional[Text]
self.event_queue = event_queue self.event_queue = event_queue
self.queue_timeout = lifespan_secs self.queue_timeout = lifespan_secs
self.event_types = event_types self.event_types = event_types
@@ -176,7 +175,7 @@ class ClientDescriptor(object):
and now - self.last_connection_time >= self.queue_timeout) and now - self.last_connection_time >= self.queue_timeout)
def connect_handler(self, handler_id, client_name): def connect_handler(self, handler_id, client_name):
# type: (int, text_type) -> None # type: (int, Text) -> None
self.current_handler_id = handler_id self.current_handler_id = handler_id
self.current_client_name = client_name self.current_client_name = client_name
set_descriptor_by_handler_id(handler_id, self) set_descriptor_by_handler_id(handler_id, self)
@@ -494,8 +493,8 @@ def fetch_events(query):
last_event_id = query["last_event_id"] # type: int last_event_id = query["last_event_id"] # type: int
user_profile_id = query["user_profile_id"] # type: int user_profile_id = query["user_profile_id"] # type: int
new_queue_data = query.get("new_queue_data") # type: Optional[MutableMapping[str, Any]] new_queue_data = query.get("new_queue_data") # type: Optional[MutableMapping[str, Any]]
user_profile_email = query["user_profile_email"] # type: text_type user_profile_email = query["user_profile_email"] # type: Text
client_type_name = query["client_type_name"] # type: text_type client_type_name = query["client_type_name"] # type: Text
handler_id = query["handler_id"] # type: int handler_id = query["handler_id"] # type: int
try: try:
@@ -562,7 +561,7 @@ def extract_json_response(resp):
def request_event_queue(user_profile, user_client, apply_markdown, def request_event_queue(user_profile, user_client, apply_markdown,
queue_lifespan_secs, event_types=None, all_public_streams=False, queue_lifespan_secs, event_types=None, all_public_streams=False,
narrow=[]): narrow=[]):
# type: (UserProfile, Client, bool, int, Optional[Iterable[str]], bool, Iterable[Sequence[text_type]]) -> Optional[str] # type: (UserProfile, Client, bool, int, Optional[Iterable[str]], bool, Iterable[Sequence[Text]]) -> Optional[str]
if settings.TORNADO_SERVER: if settings.TORNADO_SERVER:
req = {'dont_block': 'true', req = {'dont_block': 'true',
'apply_markdown': ujson.dumps(apply_markdown), 'apply_markdown': ujson.dumps(apply_markdown),
@@ -648,7 +647,7 @@ def missedmessage_hook(user_profile_id, queue, last_for_client):
queue_json_publish("missedmessage_emails", notice, lambda notice: None) queue_json_publish("missedmessage_emails", notice, lambda notice: None)
def receiver_is_idle(user_profile_id, realm_presences): def receiver_is_idle(user_profile_id, realm_presences):
# type: (int, Optional[Dict[int, Dict[text_type, Dict[str, Any]]]]) -> bool # type: (int, Optional[Dict[int, Dict[Text, Dict[str, Any]]]]) -> bool
# If a user has no message-receiving event queues, they've got no open zulip # If a user has no message-receiving event queues, they've got no open zulip
# session so we notify them # session so we notify them
all_client_descriptors = get_client_descriptors_for_user(user_profile_id) all_client_descriptors = get_client_descriptors_for_user(user_profile_id)
@@ -684,14 +683,14 @@ def receiver_is_idle(user_profile_id, realm_presences):
def process_message_event(event_template, users): def process_message_event(event_template, users):
# type: (Mapping[str, Any], Iterable[Mapping[str, Any]]) -> None # type: (Mapping[str, Any], Iterable[Mapping[str, Any]]) -> None
realm_presences = {int(k): v for k, v in event_template['presences'].items()} # type: Dict[int, Dict[text_type, Dict[str, Any]]] realm_presences = {int(k): v for k, v in event_template['presences'].items()} # type: Dict[int, Dict[Text, Dict[str, Any]]]
sender_queue_id = event_template.get('sender_queue_id', None) # type: Optional[str] sender_queue_id = event_template.get('sender_queue_id', None) # type: Optional[str]
message_dict_markdown = event_template['message_dict_markdown'] # type: Dict[str, Any] message_dict_markdown = event_template['message_dict_markdown'] # type: Dict[str, Any]
message_dict_no_markdown = event_template['message_dict_no_markdown'] # type: Dict[str, Any] message_dict_no_markdown = event_template['message_dict_no_markdown'] # type: Dict[str, Any]
sender_id = message_dict_markdown['sender_id'] # type: int sender_id = message_dict_markdown['sender_id'] # type: int
message_id = message_dict_markdown['id'] # type: int message_id = message_dict_markdown['id'] # type: int
message_type = message_dict_markdown['type'] # type: str message_type = message_dict_markdown['type'] # type: str
sending_client = message_dict_markdown['client'] # type: text_type sending_client = message_dict_markdown['client'] # type: Text
# To remove duplicate clients: Maps queue ID to {'client': Client, 'flags': flags} # To remove duplicate clients: Maps queue ID to {'client': Client, 'flags': flags}
send_to_clients = {} # type: Dict[str, Dict[str, Any]] send_to_clients = {} # type: Dict[str, Dict[str, Any]]

View File

@@ -1,7 +1,6 @@
from __future__ import absolute_import from __future__ import absolute_import
from six import text_type from typing import Any, Union, Mapping, Optional, Text
from typing import Any, Union, Mapping, Optional
from django.conf import settings from django.conf import settings
from django.utils import timezone from django.utils import timezone
@@ -35,7 +34,7 @@ from zerver.tornado.event_queue import get_client_descriptor
logger = logging.getLogger('zulip.socket') logger = logging.getLogger('zulip.socket')
def get_user_profile(session_id): def get_user_profile(session_id):
# type: (Optional[text_type]) -> Optional[UserProfile] # type: (Optional[Text]) -> Optional[UserProfile]
if session_id is None: if session_id is None:
return None return None
@@ -72,7 +71,7 @@ def deregister_connection(conn):
redis_client = get_redis_client() redis_client = get_redis_client()
def req_redis_key(req_id): def req_redis_key(req_id):
# type: (text_type) -> text_type # type: (Text) -> Text
return u'socket_req_status:%s' % (req_id,) return u'socket_req_status:%s' % (req_id,)
class SocketAuthError(Exception): class SocketAuthError(Exception):

View File

@@ -3,8 +3,6 @@ from __future__ import absolute_import
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.http import HttpRequest, HttpResponse from django.http import HttpRequest, HttpResponse
from six import text_type
from zerver.models import get_client, UserProfile, Client from zerver.models import get_client, UserProfile, Client
from zerver.decorator import asynchronous, \ from zerver.decorator import asynchronous, \
@@ -17,7 +15,7 @@ from zerver.tornado.event_queue import get_client_descriptor, \
process_notification, fetch_events process_notification, fetch_events
from django.core.handlers.base import BaseHandler from django.core.handlers.base import BaseHandler
from typing import Union, Optional, Iterable, Sequence, List from typing import Union, Optional, Iterable, Sequence, List, Text
import time import time
import ujson import ujson
@@ -29,7 +27,7 @@ def notify(request):
@has_request_variables @has_request_variables
def cleanup_event_queue(request, user_profile, queue_id=REQ()): def cleanup_event_queue(request, user_profile, queue_id=REQ()):
# type: (HttpRequest, UserProfile, text_type) -> HttpResponse # type: (HttpRequest, UserProfile, Text) -> HttpResponse
client = get_client_descriptor(str(queue_id)) client = get_client_descriptor(str(queue_id))
if client is None: if client is None:
return json_error(_("Bad event queue id: %s") % (queue_id,)) return json_error(_("Bad event queue id: %s") % (queue_id,))
@@ -51,7 +49,7 @@ def get_events_backend(request, user_profile, handler,
dont_block = REQ(default=False, validator=check_bool), dont_block = REQ(default=False, validator=check_bool),
narrow = REQ(default=[], validator=check_list(None)), narrow = REQ(default=[], validator=check_list(None)),
lifespan_secs = REQ(default=0, converter=int)): lifespan_secs = REQ(default=0, converter=int)):
# type: (HttpRequest, UserProfile, BaseHandler, Optional[Client], Optional[int], Optional[List[text_type]], bool, bool, Optional[text_type], bool, Iterable[Sequence[text_type]], int) -> Union[HttpResponse, _RespondAsynchronously] # type: (HttpRequest, UserProfile, BaseHandler, Optional[Client], Optional[int], Optional[List[Text]], bool, bool, Optional[Text], bool, Iterable[Sequence[Text]], int) -> Union[HttpResponse, _RespondAsynchronously]
if user_client is None: if user_client is None:
user_client = request.client user_client = request.client