From 643bd18b9fd72851ff93878f87227636bbac3c72 Mon Sep 17 00:00:00 2001 From: Anders Kaseorg Date: Fri, 19 Apr 2019 16:00:46 -0700 Subject: [PATCH] lint: Fix code that evaded our lint checks for string % non-tuple. Signed-off-by: Anders Kaseorg --- analytics/management/commands/user_stats.py | 2 +- analytics/views.py | 2 +- .../check_rabbitmq_consumers | 2 +- .../check_send_receive_time | 6 +-- .../check_postgres_replication_lag | 4 +- .../files/postgresql/process_fts_updates | 6 +-- .../files/zulip-ec2-configure-interfaces | 6 +-- templates/zerver/app/index.html | 4 +- templates/zerver/archive/index.html | 4 +- templates/zerver/base.html | 2 +- tools/check-issue-labels | 2 +- tools/lib/pretty_print.py | 2 +- tools/pretty-print-html | 2 +- tools/setup/build_pygments_data | 2 +- tools/tests/test_html_branches.py | 12 +++--- zerver/data_import/gitter.py | 8 ++-- zerver/data_import/import_util.py | 6 +-- zerver/data_import/slack.py | 10 ++--- zerver/decorator.py | 2 +- zerver/forms.py | 2 +- zerver/lib/actions.py | 14 +++---- zerver/lib/bugdown/__init__.py | 6 +-- zerver/lib/cache.py | 6 +-- zerver/lib/db.py | 2 +- zerver/lib/email_mirror.py | 2 +- zerver/lib/email_notifications.py | 4 +- zerver/lib/error_notify.py | 18 ++++---- zerver/lib/export.py | 10 ++--- zerver/lib/import_realm.py | 4 +- zerver/lib/logging_util.py | 2 +- zerver/lib/mobile_auth_otp.py | 2 +- zerver/lib/outgoing_webhook.py | 2 +- zerver/lib/push_notifications.py | 4 +- zerver/lib/soft_deactivation.py | 2 +- zerver/lib/test_fixtures.py | 6 +-- zerver/lib/test_helpers.py | 2 +- zerver/lib/test_runner.py | 2 +- zerver/lib/users.py | 2 +- zerver/lib/validator.py | 2 +- zerver/management/commands/makemessages.py | 2 +- zerver/management/commands/runtornado.py | 2 +- zerver/management/commands/send_test_email.py | 2 +- .../commands/send_webhook_fixture_message.py | 4 +- .../commands/soft_deactivate_users.py | 6 +-- zerver/middleware.py | 4 +- zerver/tests/test_auth_backends.py | 4 +- zerver/tests/test_bugdown.py | 18 ++++---- zerver/tests/test_custom_profile_data.py | 4 +- zerver/tests/test_email_notifications.py | 2 +- zerver/tests/test_events.py | 6 +-- zerver/tests/test_import_export.py | 4 +- zerver/tests/test_messages.py | 4 +- zerver/tests/test_new_users.py | 2 +- zerver/tests/test_realm.py | 2 +- zerver/tests/test_settings.py | 4 +- zerver/tests/test_slack_message_conversion.py | 2 +- zerver/tests/test_subs.py | 18 ++++---- zerver/tests/test_thumbnail.py | 42 +++++++++---------- zerver/tests/test_upload.py | 14 +++---- zerver/tests/test_users.py | 8 ++-- zerver/views/streams.py | 4 +- zerver/webhooks/freshdesk/view.py | 4 +- zerver/webhooks/newrelic/view.py | 2 +- zerver/worker/queue_processors.py | 4 +- zilencer/views.py | 2 +- 65 files changed, 175 insertions(+), 173 deletions(-) diff --git a/analytics/management/commands/user_stats.py b/analytics/management/commands/user_stats.py index 6faafa97e5..59d9a3c998 100644 --- a/analytics/management/commands/user_stats.py +++ b/analytics/management/commands/user_stats.py @@ -38,5 +38,5 @@ class Command(BaseCommand): for user_profile in user_profiles: print("%35s" % (user_profile.email,), end=' ') for week in range(10): - print("%5d" % (self.messages_sent_by(user_profile, week)), end=' ') + print("%5d" % (self.messages_sent_by(user_profile, week),), end=' ') print("") diff --git a/analytics/views.py b/analytics/views.py index 0d666a5d4f..b4c4c9fc5e 100644 --- a/analytics/views.py +++ b/analytics/views.py @@ -122,7 +122,7 @@ def stats_for_installation(request: HttpRequest) -> HttpResponse: def stats_for_remote_installation(request: HttpRequest, remote_server_id: str) -> HttpResponse: server = RemoteZulipServer.objects.get(id=remote_server_id) return render_stats(request, '/remote/%s/installation' % (server.id,), - 'remote Installation %s' % (server.hostname), True, True) + 'remote Installation %s' % (server.hostname,), True, True) @require_server_admin_api @has_request_variables diff --git a/puppet/zulip/files/nagios_plugins/zulip_app_frontend/check_rabbitmq_consumers b/puppet/zulip/files/nagios_plugins/zulip_app_frontend/check_rabbitmq_consumers index f899aaa7a3..332e3cef17 100755 --- a/puppet/zulip/files/nagios_plugins/zulip_app_frontend/check_rabbitmq_consumers +++ b/puppet/zulip/files/nagios_plugins/zulip_app_frontend/check_rabbitmq_consumers @@ -17,7 +17,7 @@ if len(sys.argv) < 2: print("Please pass the name of the consumer file to check") exit(1) -RESULTS_FILE = "/var/lib/nagios_state/check-rabbitmq-consumers-%s" % (sys.argv[1]) +RESULTS_FILE = "/var/lib/nagios_state/check-rabbitmq-consumers-%s" % (sys.argv[1],) ret, result = nagios_from_file(RESULTS_FILE) diff --git a/puppet/zulip/files/nagios_plugins/zulip_app_frontend/check_send_receive_time b/puppet/zulip/files/nagios_plugins/zulip_app_frontend/check_send_receive_time index ec35d1ff6c..23222821f6 100755 --- a/puppet/zulip/files/nagios_plugins/zulip_app_frontend/check_send_receive_time +++ b/puppet/zulip/files/nagios_plugins/zulip_app_frontend/check_send_receive_time @@ -114,7 +114,7 @@ def get_zulips(): global queue_id, last_event_id res = zulip_recipient.get_events(queue_id=queue_id, last_event_id=last_event_id) if 'error' in res.get('result', {}): - report("CRITICAL", msg="Error receiving Zulips, error was: %s" % (res["msg"])) + report("CRITICAL", msg="Error receiving Zulips, error was: %s" % (res["msg"],)) for event in res['events']: last_event_id = max(last_event_id, int(event['id'])) # If we get a heartbeat event, that means we've been hanging for @@ -154,10 +154,10 @@ zulip_recipient = zulip.Client( try: res = zulip_recipient.register(event_types=["message"]) if 'error' in res.get('result', {}): - report("CRITICAL", msg="Error subscribing to Zulips: %s" % (res['msg'])) + report("CRITICAL", msg="Error subscribing to Zulips: %s" % (res['msg'],)) queue_id, last_event_id = (res['queue_id'], res['last_event_id']) except Exception: - report("CRITICAL", msg="Error subscribing to Zulips:\n%s" % (traceback.format_exc())) + report("CRITICAL", msg="Error subscribing to Zulips:\n%s" % (traceback.format_exc(),)) msg_to_send = str(random.getrandbits(64)) time_start = time.time() diff --git a/puppet/zulip/files/nagios_plugins/zulip_nagios_server/check_postgres_replication_lag b/puppet/zulip/files/nagios_plugins/zulip_nagios_server/check_postgres_replication_lag index 4556b782ca..3a053b603e 100755 --- a/puppet/zulip/files/nagios_plugins/zulip_nagios_server/check_postgres_replication_lag +++ b/puppet/zulip/files/nagios_plugins/zulip_nagios_server/check_postgres_replication_lag @@ -71,7 +71,7 @@ if recv_diff > 5 * 16 * 1024**2: report('CRITICAL', 'secondary is %d bytes behind on receiving xlog' % (recv_diff,)) if replay_diff > 5 * 16 * 1024**2: - report('CRITICAL', 'secondary is %d bytes behind on applying received xlog' % (replay_diff)) + report('CRITICAL', 'secondary is %d bytes behind on applying received xlog' % (replay_diff,)) if recv_diff < 0: report('CRITICAL', 'secondary is %d bytes ahead on receiving xlog' % (recv_diff,)) @@ -83,7 +83,7 @@ if recv_diff > 16 * 1024**2: report('WARNING', 'secondary is %d bytes behind on receiving xlog' % (recv_diff,)) if replay_diff > 16 * 1024**2: - report('WARNING', 'secondary is %d bytes behind on applying received xlog' % (replay_diff)) + report('WARNING', 'secondary is %d bytes behind on applying received xlog' % (replay_diff,)) report('OK', ('secondary is %d bytes behind on receiving and %d bytes behind on applying xlog' % (recv_diff, replay_diff))) diff --git a/puppet/zulip/files/postgresql/process_fts_updates b/puppet/zulip/files/postgresql/process_fts_updates index de0ae3f9b8..17beaea43e 100755 --- a/puppet/zulip/files/postgresql/process_fts_updates +++ b/puppet/zulip/files/postgresql/process_fts_updates @@ -89,9 +89,9 @@ if config_file.has_option('machine', 'pgroonga'): if remote_postgres_host != '': postgres_password = '' if settings.DATABASES['default']['PASSWORD'] is not None: - postgres_password = "password='%s'" % settings.DATABASES['default']['PASSWORD'] - postgres_user = "user='%s'" % settings.DATABASES['default']['USER'] - postgres_dbname = "dbname='%s'" % settings.DATABASES['default']['NAME'] + postgres_password = "password='%s'" % (settings.DATABASES['default']['PASSWORD'],) + postgres_user = "user='%s'" % (settings.DATABASES['default']['USER'],) + postgres_dbname = "dbname='%s'" % (settings.DATABASES['default']['NAME'],) if settings.REMOTE_POSTGRES_SSLMODE != '': postgres_sslmode = settings.REMOTE_POSTGRES_SSLMODE else: diff --git a/puppet/zulip_ops/files/zulip-ec2-configure-interfaces b/puppet/zulip_ops/files/zulip-ec2-configure-interfaces index 6fc45dbb95..8e2e08cd68 100755 --- a/puppet/zulip_ops/files/zulip-ec2-configure-interfaces +++ b/puppet/zulip_ops/files/zulip-ec2-configure-interfaces @@ -57,7 +57,7 @@ if False: def address_of(device_id): # type: (int) -> Optional[str] try: - return netifaces.ifaddresses("ens%i" % device_id)[netifaces.AF_INET][0]['addr'] + return netifaces.ifaddresses("ens%i" % (device_id,))[netifaces.AF_INET][0]['addr'] except KeyError: return None @@ -112,7 +112,7 @@ for device in macs.values(): if address is None: # If the device was not autoconfigured, do so now. log.info("Device ens%i not configured, starting dhcpd" % (device_number,)) - subprocess.check_call(['/sbin/dhcpcd', 'ens%i' % device_number]) + subprocess.check_call(['/sbin/dhcpcd', 'ens%i' % (device_number,)]) dev_num = str(device_number) address = address_of(device_number) @@ -126,7 +126,7 @@ for device in macs.values(): ['/sbin/ip', 'rule', 'add', 'fwmark', dev_num, 'table', dev_num]) subprocess.check_call( ['/sbin/ip', 'route', 'add', '0.0.0.0/0', 'table', dev_num, 'dev', - 'ens%i' % device_number, 'via', gateway]) + 'ens%i' % (device_number,), 'via', gateway]) subprocess.check_call( ['/sbin/iptables', '-t', 'mangle', '-A', 'OUTPUT', '-m', 'conntrack', '--ctorigdst', address, '-j', 'MARK', '--set-mark', dev_num]) diff --git a/templates/zerver/app/index.html b/templates/zerver/app/index.html index 942c7e125a..fa6bc1fbb2 100644 --- a/templates/zerver/app/index.html +++ b/templates/zerver/app/index.html @@ -12,8 +12,8 @@ {% endblock %} {% block commonjs %} -{{ render_bundle('app', attrs='nonce="%s"' % (csp_nonce)) }} -{{ render_bundle('katex', attrs='nonce="%s"' % (csp_nonce)) }} +{{ render_bundle('app', attrs='nonce="%s"' % (csp_nonce,)) }} +{{ render_bundle('katex', attrs='nonce="%s"' % (csp_nonce,)) }} {% endblock %} {% block customhead %} diff --git a/templates/zerver/archive/index.html b/templates/zerver/archive/index.html index 63841b55d8..eca2b98da3 100644 --- a/templates/zerver/archive/index.html +++ b/templates/zerver/archive/index.html @@ -11,8 +11,8 @@ } - {{ render_bundle('translations', attrs='nonce="%s"' % (csp_nonce)) }} - {{ render_bundle('katex', attrs='nonce="%s"' % (csp_nonce)) }} + {{ render_bundle('translations', attrs='nonce="%s"' % (csp_nonce,)) }} + {{ render_bundle('katex', attrs='nonce="%s"' % (csp_nonce,)) }} {{ render_bundle('portico') }} {{ render_bundle('archive') }} {{ render_bundle('archive-styles') }} diff --git a/templates/zerver/base.html b/templates/zerver/base.html index 884e363c4f..b6f8c30668 100644 --- a/templates/zerver/base.html +++ b/templates/zerver/base.html @@ -28,7 +28,7 @@ This allows pages requiring common files via webpack to override this block --> {% block commonjs %} - {{ render_bundle('common', attrs='nonce="%s"' % (csp_nonce)) }} + {{ render_bundle('common', attrs='nonce="%s"' % (csp_nonce,)) }} {% endblock %} {% block customhead %} {% endblock %} diff --git a/tools/check-issue-labels b/tools/check-issue-labels index 9c2c805f68..c40465dbf9 100755 --- a/tools/check-issue-labels +++ b/tools/check-issue-labels @@ -69,7 +69,7 @@ def check_issue_labels(): if args.force: response = requests.get(next_page_url) else: - response = requests.get(next_page_url, headers={'Authorization': 'token %s' % token}) + response = requests.get(next_page_url, headers={'Authorization': 'token %s' % (token,)}) if response.status_code == 401: sys.exit("Error. Please check the token.") if response.status_code == 403: diff --git a/tools/lib/pretty_print.py b/tools/lib/pretty_print.py index 073b0640d0..c748e474e2 100644 --- a/tools/lib/pretty_print.py +++ b/tools/lib/pretty_print.py @@ -197,7 +197,7 @@ def validate_indent_html(fn): file.close() if not html.split('\n') == phtml.split('\n'): print('Invalid Indentation detected in file: ' - '%s\nDiff for the file against expected indented file:' % (fn), flush=True) + '%s\nDiff for the file against expected indented file:' % (fn,), flush=True) with subprocess.Popen( ['diff', fn, '-'], stdin=subprocess.PIPE, diff --git a/tools/pretty-print-html b/tools/pretty-print-html index cec35a5cde..6352d35c4f 100755 --- a/tools/pretty-print-html +++ b/tools/pretty-print-html @@ -6,7 +6,7 @@ import sys def clean_html(filenames): # type: (List[str]) -> None for fn in filenames: - print('Prettifying: %s' % (fn)) + print('Prettifying: %s' % (fn,)) file = open(fn) html = file.read() phtml = pretty_print_html(html) diff --git a/tools/setup/build_pygments_data b/tools/setup/build_pygments_data index 2c1fa29cec..c0f952291a 100755 --- a/tools/setup/build_pygments_data +++ b/tools/setup/build_pygments_data @@ -28,7 +28,7 @@ return exports; }()); if (typeof module !== 'undefined') { module.exports = pygments_data; -}''' % json.dumps(langs) +}''' % (json.dumps(langs),) with open(JS_PATH, 'w') as f: f.write(template) diff --git a/tools/tests/test_html_branches.py b/tools/tests/test_html_branches.py index d253030d45..158c0097ca 100644 --- a/tools/tests/test_html_branches.py +++ b/tools/tests/test_html_branches.py @@ -109,14 +109,14 @@ class TestHtmlBranches(unittest.TestCase): self.assertEqual(set(template_id_dict.keys()), {'below_navbar', 'hello_{{ message }}', 'intro'}) self.assertEqual(template_id_dict['hello_{{ message }}'], [ - 'Line 12:%s/tools/tests/test_template_data/test_template1.html' % (ZULIP_PATH), - 'Line 12:%s/tools/tests/test_template_data/test_template2.html' % (ZULIP_PATH)]) + 'Line 12:%s/tools/tests/test_template_data/test_template1.html' % (ZULIP_PATH,), + 'Line 12:%s/tools/tests/test_template_data/test_template2.html' % (ZULIP_PATH,)]) self.assertEqual(template_id_dict['intro'], [ - 'Line 10:%s/tools/tests/test_template_data/test_template1.html' % (ZULIP_PATH), - 'Line 11:%s/tools/tests/test_template_data/test_template1.html' % (ZULIP_PATH), - 'Line 11:%s/tools/tests/test_template_data/test_template2.html' % (ZULIP_PATH)]) + 'Line 10:%s/tools/tests/test_template_data/test_template1.html' % (ZULIP_PATH,), + 'Line 11:%s/tools/tests/test_template_data/test_template1.html' % (ZULIP_PATH,), + 'Line 11:%s/tools/tests/test_template_data/test_template2.html' % (ZULIP_PATH,)]) self.assertEqual(template_id_dict['below_navbar'], [ - 'Line 10:%s/tools/tests/test_template_data/test_template2.html' % (ZULIP_PATH)]) + 'Line 10:%s/tools/tests/test_template_data/test_template2.html' % (ZULIP_PATH,)]) def test_split_for_id_and_class(self) -> None: id1 = "{{ red|blue }}" diff --git a/zerver/data_import/gitter.py b/zerver/data_import/gitter.py index c3df70d915..ae2ce39ef4 100644 --- a/zerver/data_import/gitter.py +++ b/zerver/data_import/gitter.py @@ -95,7 +95,7 @@ def build_userprofile(timestamp: Any, domain_name: str, def get_user_email(user_data: ZerverFieldsT, domain_name: str) -> str: # TODO Get user email from github - email = ("%s@users.noreply.github.com" % user_data['username']) + email = ("%s@users.noreply.github.com" % (user_data['username'],)) return email def build_stream_and_defaultstream(timestamp: Any) -> Tuple[List[ZerverFieldsT], @@ -213,10 +213,10 @@ def get_usermentions(message: Dict[str, Any], user_map: Dict[str, int], if 'mentions' in message: for mention in message['mentions']: if mention.get('userId') in user_map: - gitter_mention = '@%s' % (mention['screenName']) + gitter_mention = '@%s' % (mention['screenName'],) if mention['screenName'] not in user_short_name_to_full_name: logging.info("Mentioned user %s never sent any messages, so has no full name data" % - mention['screenName']) + (mention['screenName'],)) full_name = mention['screenName'] else: full_name = user_short_name_to_full_name[mention['screenName']] @@ -277,7 +277,7 @@ def do_convert_data(gitter_data_file: str, output_dir: str, threads: int=6) -> N subprocess.check_call(["tar", "-czf", output_dir + '.tar.gz', output_dir, '-P']) logging.info('######### DATA CONVERSION FINISHED #########\n') - logging.info("Zulip data dump created at %s" % (output_dir)) + logging.info("Zulip data dump created at %s" % (output_dir,)) def write_data_to_file(output_file: str, data: Any) -> None: with open(output_file, "w") as f: diff --git a/zerver/data_import/import_util.py b/zerver/data_import/import_util.py index d751b30454..c295449637 100644 --- a/zerver/data_import/import_util.py +++ b/zerver/data_import/import_util.py @@ -37,7 +37,7 @@ def build_zerver_realm(realm_id: int, realm_subdomain: str, time: float, other_product: str) -> List[ZerverFieldsT]: realm = Realm(id=realm_id, date_created=time, name=realm_subdomain, string_id=realm_subdomain, - description=("Organization imported from %s!" % (other_product))) + description="Organization imported from %s!" % (other_product,)) auth_methods = [[flag[0], flag[1]] for flag in realm.authentication_methods] realm_dict = model_to_dict(realm, exclude='authentication_methods') realm_dict['authentication_methods'] = auth_methods @@ -461,8 +461,8 @@ def process_avatars(avatar_list: List[ZerverFieldsT], avatar_dir: str, realm_id: avatar_url = avatar['path'] avatar_original = dict(avatar) - image_path = ('%s.png' % (avatar_hash)) - original_image_path = ('%s.original' % (avatar_hash)) + image_path = '%s.png' % (avatar_hash,) + original_image_path = '%s.original' % (avatar_hash,) avatar_upload_list.append([avatar_url, image_path, original_image_path]) # We don't add the size field here in avatar's records.json, diff --git a/zerver/data_import/slack.py b/zerver/data_import/slack.py index 7592a7fab0..42861b6696 100755 --- a/zerver/data_import/slack.py +++ b/zerver/data_import/slack.py @@ -226,7 +226,7 @@ def build_customprofile_field(customprofile_field: List[ZerverFieldsT], fields: if field in slack_custom_fields: field_name = field else: - field_name = ("slack custom field %s" % str(customprofilefield_id + 1)) + field_name = "slack custom field %s" % (str(customprofilefield_id + 1),) customprofilefield = CustomProfileField( id=customprofilefield_id, name=field_name, @@ -539,7 +539,7 @@ def convert_slack_workspace_messages(slack_data_dir: str, users: List[ZerverFiel zerver_usermessage=zerver_usermessage) message_file = "/messages-%06d.json" % (dump_file_id,) - logging.info("Writing Messages to %s\n" % (output_dir + message_file)) + logging.info("Writing Messages to %s\n" % (output_dir + message_file,)) create_converted_data_files(message_json, output_dir, message_file) total_reactions += reactions @@ -658,7 +658,7 @@ def channel_message_to_zerver_message(realm_id: int, # For example "sh_room_created" has the message 'started a call' # which should be displayed as '/me started a call' if subtype in ["bot_add", "sh_room_created", "me_message"]: - content = ('/me %s' % (content)) + content = '/me %s' % (content,) if subtype == 'file_comment': # The file_comment message type only indicates the # responsible user in a subfield. @@ -789,7 +789,7 @@ def get_attachment_path_and_content(fileinfo: ZerverFieldsT, realm_id: int) -> T random_name(18), sanitize_name(fileinfo['name']) ]) - attachment_path = ('/user_uploads/%s' % (s3_path)) + attachment_path = '/user_uploads/%s' % (s3_path,) content = '[%s](%s)' % (fileinfo['title'], attachment_path) return s3_path, content @@ -919,7 +919,7 @@ def do_convert_data(slack_zip_file: str, output_dir: str, token: str, threads: i subprocess.check_call(["tar", "-czf", output_dir + '.tar.gz', output_dir, '-P']) logging.info('######### DATA CONVERSION FINISHED #########\n') - logging.info("Zulip data dump created at %s" % (output_dir)) + logging.info("Zulip data dump created at %s" % (output_dir,)) def get_data_file(path: str) -> Any: with open(path, "r") as fp: diff --git a/zerver/decorator.py b/zerver/decorator.py index 26f2462ad6..d23b62d730 100644 --- a/zerver/decorator.py +++ b/zerver/decorator.py @@ -831,7 +831,7 @@ def rate_limit(domain: str='all') -> Callable[[ViewFuncT], ViewFuncT]: if not user: # nocoverage # See comments below logging.error("Requested rate-limiting on %s but user is not authenticated!" % - func.__name__) + (func.__name__,)) return func(request, *args, **kwargs) if isinstance(user, AnonymousUser): # nocoverage diff --git a/zerver/forms.py b/zerver/forms.py index 1b2946ee3e..ae9348ddfe 100644 --- a/zerver/forms.py +++ b/zerver/forms.py @@ -52,7 +52,7 @@ def email_is_not_mit_mailing_list(email: str) -> None: username = email.rsplit("@", 1)[0] # Check whether the user exists and can get mail. try: - DNS.dnslookup("%s.pobox.ns.athena.mit.edu" % username, DNS.Type.TXT) + DNS.dnslookup("%s.pobox.ns.athena.mit.edu" % (username,), DNS.Type.TXT) except DNS.Base.ServerError as e: if e.rcode == DNS.Status.NXDOMAIN: raise ValidationError(mark_safe(MIT_VALIDATION_ERROR)) diff --git a/zerver/lib/actions.py b/zerver/lib/actions.py index b9ad880caf..87bf809c52 100644 --- a/zerver/lib/actions.py +++ b/zerver/lib/actions.py @@ -290,7 +290,7 @@ def notify_invites_changed(user_profile: UserProfile) -> None: def notify_new_user(user_profile: UserProfile, internal: bool=False) -> None: if settings.NOTIFICATION_BOT is not None: send_signup_message(settings.NOTIFICATION_BOT, "signups", user_profile, internal) - statsd.gauge("users.signups.%s" % (user_profile.realm.string_id), 1, delta=True) + statsd.gauge("users.signups.%s" % (user_profile.realm.string_id,), 1, delta=True) # We also clear any scheduled invitation emails to prevent them # from being sent after the user is created. @@ -2050,23 +2050,23 @@ def check_schedule_message(sender: UserProfile, client: Client, def check_stream_name(stream_name: str) -> None: if stream_name.strip() == "": - raise JsonableError(_("Invalid stream name '%s'" % (stream_name))) + raise JsonableError(_("Invalid stream name '%s'" % (stream_name,))) if len(stream_name) > Stream.MAX_NAME_LENGTH: - raise JsonableError(_("Stream name too long (limit: %s characters)." % (Stream.MAX_NAME_LENGTH))) + raise JsonableError(_("Stream name too long (limit: %s characters)." % (Stream.MAX_NAME_LENGTH,))) for i in stream_name: if ord(i) == 0: - raise JsonableError(_("Stream name '%s' contains NULL (0x00) characters." % (stream_name))) + raise JsonableError(_("Stream name '%s' contains NULL (0x00) characters." % (stream_name,))) def check_default_stream_group_name(group_name: str) -> None: if group_name.strip() == "": - raise JsonableError(_("Invalid default stream group name '%s'" % (group_name))) + raise JsonableError(_("Invalid default stream group name '%s'" % (group_name,))) if len(group_name) > DefaultStreamGroup.MAX_NAME_LENGTH: raise JsonableError(_("Default stream group name too long (limit: %s characters)" - % (DefaultStreamGroup.MAX_NAME_LENGTH))) + % (DefaultStreamGroup.MAX_NAME_LENGTH,))) for i in group_name: if ord(i) == 0: raise JsonableError(_("Default stream group name '%s' contains NULL (0x00) characters." - % (group_name))) + % (group_name,))) def send_rate_limited_pm_notification_to_bot_owner(sender: UserProfile, realm: Realm, diff --git a/zerver/lib/bugdown/__init__.py b/zerver/lib/bugdown/__init__.py index dee06f3e5f..ecdb0c2803 100644 --- a/zerver/lib/bugdown/__init__.py +++ b/zerver/lib/bugdown/__init__.py @@ -92,13 +92,13 @@ EMOJI_REGEX = r'(?P:[\w\-\+]+:)' def verbose_compile(pattern: str) -> Any: return re.compile( - "^(.*?)%s(.*?)$" % pattern, + "^(.*?)%s(.*?)$" % (pattern,), re.DOTALL | re.UNICODE | re.VERBOSE ) def normal_compile(pattern: str) -> Any: return re.compile( - r"^(.*?)%s(.*)$" % pattern, + r"^(.*?)%s(.*)$" % (pattern,), re.DOTALL | re.UNICODE ) @@ -1869,7 +1869,7 @@ class Bugdown(markdown.Markdown): def register_realm_filters(self, inlinePatterns: markdown.util.Registry) -> markdown.util.Registry: for (pattern, format_string, id) in self.getConfig("realm_filters"): inlinePatterns.register(RealmFilterPattern(pattern, format_string, self), - 'realm_filters/%s' % (pattern), 45) + 'realm_filters/%s' % (pattern,), 45) return inlinePatterns def build_treeprocessors(self) -> markdown.util.Registry: diff --git a/zerver/lib/cache.py b/zerver/lib/cache.py index 9cc6b9a163..4b29d0da46 100644 --- a/zerver/lib/cache.py +++ b/zerver/lib/cache.py @@ -295,7 +295,7 @@ def cache(func: Callable[..., ReturnT]) -> Callable[..., ReturnT]: return cache_with_key(keyfunc)(func) def preview_url_cache_key(url: str) -> str: - return "preview_url:%s" % (make_safe_digest(url)) + return "preview_url:%s" % (make_safe_digest(url),) def display_recipient_cache_key(recipient_id: int) -> str: return "display_recipient_dict:%d" % (recipient_id,) @@ -313,7 +313,7 @@ def user_profile_cache_key(email: str, realm: 'Realm') -> str: return user_profile_cache_key_id(email, realm.id) def bot_profile_cache_key(email: str) -> str: - return "bot_profile:%s" % (make_safe_digest(email.strip())) + return "bot_profile:%s" % (make_safe_digest(email.strip()),) def user_profile_by_id_cache_key(user_profile_id: int) -> str: return "user_profile_by_id:%s" % (user_profile_id,) @@ -474,7 +474,7 @@ def to_dict_cache_key(message: 'Message') -> str: return to_dict_cache_key_id(message.id) def open_graph_description_cache_key(content: Any, request: HttpRequest) -> str: - return 'open_graph_description_path:%s' % (make_safe_digest(request.META['PATH_INFO'])) + return 'open_graph_description_path:%s' % (make_safe_digest(request.META['PATH_INFO']),) def flush_message(sender: Any, **kwargs: Any) -> None: message = kwargs['instance'] diff --git a/zerver/lib/db.py b/zerver/lib/db.py index fa52aabfa1..c74a1ea648 100644 --- a/zerver/lib/db.py +++ b/zerver/lib/db.py @@ -21,7 +21,7 @@ def wrapper_execute(self: CursorObj, stop = time.time() duration = stop - start self.connection.queries.append({ - 'time': "%.3f" % duration, + 'time': "%.3f" % (duration,), }) class TimeTrackingCursor(cursor): diff --git a/zerver/lib/email_mirror.py b/zerver/lib/email_mirror.py index 0f449db92b..381a462a40 100644 --- a/zerver/lib/email_mirror.py +++ b/zerver/lib/email_mirror.py @@ -248,7 +248,7 @@ def extract_body(message: message.Message, remove_quotations: bool=True) -> str: if plaintext_content is not None or html_content is not None: raise ZulipEmailForwardUserError("Email has no nonempty body sections; ignoring.") - logging.warning("Content types: %s" % ([part.get_content_type() for part in message.walk()])) + logging.warning("Content types: %s" % ([part.get_content_type() for part in message.walk()],)) raise ZulipEmailForwardUserError("Unable to find plaintext or HTML message body") def filter_footer(text: str) -> str: diff --git a/zerver/lib/email_notifications.py b/zerver/lib/email_notifications.py index 14638c1a70..479905aff9 100644 --- a/zerver/lib/email_notifications.py +++ b/zerver/lib/email_notifications.py @@ -274,7 +274,7 @@ def do_send_missedmessage_events_reply_in_zulip(user_profile: UserProfile, if len(recipients) != 1: raise ValueError( 'All missed_messages must have the same recipient and topic %r' % - recipients + (recipients,) ) unsubscribe_link = one_click_unsubscribe_link(user_profile, "missed_messages") @@ -324,7 +324,7 @@ def do_send_missedmessage_events_reply_in_zulip(user_profile: UserProfile, if r['id'] != user_profile.id] context.update({'group_pm': True}) if len(other_recipients) == 2: - huddle_display_name = "%s" % (" and ".join(other_recipients)) + huddle_display_name = " and ".join(other_recipients) context.update({'huddle_display_name': huddle_display_name}) elif len(other_recipients) == 3: huddle_display_name = "%s, %s, and %s" % ( diff --git a/zerver/lib/error_notify.py b/zerver/lib/error_notify.py index 5363ba6e6c..88774d7bae 100644 --- a/zerver/lib/error_notify.py +++ b/zerver/lib/error_notify.py @@ -20,11 +20,11 @@ def format_email_subject(email_subject: str) -> str: def logger_repr(report: Dict[str, Any]) -> str: return ("Logger %(logger_name)s, from module %(log_module)s line %(log_lineno)d:" - % report) + % dict(report)) def user_info_str(report: Dict[str, Any]) -> str: if report['user_full_name'] and report['user_email']: - user_info = "%(user_full_name)s (%(user_email)s)" % (report) + user_info = "%(user_full_name)s (%(user_email)s)" % dict(report) else: user_info = "Anonymous user (not logged in)" @@ -48,7 +48,7 @@ def notify_browser_error(report: Dict[str, Any]) -> None: email_browser_error(report) def email_browser_error(report: Dict[str, Any]) -> None: - email_subject = "Browser error for %s" % (user_info_str(report)) + email_subject = "Browser error for %s" % (user_info_str(report),) body = ("User: %(user_full_name)s <%(user_email)s> on %(deployment)s\n\n" "Message:\n%(message)s\n\nStacktrace:\n%(stacktrace)s\n\n" @@ -57,7 +57,7 @@ def email_browser_error(report: Dict[str, Any]) -> None: "href: %(href)s\n" "Server path: %(server_path)s\n" "Deployed version: %(version)s\n" - % (report)) + % dict(report)) more_info = report['more_info'] if more_info is not None: @@ -76,7 +76,7 @@ def zulip_browser_error(report: Dict[str, Any]) -> None: body = "User: %s\n" % (user_info,) body += ("Message: %(message)s\n" - % (report)) + % dict(report)) realm = get_system_bot(settings.ERROR_BOT).realm internal_send_message(realm, settings.ERROR_BOT, @@ -89,7 +89,7 @@ def notify_server_error(report: Dict[str, Any], skip_error_zulip: Optional[bool] zulip_server_error(report) def zulip_server_error(report: Dict[str, Any]) -> None: - email_subject = '%(node)s: %(message)s' % (report) + email_subject = '%(node)s: %(message)s' % dict(report) logger_str = logger_repr(report) user_info = user_info_str(report) @@ -99,7 +99,7 @@ def zulip_server_error(report: Dict[str, Any]) -> None: request_repr = ( "Request info:\n~~~~\n" "- path: %(path)s\n" - "- %(method)s: %(data)s\n") % (report) + "- %(method)s: %(data)s\n") % dict(report) for field in ["REMOTE_ADDR", "QUERY_STRING", "SERVER_NAME"]: val = report.get(field.lower()) if field == "QUERY_STRING": @@ -117,7 +117,7 @@ def zulip_server_error(report: Dict[str, Any]) -> None: format_email_subject(email_subject), message) def email_server_error(report: Dict[str, Any]) -> None: - email_subject = '%(node)s: %(message)s' % (report) + email_subject = '%(node)s: %(message)s' % dict(report) logger_str = logger_repr(report) user_info = user_info_str(report) @@ -127,7 +127,7 @@ def email_server_error(report: Dict[str, Any]) -> None: request_repr = ( "Request info:\n" "- path: %(path)s\n" - "- %(method)s: %(data)s\n") % (report) + "- %(method)s: %(data)s\n") % dict(report) for field in ["REMOTE_ADDR", "QUERY_STRING", "SERVER_NAME"]: val = report.get(field.lower()) if field == "QUERY_STRING": diff --git a/zerver/lib/export.py b/zerver/lib/export.py index 7f8357acd2..7fa48feeee 100644 --- a/zerver/lib/export.py +++ b/zerver/lib/export.py @@ -1165,7 +1165,7 @@ def _save_s3_object_to_file( else: fields = key.name.split('/') if len(fields) != 3: - raise AssertionError("Suspicious key with invalid format %s" % (key.name)) + raise AssertionError("Suspicious key with invalid format %s" % (key.name,)) filename = os.path.join(output_dir, key.name) dirname = os.path.dirname(filename) @@ -1180,7 +1180,7 @@ def export_files_from_s3(realm: Realm, bucket_name: str, output_dir: Path, bucket = conn.get_bucket(bucket_name, validate=True) records = [] - logging.info("Downloading uploaded files from %s" % (bucket_name)) + logging.info("Downloading uploaded files from %s" % (bucket_name,)) avatar_hash_values = set() user_ids = set() @@ -1352,7 +1352,7 @@ def do_write_stats_file_for_realm_export(output_dir: Path) -> None: f.write(fn+'\n') payload = open(fn).read() data = ujson.loads(payload) - f.write('%5d records\n' % len(data)) + f.write('%5d records\n' % (len(data),)) f.write('\n') def do_export_realm(realm: Realm, output_dir: Path, threads: int, @@ -1392,7 +1392,7 @@ def do_export_realm(realm: Realm, output_dir: Path, threads: int, logging.info("Exporting .partial files messages") message_ids = export_partial_message_files(realm, response, output_dir=output_dir, public_only=public_only) - logging.info('%d messages were exported' % (len(message_ids))) + logging.info('%d messages were exported' % (len(message_ids),)) # zerver_reaction zerver_reaction = {} # type: TableData @@ -1413,7 +1413,7 @@ def do_export_realm(realm: Realm, output_dir: Path, threads: int, # Start parallel jobs to export the UserMessage objects. launch_user_message_subprocesses(threads=threads, output_dir=output_dir) - logging.info("Finished exporting %s" % (realm.string_id)) + logging.info("Finished exporting %s" % (realm.string_id,)) create_soft_link(source=output_dir, in_progress=False) def export_attachment_table(realm: Realm, output_dir: Path, message_ids: Set[int]) -> None: diff --git a/zerver/lib/import_realm.py b/zerver/lib/import_realm.py index 9a99031b01..06fac75c34 100644 --- a/zerver/lib/import_realm.py +++ b/zerver/lib/import_realm.py @@ -279,7 +279,7 @@ def fix_message_rendered_content(realm: Realm, # * rendering markdown failing with the exception being # caught in bugdown (which then returns None, causing the the # rendered_content assert above to fire). - logging.warning("Error in markdown rendering for message ID %s; continuing" % (message['id'])) + logging.warning("Error in markdown rendering for message ID %s; continuing" % (message['id'],)) def current_table_ids(data: TableData, table: TableName) -> List[int]: """ @@ -662,7 +662,7 @@ def import_uploads(import_dir: Path, processes: int, processing_avatars: bool=Fa upload_backend.ensure_basic_avatar_image(user_profile=user_profile) except BadImageError: logging.warning("Could not thumbnail avatar image for user %s; ignoring" % ( - user_profile.id)) + user_profile.id,)) # Delete the record of the avatar to avoid 404s. do_change_avatar_fields(user_profile, UserProfile.AVATAR_FROM_GRAVATAR) return 0 diff --git a/zerver/lib/logging_util.py b/zerver/lib/logging_util.py index 8095afd244..64f2e5e557 100644 --- a/zerver/lib/logging_util.py +++ b/zerver/lib/logging_util.py @@ -23,7 +23,7 @@ class _RateLimitFilter: # Track duplicate errors duplicate = False - rate = getattr(settings, '%s_LIMIT' % self.__class__.__name__.upper(), + rate = getattr(settings, '%s_LIMIT' % (self.__class__.__name__.upper(),), 600) # seconds if rate > 0: # Test if the cache works diff --git a/zerver/lib/mobile_auth_otp.py b/zerver/lib/mobile_auth_otp.py index 61ad0d070a..f04a54ad57 100644 --- a/zerver/lib/mobile_auth_otp.py +++ b/zerver/lib/mobile_auth_otp.py @@ -15,7 +15,7 @@ def xor_hex_strings(bytes_a: str, bytes_b: str) -> str: """Given two hex strings of equal length, return a hex string with the bitwise xor of the two hex strings.""" assert len(bytes_a) == len(bytes_b) - return ''.join(["%x" % (int(x, 16) ^ int(y, 16)) + return ''.join(["%x" % (int(x, 16) ^ int(y, 16),) for x, y in zip(bytes_a, bytes_b)]) def ascii_to_hex(input_string: str) -> str: diff --git a/zerver/lib/outgoing_webhook.py b/zerver/lib/outgoing_webhook.py index f7bb82fe29..2871a4af54 100644 --- a/zerver/lib/outgoing_webhook.py +++ b/zerver/lib/outgoing_webhook.py @@ -277,7 +277,7 @@ def do_rest_call(base_url: str, % {'message_url': get_message_url(event), 'status_code': response.status_code, 'response': response.content}) - failure_message = "Third party responded with %d" % (response.status_code) + failure_message = "Third party responded with %d" % (response.status_code,) fail_with_message(event, failure_message) notify_bot_owner(event, request_data, response.status_code, response.content) diff --git a/zerver/lib/push_notifications.py b/zerver/lib/push_notifications.py index 3c2c4e8476..5dbc49f36c 100644 --- a/zerver/lib/push_notifications.py +++ b/zerver/lib/push_notifications.py @@ -643,7 +643,7 @@ def handle_remove_push_notification(user_profile_id: int, message_ids: List[int] def failure_processor(event: Dict[str, Any]) -> None: logger.warning( "Maximum retries exceeded for trigger:%s event:push_notification" % ( - event['user_profile_id'])) + event['user_profile_id'],)) else: android_devices = list(PushDeviceToken.objects.filter( user=user_profile, kind=PushDeviceToken.GCM)) @@ -721,7 +721,7 @@ def handle_push_notification(user_profile_id: int, missed_message: Dict[str, Any def failure_processor(event: Dict[str, Any]) -> None: logger.warning( "Maximum retries exceeded for trigger:%s event:push_notification" % ( - event['user_profile_id'])) + event['user_profile_id'],)) retry_event('missedmessage_mobile_notifications', missed_message, failure_processor) return diff --git a/zerver/lib/soft_deactivation.py b/zerver/lib/soft_deactivation.py index 7e0b0e37e0..2fe140f32e 100644 --- a/zerver/lib/soft_deactivation.py +++ b/zerver/lib/soft_deactivation.py @@ -51,7 +51,7 @@ def filter_by_subscription_history(user_profile: UserProfile, if stream_messages[-1]['id'] <= log_entry.event_last_message_id: stream_messages = [] else: - raise AssertionError('%s is not a Subscription Event.' % (log_entry.event_type)) + raise AssertionError('%s is not a Subscription Event.' % (log_entry.event_type,)) if len(stream_messages) > 0: # We do this check for last event since if the last subscription diff --git a/zerver/lib/test_fixtures.py b/zerver/lib/test_fixtures.py index 3a1627305f..5e20c168a0 100644 --- a/zerver/lib/test_fixtures.py +++ b/zerver/lib/test_fixtures.py @@ -38,11 +38,11 @@ def run_db_migrations(platform: str) -> None: # what the database is as runtime. # Also we export DB_NAME which is ignored by dev platform but # recognised by test platform and used to migrate correct db. - run(['env', ('DJANGO_SETTINGS_MODULE=%s' % settings), db_name, + run(['env', ('DJANGO_SETTINGS_MODULE=%s' % (settings,)), db_name, './manage.py', 'migrate', '--no-input']) - run(['env', ('DJANGO_SETTINGS_MODULE=%s' % settings), db_name, + run(['env', ('DJANGO_SETTINGS_MODULE=%s' % (settings,)), db_name, './manage.py', 'get_migration_status', - '--output=%s' % (migration_status_file)]) + '--output=%s' % (migration_status_file,)]) def run_generate_fixtures_if_required(use_force: bool=False) -> None: generate_fixtures_command = ['tools/setup/generate-fixtures'] diff --git a/zerver/lib/test_helpers.py b/zerver/lib/test_helpers.py index 2cb18a5eeb..50f715e4fc 100644 --- a/zerver/lib/test_helpers.py +++ b/zerver/lib/test_helpers.py @@ -162,7 +162,7 @@ def queries_captured(include_savepoints: Optional[bool]=False) -> Generator[ if include_savepoints or ('SAVEPOINT' not in sql): queries.append({ 'sql': self.mogrify(sql, params).decode('utf-8'), - 'time': "%.3f" % duration, + 'time': "%.3f" % (duration,), }) old_execute = TimeTrackingCursor.execute diff --git a/zerver/lib/test_runner.py b/zerver/lib/test_runner.py index 5edb016dd4..3d8df61e82 100644 --- a/zerver/lib/test_runner.py +++ b/zerver/lib/test_runner.py @@ -215,7 +215,7 @@ def _replacement_destroy_test_db(self: DatabaseCreation, unnecessary sleep(1).""" with self.connection._nodb_connection.cursor() as cursor: cursor.execute("DROP DATABASE %s" - % self.connection.ops.quote_name(test_database_name)) + % (self.connection.ops.quote_name(test_database_name),)) DatabaseCreation._destroy_test_db = _replacement_destroy_test_db def destroy_test_databases(database_id: Optional[int]=None) -> None: diff --git a/zerver/lib/users.py b/zerver/lib/users.py index d74cbcabc9..9e2dfcd143 100644 --- a/zerver/lib/users.py +++ b/zerver/lib/users.py @@ -148,7 +148,7 @@ def user_ids_to_users(user_ids: List[int], realm: Realm) -> List[UserProfile]: found_user_ids = user_profiles_by_id.keys() missed_user_ids = [user_id for user_id in user_ids if user_id not in found_user_ids] if missed_user_ids: - raise JsonableError(_("Invalid user ID: %s" % (missed_user_ids[0]))) + raise JsonableError(_("Invalid user ID: %s" % (missed_user_ids[0],))) user_profiles = list(user_profiles_by_id.values()) for user_profile in user_profiles: diff --git a/zerver/lib/validator.py b/zerver/lib/validator.py index 4d113b466f..6353d80131 100644 --- a/zerver/lib/validator.py +++ b/zerver/lib/validator.py @@ -174,7 +174,7 @@ def check_dict(required_keys: Iterable[Tuple[str, Validator]]=[], optional_keys_set = set(x[0] for x in optional_keys) delta_keys = set(val.keys()) - required_keys_set - optional_keys_set if len(delta_keys) != 0: - return _("Unexpected arguments: %s" % (", ".join(list(delta_keys)))) + return _("Unexpected arguments: %s" % (", ".join(list(delta_keys)),)) return None diff --git a/zerver/management/commands/makemessages.py b/zerver/management/commands/makemessages.py index c5ea840d79..7fc9fd068a 100644 --- a/zerver/management/commands/makemessages.py +++ b/zerver/management/commands/makemessages.py @@ -191,7 +191,7 @@ class Command(makemessages.Command): exclude = self.frontend_exclude process_all = self.frontend_all - paths = glob.glob('%s/*' % self.default_locale_path,) + paths = glob.glob('%s/*' % (self.default_locale_path,),) all_locales = [os.path.basename(path) for path in paths if os.path.isdir(path)] # Account for excluded locales diff --git a/zerver/management/commands/runtornado.py b/zerver/management/commands/runtornado.py index 5b312f6ade..0c97d3ba7f 100644 --- a/zerver/management/commands/runtornado.py +++ b/zerver/management/commands/runtornado.py @@ -84,7 +84,7 @@ class Command(BaseCommand): print("Validating Django models.py...") self.check(display_num_errors=True) - print("\nDjango version %s" % (django.get_version())) + print("\nDjango version %s" % (django.get_version(),)) print("Tornado server is running at http://%s:%s/" % (addr, port)) print("Quit the server with %s." % (quit_command,)) diff --git a/zerver/management/commands/send_test_email.py b/zerver/management/commands/send_test_email.py index 3e772f179c..ee6ce25268 100644 --- a/zerver/management/commands/send_test_email.py +++ b/zerver/management/commands/send_test_email.py @@ -38,7 +38,7 @@ class Command(sendtestemail.Command): print(" * %s" % (noreply_sender,)) send_mail("Zulip noreply email test", message, noreply_sender, kwargs['email']) print() - print("Successfully sent 2 emails to %s!" % (", ".join(kwargs['email']))) + print("Successfully sent 2 emails to %s!" % (", ".join(kwargs['email']),)) if kwargs['managers']: mail_managers("Zulip manager email test", "This email was sent to the site managers.") diff --git a/zerver/management/commands/send_webhook_fixture_message.py b/zerver/management/commands/send_webhook_fixture_message.py index 8ebb5b4d69..e06d25327f 100644 --- a/zerver/management/commands/send_webhook_fixture_message.py +++ b/zerver/management/commands/send_webhook_fixture_message.py @@ -57,11 +57,11 @@ approach shown above. custom_headers_dict = ujson.loads(custom_headers) for header in custom_headers_dict: if len(header.split(" ")) > 1: - raise ValueError("custom header '%s' contains a space." % (header)) + raise ValueError("custom header '%s' contains a space." % (header,)) headers["HTTP_" + header.upper().replace("-", "_")] = str(custom_headers_dict[header]) return headers except ValueError as ve: - print('Encountered an error while attempting to parse custom headers: %s' % (ve)) + print('Encountered an error while attempting to parse custom headers: %s' % (ve,)) print('Note: all strings must be enclosed within "" instead of \'\'') exit(1) diff --git a/zerver/management/commands/soft_deactivate_users.py b/zerver/management/commands/soft_deactivate_users.py index fa351576c2..e4cce1fa5e 100644 --- a/zerver/management/commands/soft_deactivate_users.py +++ b/zerver/management/commands/soft_deactivate_users.py @@ -20,7 +20,7 @@ def get_users_from_emails(emails: Any, user_emails_found = {user.email for user in users} user_emails_not_found = '\n'.join(set(emails) - user_emails_found) raise CommandError('Users with the following emails were not found:\n\n%s\n\n' - 'Check if they are correct.' % (user_emails_not_found)) + 'Check if they are correct.' % (user_emails_not_found,)) return users class Command(ZulipBaseCommand): @@ -67,7 +67,7 @@ class Command(ZulipBaseCommand): users_to_activate = get_users_from_emails(user_emails, filter_kwargs) users_activated = do_soft_activate_users(users_to_activate) - logger.info('Soft Reactivated %d user(s)' % (len(users_activated))) + logger.info('Soft Reactivated %d user(s)' % (len(users_activated),)) elif deactivate: if user_emails: @@ -77,7 +77,7 @@ class Command(ZulipBaseCommand): else: users_deactivated = do_auto_soft_deactivate_users(int(options['inactive_for']), realm) - logger.info('Soft Deactivated %d user(s)' % (len(users_deactivated))) + logger.info('Soft Deactivated %d user(s)' % (len(users_deactivated),)) else: self.print_help("./manage.py", "soft_deactivate_users") diff --git a/zerver/middleware.py b/zerver/middleware.py index 2e25466574..5e1674b298 100644 --- a/zerver/middleware.py +++ b/zerver/middleware.py @@ -80,7 +80,7 @@ def timedelta_ms(timedelta: float) -> float: def format_timedelta(timedelta: float) -> str: if (timedelta >= 1): - return "%.1fs" % (timedelta) + return "%.1fs" % (timedelta,) return "%.0fms" % (timedelta_ms(timedelta),) def is_slow_query(time_delta: float, path: str) -> bool: @@ -160,7 +160,7 @@ def write_log_line(log_data: MutableMapping[str, Any], path: str, method: str, r startup_output = "" if 'startup_time_delta' in log_data and log_data["startup_time_delta"] > 0.005: - startup_output = " (+start: %s)" % (format_timedelta(log_data["startup_time_delta"])) + startup_output = " (+start: %s)" % (format_timedelta(log_data["startup_time_delta"]),) bugdown_output = "" if 'bugdown_time_start' in log_data: diff --git a/zerver/tests/test_auth_backends.py b/zerver/tests/test_auth_backends.py index a7c3072d0e..b99f08a1d0 100644 --- a/zerver/tests/test_auth_backends.py +++ b/zerver/tests/test_auth_backends.py @@ -484,7 +484,7 @@ class SocialAuthBase(ZulipTestCase): params['next'] = next params['multiuse_object_key'] = multiuse_object_key if len(params) > 0: - url += "?%s" % (urllib.parse.urlencode(params)) + url += "?%s" % (urllib.parse.urlencode(params),) result = self.client_get(url, **headers) @@ -983,7 +983,7 @@ class GoogleOAuthTest(ZulipTestCase): params['next'] = next params['multiuse_object_key'] = multiuse_object_key if len(params) > 0: - url += "?%s" % (urllib.parse.urlencode(params)) + url += "?%s" % (urllib.parse.urlencode(params),) result = self.client_get(url, **headers) if result.status_code != 302 or '/accounts/login/google/send/' not in result.url: diff --git a/zerver/tests/test_bugdown.py b/zerver/tests/test_bugdown.py index e275eb9f62..8228d05ed4 100644 --- a/zerver/tests/test_bugdown.py +++ b/zerver/tests/test_bugdown.py @@ -618,25 +618,25 @@ class BugdownTest(ZulipTestCase): msg = 'http://www.twitter.com' converted = bugdown_convert(msg) - self.assertEqual(converted, '

