diff --git a/manage.py b/manage.py index d94e6118..a2f4bd33 100755 --- a/manage.py +++ b/manage.py @@ -2,9 +2,9 @@ import os import sys -if __name__ == "__main__": +if __name__ == '__main__': os.environ.setdefault( - "DJANGO_SETTINGS_MODULE", "patchwork.settings.production" + 'DJANGO_SETTINGS_MODULE', 'patchwork.settings.production' ) import django diff --git a/patchwork/api/check.py b/patchwork/api/check.py index 348111ae..74bbc19e 100644 --- a/patchwork/api/check.py +++ b/patchwork/api/check.py @@ -36,7 +36,7 @@ class CheckSerializer(HyperlinkedModelSerializer): def run_validation(self, data): if 'state' not in data or data['state'] == '': - raise ValidationError({'state': ["A check must have a state."]}) + raise ValidationError({'state': ['A check must have a state.']}) for val, label in Check.STATE_CHOICES: if label != data['state']: diff --git a/patchwork/forms.py b/patchwork/forms.py index 688fb1a0..ed06d0d1 100644 --- a/patchwork/forms.py +++ b/patchwork/forms.py @@ -65,7 +65,7 @@ class BundleForm(forms.ModelForm): min_length=1, max_length=50, label='Name', - error_messages={'invalid': 'Bundle names can\'t contain slashes'}, + error_messages={'invalid': "Bundle names can't contain slashes"}, ) class Meta: @@ -203,7 +203,7 @@ def save(self, instance, commit=True): opts = instance.__class__._meta if self.errors: raise ValueError( - "The %s could not be changed because the data " + 'The %s could not be changed because the data ' "didn't validate." % opts.object_name ) data = self.cleaned_data diff --git a/patchwork/management/commands/cron.py b/patchwork/management/commands/cron.py index 22575536..a006d7d6 100644 --- a/patchwork/management/commands/cron.py +++ b/patchwork/management/commands/cron.py @@ -19,7 +19,7 @@ def handle(self, *args, **kwargs): errors = send_notifications() for recipient, error in errors: self.stderr.write( - "Failed sending to %s: %s" % (recipient.email, error) + 'Failed sending to %s: %s' % (recipient.email, error) ) expire_notifications() diff --git a/patchwork/management/commands/parsemail.py b/patchwork/management/commands/parsemail.py index 6f45f51d..bcb257fe 100644 --- a/patchwork/management/commands/parsemail.py +++ b/patchwork/management/commands/parsemail.py @@ -44,7 +44,7 @@ def handle(self, *args, **options): logger.info('Parsing mail loaded from stdin') mail = email.message_from_binary_file(sys.stdin.buffer) except AttributeError: - logger.warning("Broken email ignored") + logger.warning('Broken email ignored') return # it's important to get exit codes correct here. The key is to allow diff --git a/patchwork/migrations/0001_squashed_0040_add_related_patches.py b/patchwork/migrations/0001_squashed_0040_add_related_patches.py index 270ad348..27752c8e 100644 --- a/patchwork/migrations/0001_squashed_0040_add_related_patches.py +++ b/patchwork/migrations/0001_squashed_0040_add_related_patches.py @@ -248,8 +248,8 @@ class Migration(migrations.Migration): models.CharField( blank=True, help_text=b"URL format for the list archive's " - b"Message-ID redirector. {} will be " - b"replaced by the Message-ID.", + b'Message-ID redirector. {} will be ' + b'replaced by the Message-ID.', max_length=2000, ), ), @@ -424,7 +424,7 @@ class Migration(migrations.Migration): models.BooleanField( default=True, help_text=b"Show a column displaying this tag's count " - b"in the patch list view", + b'in the patch list view', ), ), ], diff --git a/patchwork/migrations/0007_move_comment_content_to_patch_content.py b/patchwork/migrations/0007_move_comment_content_to_patch_content.py index 89d080cb..1dab2c35 100644 --- a/patchwork/migrations/0007_move_comment_content_to_patch_content.py +++ b/patchwork/migrations/0007_move_comment_content_to_patch_content.py @@ -4,22 +4,22 @@ def copy_comment_field(apps, schema_editor): if connection.vendor == 'postgresql': schema_editor.execute( - ''' + """ UPDATE patchwork_patch SET content = patchwork_comment.content FROM patchwork_comment WHERE patchwork_patch.id=patchwork_comment.patch_id AND patchwork_patch.msgid=patchwork_comment.msgid - ''' + """ ) elif connection.vendor == 'mysql': schema_editor.execute( - ''' + """ UPDATE patchwork_patch, patchwork_comment SET patchwork_patch.content = patchwork_comment.content WHERE patchwork_patch.id=patchwork_comment.patch_id AND patchwork_patch.msgid=patchwork_comment.msgid - ''' + """ ) else: Comment = apps.get_model('patchwork', 'Comment') @@ -41,21 +41,21 @@ def copy_comment_field(apps, schema_editor): def remove_duplicate_comments(apps, schema_editor): if connection.vendor == 'postgresql': schema_editor.execute( - ''' + """ DELETE FROM patchwork_comment USING patchwork_patch WHERE patchwork_patch.id=patchwork_comment.patch_id AND patchwork_patch.msgid=patchwork_comment.msgid - ''' + """ ) elif connection.vendor == 'mysql': schema_editor.execute( - ''' + """ DELETE FROM patchwork_comment USING patchwork_patch, patchwork_comment WHERE patchwork_patch.id=patchwork_comment.patch_id AND patchwork_patch.msgid=patchwork_comment.msgid - ''' + """ ) else: Comment = apps.get_model('patchwork', 'Comment') diff --git a/patchwork/migrations/0010_migrate_data_from_submission_to_patch.py b/patchwork/migrations/0010_migrate_data_from_submission_to_patch.py index 32282285..a1afaaff 100644 --- a/patchwork/migrations/0010_migrate_data_from_submission_to_patch.py +++ b/patchwork/migrations/0010_migrate_data_from_submission_to_patch.py @@ -8,19 +8,19 @@ class Migration(migrations.Migration): operations = [ migrations.RunSQL( - '''INSERT INTO patchwork_patch + """INSERT INTO patchwork_patch (submission_ptr_id, diff2, commit_ref2, pull_url2, delegate2_id, state2_id, archived2, hash2) SELECT id, diff, commit_ref, pull_url, delegate_id, state_id, archived, hash FROM patchwork_submission - ''', - '''UPDATE patchwork_submission SET + """, + """UPDATE patchwork_submission SET diff=diff2, commit_ref=commit_ref2, pull_url=pull_url2, delegate_id=delegate2_id, state_id=state2_id, archived=archived2, hash=hash2 FROM patchwork_patch WHERE patchwork_submission.id = patchwork_patch.submission_ptr_id - ''', + """, ), ] diff --git a/patchwork/migrations/0020_tag_show_column.py b/patchwork/migrations/0020_tag_show_column.py index 10ce3b78..e23da102 100644 --- a/patchwork/migrations/0020_tag_show_column.py +++ b/patchwork/migrations/0020_tag_show_column.py @@ -13,7 +13,7 @@ class Migration(migrations.Migration): field=models.BooleanField( default=True, help_text=b"Show a column displaying this tag's count in the " - b"patch list view", + b'patch list view', ), ), ] diff --git a/patchwork/migrations/0024_patch_patch_project.py b/patchwork/migrations/0024_patch_patch_project.py index 8df51917..34f9c425 100644 --- a/patchwork/migrations/0024_patch_patch_project.py +++ b/patchwork/migrations/0024_patch_patch_project.py @@ -26,10 +26,10 @@ class Migration(migrations.Migration): ), # as with 10, this will break if you use non-default table names migrations.RunSQL( - '''UPDATE patchwork_patch SET patch_project_id = + """UPDATE patchwork_patch SET patch_project_id = (SELECT project_id FROM patchwork_submission WHERE patchwork_submission.id = - patchwork_patch.submission_ptr_id);''' + patchwork_patch.submission_ptr_id);""" ), migrations.AlterField( model_name='patch', diff --git a/patchwork/migrations/0035_project_list_archive_url_format.py b/patchwork/migrations/0035_project_list_archive_url_format.py index 005e5a4e..cbb3c40d 100644 --- a/patchwork/migrations/0035_project_list_archive_url_format.py +++ b/patchwork/migrations/0035_project_list_archive_url_format.py @@ -13,8 +13,8 @@ class Migration(migrations.Migration): field=models.CharField( blank=True, help_text=b"URL format for the list archive's Message-ID " - b"redirector. {} will be replaced by the " - b"Message-ID.", + b'redirector. {} will be replaced by the ' + b'Message-ID.', max_length=2000, ), ), diff --git a/patchwork/migrations/0041_python3.py b/patchwork/migrations/0041_python3.py index 874fea8a..37643baf 100644 --- a/patchwork/migrations/0041_python3.py +++ b/patchwork/migrations/0041_python3.py @@ -229,7 +229,7 @@ class Migration(migrations.Migration): field=models.CharField( blank=True, help_text="URL format for the list archive's Message-ID " - "redirector. {} will be replaced by the Message-ID.", + 'redirector. {} will be replaced by the Message-ID.', max_length=2000, ), ), @@ -314,7 +314,7 @@ class Migration(migrations.Migration): field=models.BooleanField( default=True, help_text="Show a column displaying this tag's count in the " - "patch list view", + 'patch list view', ), ), migrations.AlterField( diff --git a/patchwork/models.py b/patchwork/models.py index 422ac51d..9a619bc5 100644 --- a/patchwork/models.py +++ b/patchwork/models.py @@ -88,7 +88,7 @@ class Project(models.Model): max_length=2000, blank=True, help_text="URL format for the list archive's Message-ID redirector. " - "{} will be replaced by the Message-ID.", + '{} will be replaced by the Message-ID.', ) commit_url_format = models.CharField( max_length=2000, @@ -270,7 +270,7 @@ class Tag(models.Model): ) show_column = models.BooleanField( help_text='Show a column displaying this' - ' tag\'s count in the patch list view', + " tag's count in the patch list view", default=True, ) @@ -319,10 +319,10 @@ def with_tag_counts(self, project=None): for tag in tags: select[tag.attr_name] = ( - "coalesce(" - "(SELECT count FROM patchwork_patchtag" - " WHERE patchwork_patchtag.patch_id=patchwork_patch.id" - " AND patchwork_patchtag.tag_id=%s), 0)" + 'coalesce(' + '(SELECT count FROM patchwork_patchtag' + ' WHERE patchwork_patchtag.patch_id=patchwork_patch.id' + ' AND patchwork_patchtag.tag_id=%s), 0)' ) select_params.append(tag.id) diff --git a/patchwork/parser.py b/patchwork/parser.py index 15ac5a15..09a53a08 100644 --- a/patchwork/parser.py +++ b/patchwork/parser.py @@ -207,7 +207,7 @@ def find_project(mail, list_id=None): if not project: logger.debug( - "Could not find a valid project for given list-id and " "subject." + 'Could not find a valid project for given list-id and ' 'subject.' ) return project @@ -412,7 +412,7 @@ def get_original_sender(mail, name, email): cc_headers = mail.get_all('Cc') or [] for header in reply_to_headers + cc_headers: header = clean_header(header) - addrs = header.split(",") + addrs = header.split(',') for addr in addrs: new_name, new_email = split_from_header(addr) if new_name: @@ -520,8 +520,8 @@ def find_message_id(mail): # about this logger.info( "Malformed 'Message-Id' header. The 'msg-id' component should be " - "surrounded by angle brackets. Saving raw header. This may " - "include comments and extra whitespace." + 'surrounded by angle brackets. Saving raw header. This may ' + 'include comments and extra whitespace.' ) msgid = header.strip() @@ -547,8 +547,8 @@ def find_references(mail): else: logger.info( "Malformed 'In-Reply-To' header. The 'msg-id' component " - "should be surrounded by angle brackets. Saving raw header. " - "This may include comments and extra whitespace." + 'should be surrounded by angle brackets. Saving raw header. ' + 'This may include comments and extra whitespace.' ) ref = header.strip() refs.append(ref) diff --git a/patchwork/templatetags/patch.py b/patchwork/templatetags/patch.py index cf22f251..d3f023f7 100644 --- a/patchwork/templatetags/patch.py +++ b/patchwork/templatetags/patch.py @@ -23,7 +23,7 @@ def patch_tags(patch): count = getattr(patch, tag.attr_name) titles.append('%d %s' % (count, tag.name)) if count == 0: - counts.append("-") + counts.append('-') else: counts.append(str(count)) diff --git a/patchwork/tests/api/test_event.py b/patchwork/tests/api/test_event.py index 0f93774b..f36bdd2d 100644 --- a/patchwork/tests/api/test_event.py +++ b/patchwork/tests/api/test_event.py @@ -202,18 +202,18 @@ def test_order_by_date_default(self): self._create_events() resp = self.client.get(self.api_url()) - events = Event.objects.order_by("-date").all() + events = Event.objects.order_by('-date').all() for api_event, event in zip(resp.data, events): - self.assertEqual(api_event["id"], event.id) + self.assertEqual(api_event['id'], event.id) def test_order_by_date_ascending(self): """Assert the default ordering is by date descending.""" self._create_events() resp = self.client.get(self.api_url(), {'order': 'date'}) - events = Event.objects.order_by("date").all() + events = Event.objects.order_by('date').all() for api_event, event in zip(resp.data, events): - self.assertEqual(api_event["id"], event.id) + self.assertEqual(api_event['id'], event.id) def test_create(self): """Ensure creates aren't allowed""" diff --git a/patchwork/tests/api/test_patch.py b/patchwork/tests/api/test_patch.py index f4c9f676..13f53808 100644 --- a/patchwork/tests/api/test_patch.py +++ b/patchwork/tests/api/test_patch.py @@ -81,7 +81,7 @@ def _create_patch(self, **kwargs): state=state_obj, project=project_obj, submitter=person_obj, - **kwargs + **kwargs, ) return patch_obj @@ -366,7 +366,7 @@ def test_update_maintainer_version_1_0(self): self.client.force_authenticate(user=user) resp = self.client.patch( - self.api_url(patch.id, version="1.1"), + self.api_url(patch.id, version='1.1'), {'state': state.slug, 'delegate': user.id}, ) self.assertEqual(status.HTTP_200_OK, resp.status_code, resp) diff --git a/patchwork/tests/api/utils.py b/patchwork/tests/api/utils.py index c39bbbaf..e69159e1 100644 --- a/patchwork/tests/api/utils.py +++ b/patchwork/tests/api/utils.py @@ -138,7 +138,7 @@ def post( format=None, content_type=None, follow=False, - **extra + **extra, ): validate_request = extra.pop('validate_request', True) validate_response = extra.pop('validate_response', True) @@ -149,7 +149,7 @@ def post( format='json', content_type=content_type, SERVER_NAME='example.com', - **extra + **extra, ) response = super(APIClient, self).post( path, @@ -158,7 +158,7 @@ def post( content_type=content_type, follow=follow, SERVER_NAME='example.com', - **extra + **extra, ) validator.validate_data( @@ -174,7 +174,7 @@ def put( format=None, content_type=None, follow=False, - **extra + **extra, ): validate_request = extra.pop('validate_request', True) validate_response = extra.pop('validate_response', True) @@ -185,7 +185,7 @@ def put( format='json', content_type=content_type, SERVER_NAME='example.com', - **extra + **extra, ) response = super(APIClient, self).put( path, @@ -194,7 +194,7 @@ def put( content_type=content_type, follow=follow, SERVER_NAME='example.com', - **extra + **extra, ) validator.validate_data( @@ -210,7 +210,7 @@ def patch( format=None, content_type=None, follow=False, - **extra + **extra, ): validate_request = extra.pop('validate_request', True) validate_response = extra.pop('validate_response', True) @@ -221,7 +221,7 @@ def patch( format='json', content_type=content_type, SERVER_NAME='example.com', - **extra + **extra, ) response = super(APIClient, self).patch( path, @@ -230,7 +230,7 @@ def patch( content_type=content_type, follow=follow, SERVER_NAME='example.com', - **extra + **extra, ) validator.validate_data( diff --git a/patchwork/tests/runner.py b/patchwork/tests/runner.py index 84f3abad..291ddbc1 100644 --- a/patchwork/tests/runner.py +++ b/patchwork/tests/runner.py @@ -69,7 +69,7 @@ def printErrors(self): if unexpectedSuccesses: self.stream.writeln('=' * 70) for test in unexpectedSuccesses: - self.stream.writeln(f"UNEXPECTED SUCCESS: {str(test)}") + self.stream.writeln(f'UNEXPECTED SUCCESS: {str(test)}') self.stream.flush() def printErrorList(self, flavour, errors): diff --git a/patchwork/tests/test_parser.py b/patchwork/tests/test_parser.py index 1eaecab1..919f9f46 100644 --- a/patchwork/tests/test_parser.py +++ b/patchwork/tests/test_parser.py @@ -767,15 +767,15 @@ def test_git_modify_binary_file(self): def test_git_rename(self): diff, _ = self._find_content('0008-git-rename.mbox') self.assertTrue(diff is not None) - self.assertEqual(diff.count("\nrename from "), 2) - self.assertEqual(diff.count("\nrename to "), 2) + self.assertEqual(diff.count('\nrename from '), 2) + self.assertEqual(diff.count('\nrename to '), 2) def test_git_rename_with_diff(self): diff, message = self._find_content('0009-git-rename-with-diff.mbox') self.assertTrue(diff is not None) self.assertTrue(message is not None) - self.assertEqual(diff.count("\nrename from "), 2) - self.assertEqual(diff.count("\nrename to "), 2) + self.assertEqual(diff.count('\nrename from '), 2) + self.assertEqual(diff.count('\nrename to '), 2) self.assertEqual(diff.count('\n-a\n+b'), 1) def test_git_new_empty_file(self): @@ -886,7 +886,7 @@ def test_html_multipart(self): class DelegateRequestTest(TestCase): patch_filename = '0001-add-line.patch' msgid = '<1@example.com>' - invalid_delegate_email = "nobody" + invalid_delegate_email = 'nobody' def setUp(self): self.patch = read_patch(self.patch_filename) @@ -988,7 +988,7 @@ def test_cover_comment(self): class InitialPatchStateTest(TestCase): patch_filename = '0001-add-line.patch' msgid = '<1@example.com>' - invalid_state_name = "Nonexistent Test State" + invalid_state_name = 'Nonexistent Test State' def setUp(self): self.default_state = create_state() @@ -1110,10 +1110,10 @@ def test_clean_subject(self): self.assertEqual(clean_subject('Re: meep'), ('meep', [])) self.assertEqual(clean_subject('[PATCH] meep'), ('meep', [])) self.assertEqual( - clean_subject("[PATCH] meep \n meep"), ('meep meep', []) + clean_subject('[PATCH] meep \n meep'), ('meep meep', []) ) self.assertEqual( - clean_subject("[PATCH] meep,\n meep"), ('meep, meep', []) + clean_subject('[PATCH] meep,\n meep'), ('meep, meep', []) ) self.assertEqual( clean_subject('[PATCH RFC] meep'), ('[RFC] meep', ['RFC']) diff --git a/patchwork/tests/views/test_user.py b/patchwork/tests/views/test_user.py index 1f19097a..3c3b0c5d 100644 --- a/patchwork/tests/views/test_user.py +++ b/patchwork/tests/views/test_user.py @@ -503,7 +503,7 @@ def test_password_change(self): response = self.client.get(reverse('password_change_done')) self.assertContains( - response, "Your password has been changed successfully" + response, 'Your password has been changed successfully' ) diff --git a/patchwork/tests/views/test_utils.py b/patchwork/tests/views/test_utils.py index 2b44cfda..61fa0763 100644 --- a/patchwork/tests/views/test_utils.py +++ b/patchwork/tests/views/test_utils.py @@ -214,7 +214,7 @@ def test_supplied_date_header(self): date = tz_utils.now() - datetime.timedelta(days=1) date = date.replace(tzinfo=tz, microsecond=0) - patch.headers = 'Date: %s\n' % date.strftime("%a, %d %b %Y %T %z") + patch.headers = 'Date: %s\n' % date.strftime('%a, %d %b %Y %T %z') patch.save() mbox = utils.patch_to_mbox(patch) diff --git a/patchwork/tests/views/test_xmlrpc.py b/patchwork/tests/views/test_xmlrpc.py index c33e7ade..71579eef 100644 --- a/patchwork/tests/views/test_xmlrpc.py +++ b/patchwork/tests/views/test_xmlrpc.py @@ -119,13 +119,13 @@ def test_list_multiple(self): def test_list_max_count(self): objs = self.create_multiple(5) - result = self.list_endpoint("", 2) + result = self.list_endpoint('', 2) self.assertEqual(len(result), 2) self.assertEqual(result[0]['id'], objs[0].id) def test_list_negative_max_count(self): objs = self.create_multiple(5) - result = self.list_endpoint("", -1) + result = self.list_endpoint('', -1) self.assertEqual(len(result), 1) self.assertEqual(result[0]['id'], objs[-1].id) diff --git a/patchwork/views/__init__.py b/patchwork/views/__init__.py index cdad279d..704ab815 100644 --- a/patchwork/views/__init__.py +++ b/patchwork/views/__init__.py @@ -116,7 +116,7 @@ def set_bundle(request, project, action, data, patches, context): if action == 'create': bundle_name = data['bundle_name'].strip() if '/' in bundle_name: - return ['Bundle names can\'t contain slashes'] + return ["Bundle names can't contain slashes"] if not bundle_name: return ['No bundle name was specified'] @@ -126,7 +126,7 @@ def set_bundle(request, project, action, data, patches, context): bundle = Bundle(owner=user, project=project, name=bundle_name) bundle.save() - messages.success(request, "Bundle %s created" % bundle.name) + messages.success(request, 'Bundle %s created' % bundle.name) elif action == 'add': bundle = get_object_or_404(Bundle, id=data['bundle_id']) elif action == 'remove': diff --git a/patchwork/views/bundle.py b/patchwork/views/bundle.py index 323a1f74..6b7c264a 100644 --- a/patchwork/views/bundle.py +++ b/patchwork/views/bundle.py @@ -157,9 +157,9 @@ def bundle_mbox(request, username, bundlename): return HttpResponseNotFound() response = HttpResponse(content_type='text/plain') - response[ - 'Content-Disposition' - ] = 'attachment; filename=bundle-%d-%s.mbox' % (bundle.id, bundle.name) + response['Content-Disposition'] = ( + 'attachment; filename=bundle-%d-%s.mbox' % (bundle.id, bundle.name) + ) response.write(bundle_to_mbox(bundle)) return response diff --git a/patchwork/views/mail.py b/patchwork/views/mail.py index 8bc3af24..7c864c9c 100644 --- a/patchwork/views/mail.py +++ b/patchwork/views/mail.py @@ -90,7 +90,7 @@ def _optinout(request, action): and EmailOptout.objects.filter(email=email).count() == 0 ): context['error'] = ( - "The email address %s is not on the patchwork " + 'The email address %s is not on the patchwork ' "opt-out list, so you don't need to opt back in" % email ) context['form'] = form diff --git a/patchwork/views/patch.py b/patchwork/views/patch.py index e2c595fb..54cf992c 100644 --- a/patchwork/views/patch.py +++ b/patchwork/views/patch.py @@ -156,7 +156,7 @@ def patch_raw(request, project_id, msgid): project = get_object_or_404(Project, linkname=project_id) patch = get_object_or_404(Patch, project_id=project.id, msgid=db_msgid) - response = HttpResponse(content_type="text/x-patch") + response = HttpResponse(content_type='text/x-patch') response.write(patch.diff) response['Content-Disposition'] = 'attachment; filename=%s.diff' % ( patch.filename diff --git a/patchwork/views/utils.py b/patchwork/views/utils.py index cc8595d6..572854cf 100644 --- a/patchwork/views/utils.py +++ b/patchwork/views/utils.py @@ -53,12 +53,12 @@ def _submission_to_mbox(submission): body = '' if submission.content: - body = submission.content.strip() + "\n" + body = submission.content.strip() + '\n' parts = postscript_re.split(body, 1) if len(parts) == 2: (body, postscript) = parts - body = body.strip() + "\n" + body = body.strip() + '\n' postscript = postscript.rstrip() else: postscript = '' diff --git a/patchwork/views/xmlrpc.py b/patchwork/views/xmlrpc.py index e17d83ea..a936798e 100644 --- a/patchwork/views/xmlrpc.py +++ b/patchwork/views/xmlrpc.py @@ -911,7 +911,7 @@ def check_get(check_id): @xmlrpc_method(login_required=True) def check_create( - user, patch_id, context, state, target_url="", description="" + user, patch_id, context, state, target_url='', description='' ): """Add a Check to a patch. @@ -935,7 +935,7 @@ def check_create( state = state_val break else: - raise Exception("Invalid check state: %s" % state) + raise Exception('Invalid check state: %s' % state) Check.objects.create( patch=patch, context=context,