Skip to content

Commit adae5e6

Browse files
committed
Create basic ruff linter configuration
1 parent 980aaa2 commit adae5e6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+204
-222
lines changed

.github/workflows/ruff.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
name: Ruff
2+
3+
on:
4+
push:
5+
branches:
6+
- "*"
7+
pull_request:
8+
workflow_dispatch:
9+
10+
jobs:
11+
ruff:
12+
runs-on: ubuntu-latest
13+
steps:
14+
- uses: actions/checkout@v3
15+
- uses: chartboost/ruff-action@v1
16+
with:
17+
src: "./oioioi"
18+
version: 0.0.265

oioioi/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
# apply monkey patch
2-
from oioioi.contests import current_contest
2+
from oioioi.contests import current_contest # noqa

oioioi/base/forms.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,19 @@
77
from django.contrib.auth import get_user_model
88
from django.contrib.auth.forms import (
99
PasswordResetForm,
10-
UserChangeForm,
1110
UserCreationForm,
1211
)
1312
from django.contrib.auth.models import User
1413
from django.core.validators import RegexValidator
1514
from django.forms import BooleanField, ChoiceField
16-
from django.forms import ChoiceField
1715
from django.utils.translation import gettext_lazy as _
1816
from registration.forms import RegistrationForm
1917

2018
from oioioi.base.models import Consents, PreferencesSaved
21-
from oioioi.base.preferences import PreferencesFactory, ensure_preferences_exist_for_user
19+
from oioioi.base.preferences import (
20+
PreferencesFactory,
21+
ensure_preferences_exist_for_user,
22+
)
2223
from oioioi.base.utils.user import UNICODE_CATEGORY_LIST, USERNAME_REGEX
2324
from oioioi.base.utils.validators import UnicodeValidator, ValidationError
2425

@@ -68,6 +69,7 @@ def _maybe_add_field(label, *args, **kwargs):
6869
kwargs.setdefault('label', label)
6970
PreferencesFactory.add_field(*args, **kwargs)
7071

72+
7173
def adjust_preferences_factory_fields():
7274
choices_not_translated = [("", "None")] + list(settings.LANGUAGES)
7375
choices = [(k, _(v)) for k, v in choices_not_translated]
@@ -84,7 +86,7 @@ def handle_preferred_language(user):
8486
lambda name, user: handle_preferred_language(user),
8587
label=_("Preferred language"),
8688
choices=choices,
87-
required=False
89+
required=False,
8890
)
8991

9092
def handle_enable_editor(user):
@@ -100,9 +102,10 @@ def handle_enable_editor(user):
100102
lambda name, user: handle_enable_editor(user),
101103
label=_("Enable editor"),
102104
order=0,
103-
required=False
105+
required=False,
104106
)
105107

108+
106109
def handle_new_preference_fields(request, user):
107110
changed = False
108111
ensure_preferences_exist_for_user(user)
@@ -127,6 +130,7 @@ def handle_new_preference_fields(request, user):
127130
if changed:
128131
user.userpreferences.save()
129132

133+
130134
_maybe_add_field(
131135
settings.REGISTRATION_RULES_CONSENT,
132136
'terms_accepted',
@@ -153,6 +157,7 @@ def handle_new_preference_fields(request, user):
153157

154158
adjust_preferences_factory_fields()
155159

160+
156161
def save_consents(sender, user, **kwargs):
157162
form = sender
158163
consents = None
@@ -232,14 +237,14 @@ def save(self, *args, **kwargs):
232237
PreferencesSaved.send(self, user=instance)
233238
return instance
234239

240+
235241
class UserChangeForm(UserForm):
236242
confirm_password = forms.CharField(widget=forms.PasswordInput(), required=False)
237243

238244
class Media(object):
239245
js = ('js/email-change.js',)
240246

241-
def __init__(self, *args, **kwargs):
242-
247+
def __init__(self, *args, **kwargs):
243248
super(UserChangeForm, self).__init__(*args, **kwargs)
244249
self.user = kwargs.pop('instance', None)
245250

@@ -253,7 +258,10 @@ def clean_confirm_password(self):
253258
return confirm_password
254259

255260
if not self.user.check_password(confirm_password):
256-
raise forms.ValidationError(_("Password incorrect."), code='password_incorrect', )
261+
raise forms.ValidationError(
262+
_("Password incorrect."),
263+
code='password_incorrect',
264+
)
257265
return confirm_password
258266

259267

oioioi/base/models.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
# pylint: disable=unused-import
88
# Important. This import is to register signal handlers. Do not remove it.
9-
import oioioi.base.signal_handlers
9+
import oioioi.base.signal_handlers # noqa: F401
1010
from oioioi.base.captcha_check import captcha_check
1111
from oioioi.base.setup_check import setup_check
1212

@@ -60,7 +60,7 @@ class UserPreferences(models.Model):
6060
_("preferred_language"),
6161
max_length=2,
6262
choices=list(settings.LANGUAGES) + [("", _("None"))],
63-
default=""
63+
default="",
6464
)
6565