%s

' % make_link('http://www.twitter.com')) + self.assertEqual(converted, '

%s

' % (make_link('http://www.twitter.com'),)) msg = 'http://www.twitter.com/wdaher/' converted = bugdown_convert(msg) - self.assertEqual(converted, '

%s

' % make_link('http://www.twitter.com/wdaher/')) + self.assertEqual(converted, '

%s

' % (make_link('http://www.twitter.com/wdaher/'),)) msg = 'http://www.twitter.com/wdaher/status/3' converted = bugdown_convert(msg) - self.assertEqual(converted, '

%s

' % make_link('http://www.twitter.com/wdaher/status/3')) + self.assertEqual(converted, '

%s

' % (make_link('http://www.twitter.com/wdaher/status/3'),)) # id too long msg = 'http://www.twitter.com/wdaher/status/2879779692873154569' converted = bugdown_convert(msg) - self.assertEqual(converted, '

%s

' % make_link('http://www.twitter.com/wdaher/status/2879779692873154569')) + self.assertEqual(converted, '

%s

' % (make_link('http://www.twitter.com/wdaher/status/2879779692873154569'),)) # id too large (i.e. tweet doesn't exist) msg = 'http://www.twitter.com/wdaher/status/999999999999999999' converted = bugdown_convert(msg) - self.assertEqual(converted, '

