diff --git a/.github/.kodiak.toml b/.github/.kodiak.toml
index a964fb21f..a5032a5bd 100644
--- a/.github/.kodiak.toml
+++ b/.github/.kodiak.toml
@@ -1,5 +1,6 @@
# This file is maintained in https://github.com/WeblateOrg/meta/
# Configuration for https://kodiakhq.com/
+
version = 1
[merge]
diff --git a/.github/matchers/flake8.json b/.github/matchers/flake8.json
deleted file mode 100644
index ba849aca8..000000000
--- a/.github/matchers/flake8.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "problemMatcher": [
- {
- "owner": "flake8",
- "pattern": [
- {
- "code": 4,
- "column": 3,
- "file": 1,
- "line": 2,
- "message": 5,
- "regexp": "^([^:]*):(\\d+):(\\d+): (\\w+\\d\\d\\d) (.*)$"
- }
- ]
- }
- ]
-}
diff --git a/.github/workflows/flake8.yml b/.github/workflows/ruff.yml
similarity index 71%
rename from .github/workflows/flake8.yml
rename to .github/workflows/ruff.yml
index 4552bc7d5..fb09cca2d 100644
--- a/.github/workflows/flake8.yml
+++ b/.github/workflows/ruff.yml
@@ -1,4 +1,4 @@
-name: Flake8
+name: ruff
on:
push:
@@ -8,8 +8,8 @@ on:
pull_request:
jobs:
- flake8:
- runs-on: ubuntu-20.04
+ ruff:
+ runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
@@ -22,13 +22,11 @@ jobs:
- name: Setup Python
uses: actions/setup-python@v4
with:
- python-version: 3.9
+ python-version: 3.11
- name: Install dependencies
run: |
python -m pip install --upgrade pip wheel
pip install -r requirements-lint.txt
- - name: Run flake8
+ - name: Run ruff
run: |
- echo "::add-matcher::.github/matchers/flake8.json"
- pre-commit run flake8 --all
- echo "::remove-matcher owner=flake8::"
+ pre-commit run ruff --all
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 82c66cb72..2fd66bb50 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -30,25 +30,11 @@ repos:
rev: 23.1.0
hooks:
- id: black
- - repo: https://github.com/PyCQA/flake8
- rev: 5.0.4
+ - repo: https://github.com/charliermarsh/ruff-pre-commit
+ rev: "v0.0.257"
hooks:
- - id: flake8
- additional_dependencies:
- - flake8-bugbear
- - flake8-builtins
- - flake8-comprehensions
- - flake8-django
- - flake8-docstrings
- - flake8-eradicate
- - flake8-executable
- - flake8-logging-format
- - flake8-mutable
- - flake8-polyfill
- - flake8-print
- - flake8-return
- - flake8-self
- - pep8-naming
+ - id: ruff
+ args: [--fix, --exit-non-zero-on-fix]
- repo: https://github.com/asottile/blacken-docs
rev: 1.13.0
hooks:
@@ -57,6 +43,11 @@ repos:
hooks:
- id: check-hooks-apply
- id: check-useless-excludes
+ - repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks
+ rev: v2.8.0
+ hooks:
+ - id: pretty-format-toml
+ args: [--autofix]
- repo: https://github.com/pre-commit/mirrors-prettier
rev: v3.0.0-alpha.6
hooks:
diff --git a/admin/pendingpo.py b/admin/pendingpo.py
index 313619b03..41b6a6bad 100755
--- a/admin/pendingpo.py
+++ b/admin/pendingpo.py
@@ -1,6 +1,5 @@
#!/usr/bin/python
-"""
-Script to automatically merge pending translations from Pootle into po files.
+"""Script to automatically merge pending translations from Pootle into po files.
It only accepts those, which are not translated or fuzzy.
"""
diff --git a/donate/tests.py b/donate/tests.py
index f51d798ff..7eac46250 100644
--- a/donate/tests.py
+++ b/donate/tests.py
@@ -1,5 +1,4 @@
-"""
-This file demonstrates two different styles of tests (one doctest and one
+"""This file demonstrates two different styles of tests (one doctest and one
unittest). These will both pass when you run "manage.py test".
Replace these with more appropriate tests for your application.
@@ -10,9 +9,7 @@
class SimpleTest(TestCase):
def test_basic_addition(self):
- """
- Tests that 1 + 1 always equals 2.
- """
+ """Tests that 1 + 1 always equals 2."""
self.assertEqual(1 + 1, 2)
diff --git a/downloads/management/commands/add_file.py b/downloads/management/commands/add_file.py
index df7082f67..ba6d2e11e 100644
--- a/downloads/management/commands/add_file.py
+++ b/downloads/management/commands/add_file.py
@@ -7,7 +7,7 @@
class Command(BaseCommand):
- help = "adds file to the release"
+ help = "adds file to the release" # noqa: A003
def add_arguments(self, parser):
super().add_arguments(parser)
diff --git a/downloads/migrations/0005_auto_20170317_0930.py b/downloads/migrations/0005_auto_20170317_0930.py
index f661b7c2a..e33da0439 100644
--- a/downloads/migrations/0005_auto_20170317_0930.py
+++ b/downloads/migrations/0005_auto_20170317_0930.py
@@ -14,7 +14,7 @@ def add_sha256(apps, schema_editor):
filename = os.path.join(settings.FILES_ROOT, download.location.lstrip("/"))
if not os.path.exists(filename):
- print(f"File not found: {filename}")
+ print(f"File not found: {filename}") # noqa: T201
continue
with open(filename) as handle:
diff --git a/downloads/models.py b/downloads/models.py
index c2715e4ab..df3bd3961 100644
--- a/downloads/models.py
+++ b/downloads/models.py
@@ -30,8 +30,7 @@
def get_latest_releases(program):
- """
- Returns tuple with last release information for given program.
+ """Returns tuple with last release information for given program.
First is stable, second is testing, which can be None.
"""
releases = Release.objects.filter(program=program)
@@ -57,12 +56,10 @@ def get_program(name):
def get_current_downloads(program):
- """
- Gets list of tuples for currently active downloads. The first one
+ """Gets list of tuples for currently active downloads. The first one
is always present and it's the stable one, the second one is
testing if available.
"""
-
downloads = []
stable_release, testing_release = get_latest_releases(program)
@@ -150,11 +147,10 @@ def get_description(self):
"program": self.get_program(),
"version": self.version,
}
- else:
- return _("%(program)s testing release %(version)s") % {
- "program": self.get_program(),
- "version": self.version,
- }
+ return _("%(program)s testing release %(version)s") % {
+ "program": self.get_program(),
+ "version": self.version,
+ }
def get_program(self):
return get_program(self.program)
diff --git a/downloads/tests.py b/downloads/tests.py
index f51d798ff..7eac46250 100644
--- a/downloads/tests.py
+++ b/downloads/tests.py
@@ -1,5 +1,4 @@
-"""
-This file demonstrates two different styles of tests (one doctest and one
+"""This file demonstrates two different styles of tests (one doctest and one
unittest). These will both pass when you run "manage.py test".
Replace these with more appropriate tests for your application.
@@ -10,9 +9,7 @@
class SimpleTest(TestCase):
def test_basic_addition(self):
- """
- Tests that 1 + 1 always equals 2.
- """
+ """Tests that 1 + 1 always equals 2."""
self.assertEqual(1 + 1, 2)
diff --git a/downloads/views.py b/downloads/views.py
index 3b3f19255..463f34ac8 100644
--- a/downloads/views.py
+++ b/downloads/views.py
@@ -106,9 +106,7 @@ def pad(request, program):
def padmap(request):
- """
- Public list of PAD files.
- """
+ """Public list of PAD files."""
response = HttpResponse(content_type="text/plain")
response.write("https://wammu.eu/api/pad/gammu.xml\n")
response.write("https://wammu.eu/api/pad/wammu.xml\n")
diff --git a/links/tests.py b/links/tests.py
index f51d798ff..7eac46250 100644
--- a/links/tests.py
+++ b/links/tests.py
@@ -1,5 +1,4 @@
-"""
-This file demonstrates two different styles of tests (one doctest and one
+"""This file demonstrates two different styles of tests (one doctest and one
unittest). These will both pass when you run "manage.py test".
Replace these with more appropriate tests for your application.
@@ -10,9 +9,7 @@
class SimpleTest(TestCase):
def test_basic_addition(self):
- """
- Tests that 1 + 1 always equals 2.
- """
+ """Tests that 1 + 1 always equals 2."""
self.assertEqual(1 + 1, 2)
diff --git a/news/feeds.py b/news/feeds.py
index aedc89b85..556ccdba2 100644
--- a/news/feeds.py
+++ b/news/feeds.py
@@ -8,7 +8,7 @@
class RssNewsFeed(Feed):
link = "/news/"
- copyright = "Copyright © 2003 - 2021 Michal Čihař"
+ copyright = "Copyright © Michal Čihař" # noqa: A003
item_copyright = copyright
title_template = "feeds/news_title.html"
description_template = "feeds/news_description.html"
diff --git a/news/models.py b/news/models.py
index 36787f852..ac97597b6 100644
--- a/news/models.py
+++ b/news/models.py
@@ -7,10 +7,7 @@
class Category(models.Model):
- """
- A category that an entry can belong to.
-
- """
+ """A category that an entry can belong to."""
title = models.CharField(max_length=250)
slug = models.SlugField(
diff --git a/news/tests.py b/news/tests.py
index f51d798ff..7eac46250 100644
--- a/news/tests.py
+++ b/news/tests.py
@@ -1,5 +1,4 @@
-"""
-This file demonstrates two different styles of tests (one doctest and one
+"""This file demonstrates two different styles of tests (one doctest and one
unittest). These will both pass when you run "manage.py test".
Replace these with more appropriate tests for your application.
@@ -10,9 +9,7 @@
class SimpleTest(TestCase):
def test_basic_addition(self):
- """
- Tests that 1 + 1 always equals 2.
- """
+ """Tests that 1 + 1 always equals 2."""
self.assertEqual(1 + 1, 2)
diff --git a/phonedb/feeds.py b/phonedb/feeds.py
index df598e5f6..b72215bde 100644
--- a/phonedb/feeds.py
+++ b/phonedb/feeds.py
@@ -8,7 +8,7 @@
class RssPhonesFeed(Feed):
link = "/phones/"
- copyright = "Copyright © 2003 - 2021 Michal Čihař"
+ copyright = "Copyright © Michal Čihař" # noqa: A003
item_copyright = copyright
title_template = "feeds/phones_title.html"
description_template = "feeds/phones_description.html"
diff --git a/phonedb/management/commands/update_charts_url.py b/phonedb/management/commands/update_charts_url.py
index 785b3e8ff..5744b4e59 100644
--- a/phonedb/management/commands/update_charts_url.py
+++ b/phonedb/management/commands/update_charts_url.py
@@ -4,7 +4,7 @@
class Command(BaseCommand):
- help = "updates chart URL"
+ help = "updates chart URL" # noqa: A003
def handle(self, *args, **options):
get_chart_url(force=True)
diff --git a/phonedb/models.py b/phonedb/models.py
index ddf822a80..20f422b2c 100644
--- a/phonedb/models.py
+++ b/phonedb/models.py
@@ -200,15 +200,14 @@ def get_absolute_url(self):
def get_author_email(self):
if self.author_email == "":
return None
- elif self.email_garble == "hide":
+ if self.email_garble == "hide":
return None
- elif self.email_garble == "none":
+ if self.email_garble == "none":
return self.author_email
- elif self.email_garble == "atdot":
+ if self.email_garble == "atdot":
return self.author_email.replace("@", "[at]").replace(".", "[dot]")
- else:
- pos = random.randint(0, len(self.author_email))
- return self.author_email[:pos] + "NOSPAM" + self.author_email[pos:]
+ pos = random.randint(0, len(self.author_email))
+ return self.author_email[:pos] + "NOSPAM" + self.author_email[pos:]
def get_author_name(self):
if self.author_name == "":
@@ -229,7 +228,6 @@ def get_author(self, html=True):
if html:
return f'{name}'
- else:
- if mail == name:
- return mail
- return f"{name} ({mail})"
+ if mail == name:
+ return mail
+ return f"{name} ({mail})"
diff --git a/phonedb/views.py b/phonedb/views.py
index 1eebc77c8..02e1c09d7 100644
--- a/phonedb/views.py
+++ b/phonedb/views.py
@@ -302,19 +302,19 @@ def vendor(request, vendorname):
def phone_redirect(request):
try:
pk = int(request.GET["id"])
- except Exception:
- raise Http404("No such entry!")
+ except Exception as error:
+ raise Http404("No such entry!") from error
phone = get_object_or_404(Phone, pk=pk)
return HttpResponseRedirect(phone.get_absolute_url())
-def phone(request, vendorname, id):
- id = int(id)
+def phone(request, vendorname, pk):
+ pk = int(pk)
vendor = get_object_or_404(Vendor, slug=vendorname)
- phone = get_object_or_404(Phone, id=id, vendor=vendor)
+ phone = get_object_or_404(Phone, pk=pk, vendor=vendor)
related = (
Phone.objects.filter(vendor=vendor, name__icontains=phone.name)
- .exclude(id=id)
+ .exclude(pk=pk)
.exclude(state="deleted")
.prefetch_related("vendor", "features", "connection")
)
@@ -332,10 +332,10 @@ def phone(request, vendorname, id):
@login_required
-def approve(request, vendorname, id):
- id = int(id)
+def approve(request, vendorname, pk):
+ pk = int(pk)
vendor = get_object_or_404(Vendor, slug=vendorname)
- phone = get_object_or_404(Phone, id=id, vendor=vendor)
+ phone = get_object_or_404(Phone, pk=pk, vendor=vendor)
if not request.user.is_superuser:
return HttpResponseRedirect(phone.get_absolute_url())
@@ -346,10 +346,10 @@ def approve(request, vendorname, id):
@login_required
-def delete(request, vendorname, id):
- id = int(id)
+def delete(request, vendorname, pk):
+ pk = int(pk)
vendor = get_object_or_404(Vendor, slug=vendorname)
- phone = get_object_or_404(Phone, id=id, vendor=vendor)
+ phone = get_object_or_404(Phone, pk=pk, vendor=vendor)
if not request.user.is_superuser:
return HttpResponseRedirect(phone.get_absolute_url())
@@ -367,7 +367,7 @@ def phones_csv(request):
writer = csv.writer(response)
phones = (
Phone.objects.exclude(state="deleted")
- .order_by("id")
+ .order_by("pk")
.prefetch_related("vendor", "features", "connection")
)
writer.writerow(
@@ -412,9 +412,7 @@ def phones_csv(request):
@csrf_exempt
def create_wammu(request): # noqa: C901
- """
- Compatibility interface for Wammu.
- """
+ """Compatibility interface for Wammu."""
invalid = []
version = 1
response = HttpResponse(content_type="text/plain")
@@ -500,9 +498,9 @@ def create_wammu(request): # noqa: C901
phone.features.add(feature)
if version == 2:
- response.write(OKAY_V2 % (phone.id, phone.get_absolute_url()))
+ response.write(OKAY_V2 % (phone.pk, phone.get_absolute_url()))
else:
- response.write(OKAY % (phone.id, phone.vendor.slug, phone.id))
+ response.write(OKAY % (phone.pk, phone.vendor.slug, phone.pk))
return response
@@ -558,7 +556,7 @@ def create(request, vendorname=None): # noqa: C901
vendor = Vendor.objects.get(slug=vendorname)
else:
vendor = Vendor.objects.get(slug=request.GET["vendor"])
- initial["vendor"] = vendor.id
+ initial["vendor"] = vendor.pk
except Exception:
pass
try:
diff --git a/screenshots/models.py b/screenshots/models.py
index 837827439..439f7cba5 100644
--- a/screenshots/models.py
+++ b/screenshots/models.py
@@ -6,10 +6,7 @@
class Category(models.Model):
- """
- A category that an entry can belong to.
-
- """
+ """A category that an entry can belong to."""
title = models.CharField(max_length=250)
slug = models.SlugField(
diff --git a/screenshots/tests.py b/screenshots/tests.py
index f51d798ff..7eac46250 100644
--- a/screenshots/tests.py
+++ b/screenshots/tests.py
@@ -1,5 +1,4 @@
-"""
-This file demonstrates two different styles of tests (one doctest and one
+"""This file demonstrates two different styles of tests (one doctest and one
unittest). These will both pass when you run "manage.py test".
Replace these with more appropriate tests for your application.
@@ -10,9 +9,7 @@
class SimpleTest(TestCase):
def test_basic_addition(self):
- """
- Tests that 1 + 1 always equals 2.
- """
+ """Tests that 1 + 1 always equals 2."""
self.assertEqual(1 + 1, 2)
diff --git a/screenshots/thumbs.py b/screenshots/thumbs.py
index 8c11e173d..72b2286af 100644
--- a/screenshots/thumbs.py
+++ b/screenshots/thumbs.py
@@ -1,6 +1,5 @@
-"""
-django-thumbs by Antonio Melé
-http://django.es
+"""django-thumbs by Antonio Melé
+http://django.es.
"""
from io import BytesIO
@@ -10,11 +9,11 @@
from PIL import Image
-def generate_thumb(img, thumb_size, format):
- """
- Generates a thumbnail image and returns a ContentFile object with the thumbnail
+def generate_thumb(img, thumb_size, format): # noqa: D417, A002
+ """Generates a thumbnail image and returns a ContentFile object with the thumbnail.
- Parameters:
+ Parameters
+ ----------
===========
img File object
@@ -23,7 +22,6 @@ def generate_thumb(img, thumb_size, format):
format format of the original image ('jpeg','gif','png',...)
(this format will be used for the generated thumbnail, too)
"""
-
img.seek(0) # see http://code.djangoproject.com/ticket/8222 for details
image = Image.open(img)
@@ -56,16 +54,14 @@ def generate_thumb(img, thumb_size, format):
io = BytesIO()
# PNG and GIF are the same, JPG is JPEG
if format.upper() == "JPG":
- format = "JPEG"
+ format = "JPEG" # noqa: A001
image2.save(io, format)
return ContentFile(io.getvalue())
class ImageWithThumbsFieldFile(ImageFieldFile):
- """
- See ImageWithThumbsField for usage example
- """
+ """See ImageWithThumbsField for usage example."""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
@@ -75,10 +71,8 @@ def __init__(self, *args, **kwargs):
def get_size(self, size):
if not self:
return ""
- else:
- split = self.url.rsplit(".", 1)
- thumb_url = f"{split[0]}.{w}x{h}.{split[1]}"
- return thumb_url
+ split = self.url.rsplit(".", 1)
+ return f"{split[0]}.{w}x{h}.{split[1]}"
for size in self.field.sizes:
(w, h) = size
@@ -116,10 +110,9 @@ def delete(self, save=True):
class ImageWithThumbsField(ImageField):
- """
- Usage example:
+ """Usage example:
==============
- photo = ImageWithThumbsField(upload_to='images', sizes=((125,125),(300,200),)
+ photo = ImageWithThumbsField(upload_to='images', sizes=((125,125),(300,200),).
To retrieve image URL, exactly the same way as with ImageField:
my_object.photo.url
diff --git a/setup.cfg b/setup.cfg
deleted file mode 100644
index 1be246fd8..000000000
--- a/setup.cfg
+++ /dev/null
@@ -1,31 +0,0 @@
-[isort]
-multi_line_output = 3
-include_trailing_comma = True
-force_grid_wrap = 0
-use_parentheses = True
-line_length = 88
-
-[flake8]
-max-complexity = 16
-select = E,W1,W2,W3,W504,W505,W6,B
-enable-extensions = B,C,D,DJ,F,G,I,M,N,R,SF,T,UPS
-# Should be fixed:
-# D10 - we are missing many docstrings
-# D20 - bad formatting of many docstrings
-# D40 - bad formatting of many docstrings
-# D401 - many strings need rephrasing
-# DJ04 - use underscores in URLs
-# DJ05 - namespace in URLs include
-# DJ12 - method ordering
-# E501 - line too long
-# DJ01 - null on text fields
-# DJ10,DJ11 - missing verbose names
-# False positives:
-# R504 - see https://github.com/Afonasev/flake8-return/issues/3
-# SF01 - see https://github.com/Korijn/flake8-self/issues/3
-# E203 - see https://github.com/psf/black/issues/315
-ignore = E203,DJ04,DJ05,R504,D10,D401,SF01,DJ12,E501,D20,DJ01,D40,DJ10,DJ11
-max-line-length = 88
-
-per-file-ignores =
- downloads/migrations/0005_auto_20170317_0930.py:T201
diff --git a/tools/templatetags/encoding.py b/tools/templatetags/encoding.py
index f4d81877d..f88720fce 100644
--- a/tools/templatetags/encoding.py
+++ b/tools/templatetags/encoding.py
@@ -9,7 +9,7 @@
@register.filter
@stringfilter
-def hex(value):
+def hex(value): # noqa: A001
return value.encode("hex")
diff --git a/urls.py b/urls.py
index 25d186ac5..0580c9608 100644
--- a/urls.py
+++ b/urls.py
@@ -208,15 +208,15 @@ def priority(self, item):
r"^phones/(?P[^/]+)/$", phonedb.views.vendor, name="phonedb-vendor"
),
re_path(
- r"^phones/(?P[^/]+)/(?P[0-9]+)/$",
+ r"^phones/(?P[^/]+)/(?P[0-9]+)/$",
phonedb.views.phone,
name="phonedb-phone",
),
re_path(
- r"^phones/(?P[^/]+)/(?P[0-9]+)/delete/$", phonedb.views.delete
+ r"^phones/(?P[^/]+)/(?P[0-9]+)/delete/$", phonedb.views.delete
),
re_path(
- r"^phones/(?P[^/]+)/(?P[0-9]+)/approve/$", phonedb.views.approve
+ r"^phones/(?P[^/]+)/(?P[0-9]+)/approve/$", phonedb.views.approve
),
re_path(r"^phones/(?P[^/]+)/new/$", phonedb.views.create),
# API for Wammu
@@ -287,7 +287,7 @@ def priority(self, item):
RedirectView.as_view(url="/%(link)s", permanent=True),
),
re_path(
- r"^(?Pphones/(?P[^/]+)/(?P[0-9]+)/),.*",
+ r"^(?Pphones/(?P[^/]+)/(?P[0-9]+)/),.*",
RedirectView.as_view(url="/%(link)s", permanent=True),
),
re_path(r"^snapshot/$", RedirectView.as_view(url="/download/", permanent=True)),
diff --git a/wammu/helpers.py b/wammu/helpers.py
index af21c61dc..f2e023704 100644
--- a/wammu/helpers.py
+++ b/wammu/helpers.py
@@ -7,9 +7,7 @@
def process_bug_links(text):
- """
- Makes links in form bug #123 clickable to bugs.cihar.com.
- """
+ """Makes links in form bug #123 clickable to bugs.cihar.com."""
text = LP_RE.sub(r"[\1](https://bugs.launchpad.net/bugs/\2)", text)
text = BDO_RE.sub(r"[\1](https://bugs.debian.org/\2)", text)
text = ISSUE_RE.sub(r"[\1](https://github.com/gammu/gammu/\2)", text)
diff --git a/wammu/middleware.py b/wammu/middleware.py
index 5971cd2ff..e9bdbbacc 100644
--- a/wammu/middleware.py
+++ b/wammu/middleware.py
@@ -13,12 +13,7 @@ def __call__(self, request):
self.process_request(request)
- response = self.get_response(request)
-
- # Code to be executed for each request/response after
- # the view is called.
-
- return response
+ return self.get_response(request)
def process_request(self, request):
try:
diff --git a/wammu/tests.py b/wammu/tests.py
index 9c0729ab5..3ad37dfe8 100644
--- a/wammu/tests.py
+++ b/wammu/tests.py
@@ -1,6 +1,4 @@
-"""
-Tests for sitemaps.
-"""
+"""Tests for sitemaps."""
from xml.etree import ElementTree as ElementTree
diff --git a/wammu/views.py b/wammu/views.py
index 858e8910d..bdbdacef4 100644
--- a/wammu/views.py
+++ b/wammu/views.py
@@ -8,8 +8,7 @@
def process_version_feedback(request):
- """
- Handles feedback from Wammu, which includes version URL parameter. Return
+ """Handles feedback from Wammu, which includes version URL parameter. Return
value is dictionary to be fed to rendering context.
"""
result = {"feedback": False}
diff --git a/wsgi.py b/wsgi.py
index 976491b81..91857a9ed 100644
--- a/wsgi.py
+++ b/wsgi.py
@@ -1,5 +1,4 @@
-"""
-WSGI config for Gamu website project.
+"""WSGI config for Gamu website project.
It exposes the WSGI callable as a module-level variable named ``application``.