6666
enable_editor = models.BooleanField(

oioioi/base/registration_backend.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import logging
22

3-
import registration.backends.default.urls
4-
import registration.views
3+
import registration.backends.default.urls as default_urls
54
from django.conf import settings
65
from django.contrib.auth.models import User
7-
from django.contrib.auth.views import PasswordResetView, PasswordResetDoneView
6+
from django.contrib.auth.views import PasswordResetView
87
from django.contrib.sites.requests import RequestSite
98
from django.urls import re_path, reverse_lazy
109
from django.views.generic import TemplateView
@@ -89,4 +88,4 @@ def register(self, form):
8988
),
9089
]
9190

92-
urlpatterns += registration.backends.default.urls.urlpatterns
91+
urlpatterns += default_urls.urlpatterns

oioioi/base/signal_handlers.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import django
21
from django.contrib.auth.signals import user_logged_in
32
from django.db.backends.signals import connection_created
43
from django.dispatch import receiver

oioioi/base/tests/__init__.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,10 @@
44

55
import pytest
66
import urllib.parse
7-
from django.contrib.auth.models import AnonymousUser, User
7+
from django.contrib.auth.models import User
88
from django.core.cache import cache
99
from django.core.exceptions import ImproperlyConfigured
1010
from django.db import DEFAULT_DB_ALIAS, connections
11-
from django.template.loaders.cached import Loader as CachedLoader
1211
from django.test import TestCase as DjangoTestCase
1312
from django.test.utils import CaptureQueriesContext
1413
from django.urls import reverse
@@ -42,7 +41,6 @@ def __exit__(self, exc_type, exc_value, traceback):
4241

4342

4443
class TestCase(DjangoTestCase):
45-
4644
# Based on: https://github.com/revsys/django-test-plus/blob/master/test_plus/test.py#L236
4745
def assertNumQueriesLessThan(self, num, *args, **kwargs):
4846
func = kwargs.pop('func', None)

oioioi/base/tests/tests.py

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -723,7 +723,7 @@ def test_registration_form_fields(self):
723723
self.assertIn('last_name', form.fields)
724724

725725
def _register_user(self, terms_accepted=True, pass_captcha=True):
726-
response = self.client.get(reverse('registration_register'))
726+
self.client.get(reverse('registration_register'))
727727
captcha_count = CaptchaStore.objects.count()
728728
self.assertEqual(captcha_count, 1)
729729
captcha = CaptchaStore.objects.all()[0]
@@ -778,7 +778,6 @@ def test_registration_captcha_not_passed(self):
778778
self.assertEqual(User.objects.filter(username='test_foo').count(), 0)
779779

780780

781-
782781
class TestArchive(TestCase):
783782
good_files = ['archive.tgz', 'archive.zip']
784783
bad_files = ['archive-with-symlink.tgz', 'archive-with-hardlink.tgz']
@@ -884,7 +883,7 @@ def test_edit_profile_view(self):
884883
self.assertEqual(user.last_name, 'ln')
885884

886885
def test_edit_email(self):
887-
#Trying to use incorrect email.
886+
# Trying to use incorrect email.
888887
self.data['email'] = 'a@a'
889888
self.data['first_name'] = 'fn_new'
890889
self.data['last_name'] = 'ln_new'
@@ -905,7 +904,6 @@ def test_edit_email(self):
905904
self.assertEqual(self.user.first_name, self.first_name)
906905
self.assertEqual(self.user.last_name, self.last_name)
907906

908-
909907
# Trying to change email with wrong password.
910908
self.data['confirm_password'] = 'not-the-password'
911909
response = self.client.post(self.url_edit_profile, self.data, follow=True)
@@ -940,7 +938,6 @@ def test_terms_not_accepted(self):
940938
# and that the user sees an error
941939
self.assertContains(response, 'field is required')
942940

943-
944941
self.data.pop('terms_accepted')
945942
response = self.client.post(self.url_edit_profile, self.data, follow=True)
946943
self.assertEqual(response.status_code, 200)
@@ -978,8 +975,8 @@ def test_unicode_wrong_last_name(self):
978975
self.assertEqual(self.user.last_name, self.last_name)
979976

980977
def test_names_with_valid_spaces(self):
981-
self.data['first_name'] = u'Jan Maria',
982-
self.data['last_name'] = u'Le Guien',
978+
self.data['first_name'] = (u'Jan Maria',)
979+
self.data['last_name'] = (u'Le Guien',)
983980
response = self.client.post(self.url_edit_profile, self.data, follow=True)
984981
self.assertEqual(response.status_code, 200)
985982
self.user.refresh_from_db()
@@ -1032,12 +1029,14 @@ def callback_func(sender, **kwargs):
10321029
for text in ['Doggy', 'Andrzej', '72', 'The answer to everything']:
10331030
self.assertContains(response, text)
10341031