%s

' % make_link('http://www.twitter.com/wdaher/status/999999999999999999')) + self.assertEqual(converted, '

%s

' % (make_link('http://www.twitter.com/wdaher/status/999999999999999999'),)) msg = 'http://www.twitter.com/wdaher/status/287977969287315456' converted = bugdown_convert(msg) @@ -726,7 +726,7 @@ class BugdownTest(ZulipTestCase): realm_emoji = RealmEmoji.objects.filter(realm=realm, name='green_tick', deactivated=False).get() - self.assertEqual(converted, '

%s

' % (emoji_img(':green_tick:', realm_emoji.file_name, realm.id))) + self.assertEqual(converted, '

%s

' % (emoji_img(':green_tick:', realm_emoji.file_name, realm.id),)) # Deactivate realm emoji. do_remove_realm_emoji(realm, 'green_tick') @@ -1238,7 +1238,7 @@ class BugdownTest(ZulipTestCase): self.assertEqual(render_markdown(msg, content), '

' - '@King Hamlet

' % (user_id)) + '@King Hamlet

' % (user_id,)) self.assertEqual(msg.mentions_user_ids, set([user_profile.id])) def test_mention_silent(self) -> None: @@ -1251,7 +1251,7 @@ class BugdownTest(ZulipTestCase): self.assertEqual(render_markdown(msg, content), '

