A plugin to show lint errors for IW
Project description
flake8-iw
Linters for some common issues we encounter.
Building
Run command to build wheel and tarball.
python3 -m build
twine upload dist/*
IW01: Use of patch
Lint check to prevent the use of patch
directly.
Recommendation: Use PatchingTestCase
/ PatchingTransactionTestCase
instead
Correct
from instawork.tests import PatchingTestCase
class SignUpUpdatedTests(PatchingTestCase):
def setUp(self):
self.mock_call = self.patch("apps.auth.signals.task_send_email.delay")
def test_email(self):
expect(self.mock_call).to(have_been_called_once)
def test_sms(self):
mock_sms = self.patch("apps.auth.signals.task_send_sms.delay")
expect(mock_sms).to(have_been_called_once)
Wrong
from unittest.mock import patch
class SignUpUpdatedTests(TestCase):
def setUp(self):
self.patcher = patch("apps.auth.signals.task_send_email.delay")
self.mock_email = self.patcher.start()
def tearDown(self):
self.patcher.stop()
def test_email(self):
...
expect(self.mock_email).to(have_been_called_once)
@patch("apps.auth.signals.task_send_sms.delay")
def test_sms(self, mock_sms):
...
expect(mock_sms).to(have_been_called_once)
IW02: Use of patch for time freeze
Lint check to prevent the use of patch
to freeze time.
Recommendation: Use freeze_time
from PatchingTestCase
/ PatchingTransactionTestCase
or use freeze_time
decorator or context manager from freezegun
package.
Correct
from django.utils import timezone
from instawork.tests import PatchingTestCase
class UserFeatureViewTests(PatchingTestCase):
def setUp(self):
self.now = timezone.now()
def test_feature_view(self):
ufv = None
# Option 1
with freeze_time(self.now):
ufv = UserFeatureView.objects.get_or_create(
user=self.shift.worker, feature=UserFeatureView.FEATURE_1
)
# Option 2
self.freeze_time(self.now)
ufv = UserFeatureView.objects.get_or_create(
user=self.shift.worker, feature=UserFeatureView.FEATURE_1
)
...
expect(ufv.date_created).to(equal(self.now))
Wrong
from django.utils import timezone
from instawork.tests import PatchingTestCase
class UserFeatureViewTests(PatchingTestCase):
def setUp(self):
self.now = timezone.now()
self.mock_call = self.patch("django.utils.timezone.now", return_value=self.now)
def test_feature_view(self):
ufv = UserFeatureView.objects.get_or_create(
user=self.shift.worker, feature=UserFeatureView.FEATURE_1
)
...
expect(ufv.date_created).to(equal(self.now))
IW03: Error logging without exception info (exc_info)
Lint check to prevent error logging without exception info.
Recommendation: Add exc_info=True
keyword argument in logger.error()
Correct
import logging
custom_logger = logging.getLogger("module.logger")
class UserFeatureView(Model):
def save(self):
try:
...
except ValueError as e:
custom_logger.error(e, exc_info=True)
return name
Wrong
import logging
custom_logger = logging.getLogger("module.logger")
class UserFeatureView(Model):
def save(self):
try:
...
except ValueError as e:
custom_logger.error(e)
return name
IW04: Use of datetime.now
Lint to avoid usage of datetime.now()
which does not contain timezone information and causes various warnings in tests. Use timezone.now()
instead.
Correct
from django.utils import timezone
now = timezone.now()
Wrong
from datetime import datetime
now = datetime.now()
IW05: Use of datetime.replace(tzinfo=XXX)
Lint to avoid usage of datetime.replace(tzinfo=XXX)
which is not a viable way of setting timezones with python/pytz.
Correct
import pytz
from django.utils import timezone
tz = pytz.timezone("America/Los_Angeles")
now_pt = timezone.now().astimezone(tz)
Wrong
import pytz
from django.utils import timezone
tz = pytz.timezone("America/Los_Angeles")
now_pt = timezone.now().replace(tzinfo=tz)
IW06: Use of bulk_update/bulk_create without batch_size
Lint to avoid usage of Model.objects.bulk_update / Model.objects.bulk_create. Use Model.objects.bulk_update(batch_size=X)
/ Model.objects.bulk_create(batch_size=X)
instead.
Correct
# Bulk update
Model.objects.bulk_update([obj1, obj2, ...], batch_size=10)
# Bulk create
Model.objects.bulk_create([obj1, obj2, ...], batch_size=10)
Wrong
# Bulk update
Model.objects.bulk_update([obj1, obj2, ...])
# Bulk create
Model.objects.bulk_create([obj1, obj2, ...])
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file flake8_iw-0.0.15.tar.gz
.
File metadata
- Download URL: flake8_iw-0.0.15.tar.gz
- Upload date:
- Size: 7.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.9.15
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | bb1be92684718dc59de702d1c0f8c68467bbedf4b6f7c81829aef34c5241d243 |
|
MD5 | 29410668d637faaf85a149f7679023fd |
|
BLAKE2b-256 | 270e9b09e780b2c41bd33ebde36c0a19c4b0b6f081122d80ed2a5e8c1c06900f |
File details
Details for the file flake8_iw-0.0.15-py2.py3-none-any.whl
.
File metadata
- Download URL: flake8_iw-0.0.15-py2.py3-none-any.whl
- Upload date:
- Size: 8.3 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.9.15
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6b4d3667effef1602230b1b1ed42447ea974c90128fe26419d993fd7ecb95ab9 |
|
MD5 | d540a0f95e78032075f6b0cf59199218 |
|
BLAKE2b-256 | 52a0dfee61f7f69d0494327a39417b193d7236c144488eeadb2dbc675025d964 |