1035-
self.data.update({
1036-
'first_name': 'fn',
1037-
'last_name': 'ln',
1038-
'dog': 'Janusz',
1039-
'answer': '42',
1040-
})
1032+
self.data.update(
1033+
{
1034+
'first_name': 'fn',
1035+
'last_name': 'ln',
1036+
'dog': 'Janusz',
1037+
'answer': '42',
1038+
}
1039+
)
10411040

10421041
self.client.post(self.url_edit_profile, self.data, follow=True)
10431042
# callback_func should be called already
@@ -1242,7 +1241,11 @@ def test_can_change_login_from_invalid(self):
12421241

12431242
self.client.post(
12441243
self.url_edit_profile,
1245-
{'username': 'valid_user', 'terms_accepted': True, 'email': "[email protected]"},
1244+
{
1245+
'username': 'valid_user',
1246+
'terms_accepted': True,
1247+
'email': "[email protected]",
1248+
},
12461249
follow=True,
12471250
)
12481251
self.assertEqual(self.user.username, l)
@@ -1395,7 +1398,7 @@ def test_strip_num_or_hash(self):
13951398
'a_1_2.pdf': 'a_1.pdf',
13961399
}
13971400

1398-
for (before, after) in cases.items():
1401+
for before, after in cases.items():
13991402
self.assertEqual(strip_num_or_hash(before), after)
14001403

14011404

@@ -1461,7 +1464,6 @@ def test_api_token_regeneration(self):
14611464

14621465

14631466
class TestDocsEndpoints(APITestCase):
1464-
14651467
def test_docs(self):
14661468
response = self.client.get('/api/docs', follow=True)
14671469
self.assertContains(response, "OIOIOI API")
@@ -1508,15 +1510,16 @@ class TestPasswordReset(TestCase):
15081510
fixtures = ['test_users']
15091511

15101512
def setUp(self):
1511-
self.user = User.objects.create_user('test_email_user', '[email protected]', 'test1234')
1513+
self.user = User.objects.create_user(
1514+
'test_email_user', '[email protected]', 'test1234'
1515+
)
15121516

15131517
def test_reset_password_email_send_existing(self):
1514-
response = self.client.post(reverse('auth_password_reset'), data={'email': self.user.email})
1515-
self.assertEqual(len(mail.outbox), 1)
1516-
self.assertRedirects(
1517-
response,
1518-
reverse('auth_password_reset_done')
1518+
response = self.client.post(
1519+
reverse('auth_password_reset'), data={'email': self.user.email}
15191520
)
1521+
self.assertEqual(len(mail.outbox), 1)
1522+
self.assertRedirects(response, reverse('auth_password_reset_done'))
15201523

15211524

15221525
class TestAccountDeletion(TestCase):
@@ -1551,7 +1554,6 @@ def test_account_deletion_no_password(self):
15511554

15521555

15531556
class TestJsCatalog(TestCase):
1554-
15551557
def test_javascript_catalog(self):
15561558
response = self.client.get(reverse('javascript_catalog'))
15571559
self.assertContains(response, 'jsi18n_initialized')

oioioi/base/utils/__init__.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@
1414
import urllib.parse
1515
from django.forms.utils import flatatt
1616
from django.http import Http404, HttpResponse, HttpResponseRedirect
17-
from django.shortcuts import render
18-
from django.template import Template
1917
from django.template.loader import render_to_string
2018
from django.template.response import TemplateResponse
2119
from django.utils.encoding import force_str
@@ -438,9 +436,7 @@ def tabbed_view(request, template, context, tabs, tab_kwargs, link_builder):
438436
raise Http404
439437
qs = request.GET.dict()
440438
qs['key'] = next(iter(tabs)).key
441-
return HttpResponseRedirect(
442-
request.path + '?' + urllib.parse.urlencode(qs)
443-
)
439+
return HttpResponseRedirect(request.path + '?' + urllib.parse.urlencode(qs))
444440
key = request.GET['key']
445441
for tab in tabs:
446442
if tab.key == key:

oioioi/base/utils/archive.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
# THE SOFTWARE.
2323

2424
import os
25-
import sys
2625
import tarfile
2726
import tempfile
2827
import zipfile
@@ -77,11 +76,7 @@ def __del__(self):
7776

7877
@staticmethod
7978
def _resolve_streamed_files(file, ext):
80-
if (
81-
isinstance(file, str)
82-
or hasattr(file, 'seek')
83-
or hasattr(file, 'tell')
84-
):
79+
if isinstance(file, str) or hasattr(file, 'seek') or hasattr(file, 'tell'):
8580
return file, False
8681
lookup_filename = file.name + ext
8782
base, tail_ext = os.path.splitext(lookup_filename.lower())

0 commit comments

Comments
 (0)