' - 'King Hamlet

' % (user_id)) + 'King Hamlet

' % (user_id,)) self.assertEqual(msg.mentions_user_ids, set()) def test_possible_mentions(self) -> None: @@ -1308,7 +1308,7 @@ class BugdownTest(ZulipTestCase): # Both fenced quote and > quote should be identical for both silent and regular syntax. expected = ('
\n

' 'King Hamlet' - '

\n
' % (hamlet.id)) + '

\n' % (hamlet.id,)) content = "```quote\n@**King Hamlet**\n```" self.assertEqual(render_markdown(msg, content), expected) self.assertEqual(msg.mentions_user_ids, set()) diff --git a/zerver/tests/test_custom_profile_data.py b/zerver/tests/test_custom_profile_data.py index fba7c5437b..224f5bef86 100644 --- a/zerver/tests/test_custom_profile_data.py +++ b/zerver/tests/test_custom_profile_data.py @@ -351,7 +351,7 @@ class CustomProfileFieldTest(ZulipTestCase): 'data': ujson.dumps([invalid_field_id]) }) self.assert_json_error(result, - u'Field id %d not found.' % (invalid_field_id)) + u'Field id %d not found.' % (invalid_field_id,)) field = CustomProfileField.objects.get(name="Mentor", realm=realm) data = [{'id': field.id, @@ -395,7 +395,7 @@ class CustomProfileFieldTest(ZulipTestCase): invalid_user_id = 1000 self.assert_error_update_invalid_value(field_name, [invalid_user_id], u"Invalid user ID: %d" - % (invalid_user_id)) + % (invalid_user_id,)) def test_create_field_of_type_user(self) -> None: self.login(self.example_email("iago")) diff --git a/zerver/tests/test_email_notifications.py b/zerver/tests/test_email_notifications.py index 4fa256950d..95db254e46 100644 --- a/zerver/tests/test_email_notifications.py +++ b/zerver/tests/test_email_notifications.py @@ -183,7 +183,7 @@ class TestMissedMessages(ZulipTestCase): hamlet = self.example_user('hamlet') handle_missedmessage_emails(hamlet.id, [{'message_id': msg_id, 'trigger': trigger}]) if settings.EMAIL_GATEWAY_PATTERN != "": - reply_to_addresses = [settings.EMAIL_GATEWAY_PATTERN % (u'mm' + t) for t in tokens] + reply_to_addresses = [settings.EMAIL_GATEWAY_PATTERN % (u'mm' + t,) for t in tokens] reply_to_emails = [formataddr(("Zulip", address)) for address in reply_to_addresses] else: reply_to_emails = ["noreply@testserver"] diff --git a/zerver/tests/test_events.py b/zerver/tests/test_events.py index 2c7ac2af08..1a82eea9e6 100644 --- a/zerver/tests/test_events.py +++ b/zerver/tests/test_events.py @@ -1264,7 +1264,7 @@ class EventsRegisterTest(ZulipTestCase): error = realm_user_add_checker('events[0]', events[0]) self.assert_on_error(error) new_user_profile = get_user_by_delivery_email("test1@zulip.com", self.user_profile.realm) - self.assertEqual(new_user_profile.email, "user%s@zulip.testserver" % (new_user_profile.id)) + self.assertEqual(new_user_profile.email, "user%s@zulip.testserver" % (new_user_profile.id,)) def test_alert_words_events(self) -> None: alert_words_checker = self.check_events_dict([ @@ -1602,7 +1602,7 @@ class EventsRegisterTest(ZulipTestCase): ]) if vals is None: - raise AssertionError('No test created for %s' % (name)) + raise AssertionError('No test created for %s' % (name,)) do_set_realm_property(self.user_profile.realm, name, vals[0]) for val in vals[1:]: state_change_expected = True @@ -1779,7 +1779,7 @@ class EventsRegisterTest(ZulipTestCase): else: values = [False, True, False] if values is None: - raise AssertionError('No test created for %s' % (setting_name)) + raise AssertionError('No test created for %s' % (setting_name,)) for value in values: events = self.do_test(lambda: do_set_user_display_setting( diff --git a/zerver/tests/test_import_export.py b/zerver/tests/test_import_export.py index 4a409006f0..532c8f1aa7 100644 --- a/zerver/tests/test_import_export.py +++ b/zerver/tests/test_import_export.py @@ -392,7 +392,7 @@ class ImportExportTest(ZulipTestCase): def get_set(table: str, field: str) -> Set[str]: values = set(r[field] for r in data[table]) - # print('set(%s)' % sorted(values)) + # print('set(%s)' % (sorted(values),)) return values def find_by_id(table: str, db_id: int) -> Dict[str, Any]: @@ -457,7 +457,7 @@ class ImportExportTest(ZulipTestCase): def get_set(data: List[Dict[str, Any]], field: str) -> Set[str]: values = set(r[field] for r in data) - # print('set(%s)' % sorted(values)) + # print('set(%s)' % (sorted(values),)) return values messages = read_file('messages-000001.json') diff --git a/zerver/tests/test_messages.py b/zerver/tests/test_messages.py index 10a78483b6..df4323a7b9 100644 --- a/zerver/tests/test_messages.py +++ b/zerver/tests/test_messages.py @@ -1180,7 +1180,7 @@ class MessageDictTest(ZulipTestCase): message = Message( sender=sender, recipient=recipient, - content='whatever %d' % i, + content='whatever %d' % (i,), rendered_content='DOES NOT MATTER', rendered_content_version=bugdown.version, pub_date=timezone_now(), @@ -1328,7 +1328,7 @@ class SewMessageAndReactionTest(ZulipTestCase): message = Message( sender=sender, recipient=recipient, - content='whatever %d' % i, + content='whatever %d' % (i,), pub_date=timezone_now(), sending_client=sending_client, last_edit_time=timezone_now(), diff --git a/zerver/tests/test_new_users.py b/zerver/tests/test_new_users.py index 72a78ff3e2..017b39be50 100644 --- a/zerver/tests/test_new_users.py +++ b/zerver/tests/test_new_users.py @@ -193,4 +193,4 @@ class TestNotifyNewUser(ZulipTestCase): self.assertEqual(message.recipient.type, Recipient.STREAM) actual_stream = Stream.objects.get(id=message.recipient.type_id) self.assertEqual(actual_stream.name, Realm.INITIAL_PRIVATE_STREAM_NAME) - self.assertIn('@_**Cordelia Lear|%d** just signed up for Zulip.' % (new_user.id), message.content) + self.assertIn('@_**Cordelia Lear|%d** just signed up for Zulip.' % (new_user.id,), message.content) diff --git a/zerver/tests/test_realm.py b/zerver/tests/test_realm.py index 967fd00916..8de514740d 100644 --- a/zerver/tests/test_realm.py +++ b/zerver/tests/test_realm.py @@ -561,7 +561,7 @@ class RealmAPITest(ZulipTestCase): if Realm.property_types[name] is bool: vals = bool_tests if vals is None: - raise AssertionError('No test created for %s' % (name)) + raise AssertionError('No test created for %s' % (name,)) self.set_up_db(name, vals[0]) realm = self.update_with_api(name, vals[1]) diff --git a/zerver/tests/test_settings.py b/zerver/tests/test_settings.py index d8163f1d86..a8e7f1547c 100644 --- a/zerver/tests/test_settings.py +++ b/zerver/tests/test_settings.py @@ -267,7 +267,7 @@ class ChangeSettingsTest(ZulipTestCase): test_value = test_changes.get(setting_name) # Error if a setting in UserProfile.property_types does not have test values if test_value is None: - raise AssertionError('No test created for %s' % (setting_name)) + raise AssertionError('No test created for %s' % (setting_name,)) invalid_value = 'invalid_' + setting_name data = {setting_name: ujson.dumps(test_value)} @@ -307,7 +307,7 @@ class ChangeSettingsTest(ZulipTestCase): for emojiset in banned_emojisets: result = self.do_change_emojiset(emojiset) - self.assert_json_error(result, "Invalid emojiset '%s'" % (emojiset)) + self.assert_json_error(result, "Invalid emojiset '%s'" % (emojiset,)) for emojiset in valid_emojisets: result = self.do_change_emojiset(emojiset) diff --git a/zerver/tests/test_slack_message_conversion.py b/zerver/tests/test_slack_message_conversion.py index 7be608d305..a3003b497c 100644 --- a/zerver/tests/test_slack_message_conversion.py +++ b/zerver/tests/test_slack_message_conversion.py @@ -71,7 +71,7 @@ class SlackMessageConversion(ZulipTestCase): self.assertEqual(full_name, 'John Doe') self.assertEqual(get_user_full_name(users[2]), 'Jane') - self.assertEqual(text, 'Hi @**%s**: How are you? #**general**' % (full_name)) + self.assertEqual(text, 'Hi @**%s**: How are you? #**general**' % (full_name,)) self.assertEqual(mentioned_users, [540]) # multiple mentioning diff --git a/zerver/tests/test_subs.py b/zerver/tests/test_subs.py index f9c2b80342..9692207f02 100644 --- a/zerver/tests/test_subs.py +++ b/zerver/tests/test_subs.py @@ -700,7 +700,7 @@ class StreamAdminTest(ZulipTestCase): result = self.client_patch('/json/streams/%d' % (stream_id,), {'description': ujson.dumps('a' * 1025)}) self.assert_json_error(result, "description is too long (limit: %s characters)" - % (Stream.MAX_DESCRIPTION_LENGTH)) + % (Stream.MAX_DESCRIPTION_LENGTH,)) result = self.client_patch('/json/streams/%d' % (stream_id,), {'description': ujson.dumps('a\nmulti\nline\ndescription')}) @@ -1115,7 +1115,7 @@ class DefaultStreamTest(ZulipTestCase): self.make_stream(stream_name, invite_only=True) self.subscribe(self.example_user('iago'), stream_name) result = self.client_post('/json/default_streams', dict(stream_name=stream_name)) - self.assert_json_error(result, "Invalid stream name '%s'" % (stream_name)) + self.assert_json_error(result, "Invalid stream name '%s'" % (stream_name,)) self.subscribe(user_profile, stream_name) result = self.client_post('/json/default_streams', dict(stream_name=stream_name)) @@ -1638,7 +1638,7 @@ class SubscriptionRestApiTest(ZulipTestCase): self.login(test_email) subs = gather_subscriptions(test_user)[0] - result = self.api_patch(test_email, "/api/v1/users/me/subscriptions/%d" % subs[0]["stream_id"], + result = self.api_patch(test_email, "/api/v1/users/me/subscriptions/%d" % (subs[0]["stream_id"],), {'property': 'color', 'value': '#c2c2c2'}) self.assert_json_success(result) @@ -1653,7 +1653,7 @@ class SubscriptionRestApiTest(ZulipTestCase): self.login(test_email) subs = gather_subscriptions(test_user)[0] - result = self.api_patch(test_email, "/api/v1/users/me/subscriptions/%d" % subs[0]["stream_id"], + result = self.api_patch(test_email, "/api/v1/users/me/subscriptions/%d" % (subs[0]["stream_id"],), {'property': 'invalid', 'value': 'somevalue'}) self.assert_json_error(result, "Unknown subscription property: invalid") @@ -1750,7 +1750,7 @@ class SubscriptionRestApiTest(ZulipTestCase): } result = self.api_patch(email, "/api/v1/users/me/subscriptions", request) self.assert_json_error(result, - "Stream name '%s' contains NULL (0x00) characters." % (stream_name)) + "Stream name '%s' contains NULL (0x00) characters." % (stream_name,)) def test_compose_views_rollback(self) -> None: ''' @@ -2051,7 +2051,7 @@ class SubscriptionAPITest(ZulipTestCase): stream_name = "abc\000" result = self.common_subscribe_to_streams(self.test_email, [stream_name]) self.assert_json_error(result, - "Stream name '%s' contains NULL (0x00) characters." % (stream_name)) + "Stream name '%s' contains NULL (0x00) characters." % (stream_name,)) def test_user_settings_for_adding_streams(self) -> None: with mock.patch('zerver.models.UserProfile.can_create_streams', return_value=False): @@ -2478,7 +2478,7 @@ class SubscriptionAPITest(ZulipTestCase): mit_user = self.mit_user('starnine') realm = get_realm("zephyr") - stream_names = ["stream_%s" % i for i in range(40)] + stream_names = ["stream_%s" % (i,) for i in range(40)] streams = [ self.make_stream(stream_name, realm=realm) for stream_name in stream_names] @@ -2514,7 +2514,7 @@ class SubscriptionAPITest(ZulipTestCase): def test_bulk_subscribe_many(self) -> None: # Create a whole bunch of streams - streams = ["stream_%s" % i for i in range(20)] + streams = ["stream_%s" % (i,) for i in range(20)] for stream_name in streams: self.make_stream(stream_name) @@ -3256,7 +3256,7 @@ class GetSubscribersTest(ZulipTestCase): (We also use this test to verify subscription notifications to folks who get subscribed to streams.) """ - streams = ["stream_%s" % i for i in range(10)] + streams = ["stream_%s" % (i,) for i in range(10)] for stream_name in streams: self.make_stream(stream_name) diff --git a/zerver/tests/test_thumbnail.py b/zerver/tests/test_thumbnail.py index 672cf81e8d..12bd95bd6d 100644 --- a/zerver/tests/test_thumbnail.py +++ b/zerver/tests/test_thumbnail.py @@ -48,13 +48,13 @@ class ThumbnailTest(ZulipTestCase): quoted_uri = urllib.parse.quote(uri[1:], safe='') # Test full size image. - result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_uri)) + result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_uri,)) self.assertEqual(result.status_code, 302, result) expected_part_url = get_file_path_urlpart(uri) self.assertIn(expected_part_url, result.url) # Test thumbnail size. - result = self.client_get("/thumbnail?url=%s&size=thumbnail" % (quoted_uri)) + result = self.client_get("/thumbnail?url=%s&size=thumbnail" % (quoted_uri,)) self.assertEqual(result.status_code, 302, result) expected_part_url = get_file_path_urlpart(uri, '0x300') self.assertIn(expected_part_url, result.url) @@ -72,7 +72,7 @@ class ThumbnailTest(ZulipTestCase): quoted_emoji_url = urllib.parse.quote(custom_emoji_url[1:], safe='') # Test full size custom emoji image (for emoji link in messages case). - result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_emoji_url)) + result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_emoji_url,)) self.assertEqual(result.status_code, 302, result) self.assertIn(custom_emoji_url, result.url) @@ -88,7 +88,7 @@ class ThumbnailTest(ZulipTestCase): # Test with another user trying to access image using thumbor. self.login(self.example_email("iago")) - result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_uri)) + result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_uri,)) self.assertEqual(result.status_code, 403, result) self.assert_in_response("You are not authorized to view this file.", result) @@ -98,13 +98,13 @@ class ThumbnailTest(ZulipTestCase): self.login(self.example_email("hamlet")) quoted_url = urllib.parse.quote(image_url, safe='') encoded_url = base64.urlsafe_b64encode(image_url.encode()).decode('utf-8') - result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_url)) + result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_url,)) self.assertEqual(result.status_code, 302, result) expected_part_url = '/smart/filters:no_upscale()/' + encoded_url + '/source_type/external' self.assertIn(expected_part_url, result.url) # Test thumbnail size. - result = self.client_get("/thumbnail?url=%s&size=thumbnail" % (quoted_url)) + result = self.client_get("/thumbnail?url=%s&size=thumbnail" % (quoted_url,)) self.assertEqual(result.status_code, 302, result) expected_part_url = '/0x300/smart/filters:no_upscale():sharpen(0.5,0.2,true)/' + encoded_url + '/source_type/external' self.assertIn(expected_part_url, result.url) @@ -137,7 +137,7 @@ class ThumbnailTest(ZulipTestCase): # Test with another user trying to access image using thumbor. # File should be always accessible to user in case of external source self.login(self.example_email("iago")) - result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_url)) + result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_url,)) self.assertEqual(result.status_code, 302, result) expected_part_url = '/smart/filters:no_upscale()/' + encoded_url + '/source_type/external' self.assertIn(expected_part_url, result.url) @@ -174,13 +174,13 @@ class ThumbnailTest(ZulipTestCase): # We remove the forward slash infront of the `/user_uploads/` to match # bugdown behaviour. quoted_uri = urllib.parse.quote(uri[1:], safe='') - result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_uri)) + result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_uri,)) self.assertEqual(result.status_code, 302, result) expected_part_url = get_file_path_urlpart(uri) self.assertIn(expected_part_url, result.url) # Test thumbnail size. - result = self.client_get("/thumbnail?url=%s&size=thumbnail" % (quoted_uri)) + result = self.client_get("/thumbnail?url=%s&size=thumbnail" % (quoted_uri,)) self.assertEqual(result.status_code, 302, result) expected_part_url = get_file_path_urlpart(uri, '0x300') self.assertIn(expected_part_url, result.url) @@ -198,7 +198,7 @@ class ThumbnailTest(ZulipTestCase): # We remove the forward slash infront of the `/user_uploads/` to match # bugdown behaviour. quoted_uri = urllib.parse.quote(uri[1:], safe='') - result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_uri)) + result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_uri,)) self.assertEqual(result.status_code, 302, result) expected_part_url = get_file_path_urlpart(uri) self.assertIn(expected_part_url, result.url) @@ -216,7 +216,7 @@ class ThumbnailTest(ZulipTestCase): quoted_emoji_url = urllib.parse.quote(custom_emoji_url[1:], safe='') # Test full size custom emoji image (for emoji link in messages case). - result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_emoji_url)) + result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_emoji_url,)) self.assertEqual(result.status_code, 302, result) self.assertIn(custom_emoji_url, result.url) @@ -243,7 +243,7 @@ class ThumbnailTest(ZulipTestCase): # Test with another user trying to access image using thumbor. self.login(self.example_email("iago")) - result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_uri)) + result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_uri,)) self.assertEqual(result.status_code, 403, result) self.assert_in_response("You are not authorized to view this file.", result) @@ -252,7 +252,7 @@ class ThumbnailTest(ZulipTestCase): self.login(self.example_email("hamlet")) uri = '/static/images/cute/turtle.png' quoted_uri = urllib.parse.quote(uri[1:], safe='') - result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_uri)) + result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_uri,)) self.assertEqual(result.status_code, 302, result) self.assertEqual(uri, result.url) @@ -272,21 +272,21 @@ class ThumbnailTest(ZulipTestCase): quoted_uri = urllib.parse.quote(uri[1:], safe='') with self.settings(THUMBOR_URL=''): - result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_uri)) + result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_uri,)) self.assertEqual(result.status_code, 302, result) self.assertEqual(uri, result.url) uri = 'https://www.google.com/images/srpr/logo4w.png' quoted_uri = urllib.parse.quote(uri, safe='') with self.settings(THUMBOR_URL=''): - result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_uri)) + result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_uri,)) self.assertEqual(result.status_code, 302, result) self.assertEqual(uri, result.url) uri = 'http://www.google.com/images/srpr/logo4w.png' quoted_uri = urllib.parse.quote(uri, safe='') with self.settings(THUMBOR_URL=''): - result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_uri)) + result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_uri,)) self.assertEqual(result.status_code, 302, result) base = 'https://external-content.zulipcdn.net/external_content/7b6552b60c635e41e8f6daeb36d88afc4eabde79/687474703a2f2f7777772e676f6f676c652e636f6d2f696d616765732f737270722f6c6f676f34772e706e67' self.assertEqual(base, result.url) @@ -307,7 +307,7 @@ class ThumbnailTest(ZulipTestCase): quoted_uri = urllib.parse.quote(uri[1:], safe='') hex_uri = base64.urlsafe_b64encode(uri.encode()).decode('utf-8') with self.settings(THUMBOR_URL='http://test-thumborhost.com'): - result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_uri)) + result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_uri,)) self.assertEqual(result.status_code, 302, result) base = 'http://test-thumborhost.com/' self.assertEqual(base, result.url[:len(base)]) @@ -340,23 +340,23 @@ class ThumbnailTest(ZulipTestCase): # size=thumbnail should return a 0x300 sized image. # size=full should return the original resolution image. quoted_uri = urllib.parse.quote(uri[1:], safe='') - result = self.client_get("/thumbnail?url=%s&size=thumbnail" % (quoted_uri)) + result = self.client_get("/thumbnail?url=%s&size=thumbnail" % (quoted_uri,)) self.assertEqual(result.status_code, 302, result) expected_part_url = get_file_path_urlpart(uri, '0x300') self.assertIn(expected_part_url, result.url) - result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_uri)) + result = self.client_get("/thumbnail?url=%s&size=full" % (quoted_uri,)) self.assertEqual(result.status_code, 302, result) expected_part_url = get_file_path_urlpart(uri) self.assertIn(expected_part_url, result.url) # Test with size supplied as a query parameter where size is anything # else than 'full' or 'thumbnail'. Result should be an error message. - result = self.client_get("/thumbnail?url=%s&size=480x360" % (quoted_uri)) + result = self.client_get("/thumbnail?url=%s&size=480x360" % (quoted_uri,)) self.assertEqual(result.status_code, 403, result) self.assert_in_response("Invalid size.", result) # Test with no size param supplied. In this case as well we show an # error message. - result = self.client_get("/thumbnail?url=%s" % (quoted_uri)) + result = self.client_get("/thumbnail?url=%s" % (quoted_uri,)) self.assertEqual(result.status_code, 400, "Missing 'size' argument") diff --git a/zerver/tests/test_upload.py b/zerver/tests/test_upload.py index e25f247f82..c3a990e929 100644 --- a/zerver/tests/test_upload.py +++ b/zerver/tests/test_upload.py @@ -838,7 +838,7 @@ class AvatarTest(UploadSerializeMixin, ZulipTestCase): redirect_url = response['Location'] self.assertTrue(redirect_url.endswith(str(avatar_url(cordelia)) + '&foo=bar')) - response = self.client_get("/avatar/%s?foo=bar" % (cordelia.id)) + response = self.client_get("/avatar/%s?foo=bar" % (cordelia.id,)) redirect_url = response['Location'] self.assertTrue(redirect_url.endswith(str(avatar_url(cordelia)) + '&foo=bar')) @@ -852,7 +852,7 @@ class AvatarTest(UploadSerializeMixin, ZulipTestCase): redirect_url = response['Location'] self.assertTrue(redirect_url.endswith(str(avatar_url(cordelia)) + '&foo=bar')) - response = self.api_get(hamlet, "/avatar/%s?foo=bar" % (cordelia.id)) + response = self.api_get(hamlet, "/avatar/%s?foo=bar" % (cordelia.id,)) redirect_url = response['Location'] self.assertTrue(redirect_url.endswith(str(avatar_url(cordelia)) + '&foo=bar')) @@ -862,7 +862,7 @@ class AvatarTest(UploadSerializeMixin, ZulipTestCase): self.assertTrue(redirect_url.endswith(str(avatar_url(cross_realm_bot)) + '&foo=bar')) # Test cross_realm_bot avatar access using id. - response = self.api_get(hamlet, "/avatar/%s?foo=bar" % (cross_realm_bot.id)) + response = self.api_get(hamlet, "/avatar/%s?foo=bar" % (cross_realm_bot.id,)) redirect_url = response['Location'] self.assertTrue(redirect_url.endswith(str(avatar_url(cross_realm_bot)) + '&foo=bar')) @@ -1269,7 +1269,7 @@ class RealmLogoTest(UploadSerializeMixin, ZulipTestCase): response = self.client_get("/json/realm/logo", {'night': ujson.dumps(self.night)}) redirect_url = response['Location'] self.assertEqual(redirect_url, realm_logo_url(realm, self.night) + - '&night=%s' % (str(self.night).lower())) + '&night=%s' % (str(self.night).lower(),)) def test_get_realm_logo(self) -> None: self.login(self.example_email("hamlet")) @@ -1278,7 +1278,7 @@ class RealmLogoTest(UploadSerializeMixin, ZulipTestCase): response = self.client_get("/json/realm/logo", {'night': ujson.dumps(self.night)}) redirect_url = response['Location'] self.assertTrue(redirect_url.endswith(realm_logo_url(realm, self.night) + - '&night=%s' % (str(self.night).lower()))) + '&night=%s' % (str(self.night).lower(),))) def test_valid_logos(self) -> None: """ @@ -1642,12 +1642,12 @@ class S3Test(ZulipTestCase): image_file = get_test_image_file("img.png") zerver.lib.upload.upload_backend.upload_realm_logo_image(image_file, user_profile, night) - original_path_id = os.path.join(str(user_profile.realm.id), "realm", "%s.original" % (file_name)) + original_path_id = os.path.join(str(user_profile.realm.id), "realm", "%s.original" % (file_name,)) original_key = bucket.get_key(original_path_id) image_file.seek(0) self.assertEqual(image_file.read(), original_key.get_contents_as_string()) - resized_path_id = os.path.join(str(user_profile.realm.id), "realm", "%s.png" % (file_name)) + resized_path_id = os.path.join(str(user_profile.realm.id), "realm", "%s.png" % (file_name,)) resized_data = bucket.get_key(resized_path_id).read() resized_image = Image.open(io.BytesIO(resized_data)).size self.assertEqual(resized_image, (DEFAULT_AVATAR_SIZE, DEFAULT_AVATAR_SIZE)) diff --git a/zerver/tests/test_users.py b/zerver/tests/test_users.py index 44629e98dd..fefb2ec719 100644 --- a/zerver/tests/test_users.py +++ b/zerver/tests/test_users.py @@ -586,7 +586,7 @@ class UserProfileTest(ZulipTestCase): self.assertEqual(check_valid_user_ids(realm.id, invalid_uid), "User IDs is not a list") self.assertEqual(check_valid_user_ids(realm.id, [invalid_uid]), - "Invalid user ID: %d" % (invalid_uid)) + "Invalid user ID: %d" % (invalid_uid,)) invalid_uid = "abc" self.assertEqual(check_valid_user_ids(realm.id, [invalid_uid]), @@ -597,19 +597,19 @@ class UserProfileTest(ZulipTestCase): # User is in different realm self.assertEqual(check_valid_user_ids(get_realm("zephyr").id, [hamlet.id]), - "Invalid user ID: %d" % (hamlet.id)) + "Invalid user ID: %d" % (hamlet.id,)) # User is not active hamlet.is_active = False hamlet.save() self.assertEqual(check_valid_user_ids(realm.id, [hamlet.id]), - "User with ID %d is deactivated" % (hamlet.id)) + "User with ID %d is deactivated" % (hamlet.id,)) self.assertEqual(check_valid_user_ids(realm.id, [hamlet.id], allow_deactivated=True), None) # User is a bot self.assertEqual(check_valid_user_ids(realm.id, [bot.id]), - "User with ID %d is a bot" % (bot.id)) + "User with ID %d is a bot" % (bot.id,)) # Succesfully get non-bot, active user belong to your realm self.assertEqual(check_valid_user_ids(realm.id, [othello.id]), None) diff --git a/zerver/views/streams.py b/zerver/views/streams.py index 422718ac5b..70c6e6dd58 100644 --- a/zerver/views/streams.py +++ b/zerver/views/streams.py @@ -391,10 +391,10 @@ def add_subscriptions_backend( notifications_stream = user_profile.realm.get_notifications_stream() if notifications_stream is not None: if len(created_streams) > 1: - stream_strs = ", ".join('#**%s**' % s.name for s in created_streams) + stream_strs = ", ".join('#**%s**' % (s.name,) for s in created_streams) stream_msg = "the following streams: %s" % (stream_strs,) else: - stream_msg = "a new stream #**%s**." % created_streams[0].name + stream_msg = "a new stream #**%s**." % (created_streams[0].name,) msg = ("@_**%s|%d** just created %s" % (user_profile.full_name, user_profile.id, stream_msg)) sender = get_system_bot(settings.NOTIFICATION_BOT) diff --git a/zerver/webhooks/freshdesk/view.py b/zerver/webhooks/freshdesk/view.py index e37e47b934..f2f36a7c2b 100644 --- a/zerver/webhooks/freshdesk/view.py +++ b/zerver/webhooks/freshdesk/view.py @@ -82,7 +82,9 @@ def format_freshdesk_property_change_message(ticket: TicketDict, event_info: Lis """ content = "%s <%s> updated [ticket #%s](%s):\n\n" % ( ticket.requester_name, ticket.requester_email, ticket.id, ticket.url) - # Why not `"%s %s %s" % event_info`? Because the linter doesn't like it. + # Why not `"%s %s %s" % event_info`? Because the linter doesn't like it? + # No, because it doesn't work: `event_info` is a list, not a tuple. But you + # could write `"%s %s %s" % (*event_info,)`. content += "%s: **%s** => **%s**" % ( event_info[0].capitalize(), event_info[1], event_info[2]) diff --git a/zerver/webhooks/newrelic/view.py b/zerver/webhooks/newrelic/view.py index a23ebb2c6a..709f57f259 100644 --- a/zerver/webhooks/newrelic/view.py +++ b/zerver/webhooks/newrelic/view.py @@ -40,7 +40,7 @@ def api_newrelic_webhook(request: HttpRequest, user_profile: UserProfile, subject = alert['message'] content = ALERT_TEMPLATE.format(**alert) elif deployment: - subject = "%s deploy" % (deployment['application_name']) + subject = "%s deploy" % (deployment['application_name'],) content = DEPLOY_TEMPLATE.format(**deployment) else: raise UnexpectedWebhookEventType('New Relic', 'Unknown Event Type') diff --git a/zerver/worker/queue_processors.py b/zerver/worker/queue_processors.py index 3160529e54..df31e67599 100644 --- a/zerver/worker/queue_processors.py +++ b/zerver/worker/queue_processors.py @@ -256,7 +256,7 @@ class UserActivityIntervalWorker(QueueProcessingWorker): @assign_queue('user_presence') class UserPresenceWorker(QueueProcessingWorker): def consume(self, event: Mapping[str, Any]) -> None: - logging.debug("Received presence event: %s" % (event),) + logging.debug("Received presence event: %s" % (event,),) user_profile = get_user_profile_by_id(event["user_profile_id"]) client = get_client(event["client"]) log_time = timestamp_to_datetime(event["time"]) @@ -392,7 +392,7 @@ class SlowQueryWorker(LoopQueueProcessingWorker): # creates conflicts with other users in the file. def consume_batch(self, slow_queries: List[Any]) -> None: for query in slow_queries: - logging.info("Slow query: %s" % (query)) + logging.info("Slow query: %s" % (query,)) if settings.SLOW_QUERY_LOGS_STREAM is None: return diff --git a/zilencer/views.py b/zilencer/views.py index 4005c1b5bd..a8dc7c9c1e 100644 --- a/zilencer/views.py +++ b/zilencer/views.py @@ -155,7 +155,7 @@ def validate_count_stats(server: RemoteZulipServer, model: Any, last_id = get_last_id_from_server(server, model) for item in counts: if item['property'] not in COUNT_STATS: - raise JsonableError(_("Invalid property %s" % item['property'])) + raise JsonableError(_("Invalid property %s" % (item['property'],))) if item['id'] <= last_id: raise JsonableError(_("Data is out of order.")) last_id = item['id']