Skip to content

Commit a712537

Browse files
committed
[TASK] Add linting/black/isort/pytest
1 parent 47cf678 commit a712537

18 files changed

+242
-98
lines changed

.github/workflows/main.yml

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches: [master]
6+
pull_request:
7+
branches: [master]
8+
9+
jobs:
10+
test:
11+
runs-on: ubuntu-latest
12+
strategy:
13+
matrix:
14+
python-version: [ "3.6", "3.7", "3.8", "3.9" ]
15+
steps:
16+
- uses: actions/checkout@v2
17+
- name: Set up Python ${{ matrix.python-version }}
18+
uses: actions/setup-python@v2
19+
with:
20+
python-version: ${{ matrix.python-version }}
21+
- name: Install dependencies
22+
run: make setup
23+
- name: Test
24+
run: make test ARGS="--cov-report term"
25+
- name: Upload Coverage to Codecov
26+
uses: codecov/codecov-action@v1

.gitignore

+4-1
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,7 @@ env/
66
*.sqlite3
77
build/
88
dist/
9-
*.egg-info
9+
*.egg-info
10+
.coverage
11+
coverage.xml
12+
htmlcov/

Makefile

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
ENV = env
2+
BIN = $(ENV)/bin
3+
PYTHON_VERSION = 3
4+
PYTHON = $(BIN)/python
5+
CODE_LOCATIONS = django_anonymous test_project manage.py setup.py
6+
7+
clean:
8+
rm -rf env
9+
rm -rf build
10+
rm -rf dist
11+
rm -rf *.egg
12+
rm -rf *.egg-info
13+
find | grep -i ".*\.pyc$$" | xargs -r -L1 rm
14+
15+
venv: clean
16+
$(shell which python$(PYTHON_VERSION)) -m venv $(ENV)
17+
18+
setup: venv
19+
$(BIN)/pip install -r requirements.txt
20+
21+
fix-codestyle:
22+
$(BIN)/black $(CODE_LOCATIONS)
23+
$(BIN)/isort $(CODE_LOCATIONS)
24+
25+
lint:
26+
$(BIN)/black --check $(CODE_LOCATIONS)
27+
$(BIN)/isort --check-only $(CODE_LOCATIONS)
28+
$(BIN)/flake8 $(CODE_LOCATIONS)
29+
30+
test: lint
31+
$(PYTHON) -X dev -m pytest $(ARGS)

README.md

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1-
# django-anonymous
1+
# django-anonymous
2+
3+
[![CI](https://github.com/krukas/django-anonymous/actions/workflows/main.yml/badge.svg)](https://github.com/krukas/django-anonymous/actions/workflows/main.yml)
4+
[![codecov](https://codecov.io/gh/krukas/django-anonymous/branch/master/graph/badge.svg?token=BPQQ1RVKDJ)](https://codecov.io/gh/krukas/django-anonymous)
5+
[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
6+
[![PyPI version](https://badge.fury.io/py/django-anonymous.svg)](https://badge.fury.io/py/django-anonymous)
7+
28

39
Simple Djanngo module to anonymize production data for safe usage on none production environments.
410

django_anonymous/__init__.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
from .faker import Faker
21
from .anonymizer import Anonymizer
3-
from. register import register
2+
from .faker import Faker
3+
from .register import register
44

55
__all__ = [
66
"Faker",

django_anonymous/anonymizer.py

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
2-
31
class Anonymizer:
42
SELECT_CHUNK_SIZE = 500
53
UPDATE_BATCH_SIZE = 100

django_anonymous/faker.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
from django.utils.translation import get_language
21
import faker
2+
from django.utils.translation import get_language
33

44

55
class Faker:

django_anonymous/management/commands/anonymize.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from django.core.management.base import BaseCommand
2-
from django_anonymous.register import registered_models, load_anonymizer
2+
3+
from django_anonymous.register import load_anonymizer, registered_models
34

45

56
class Command(BaseCommand):
@@ -17,4 +18,6 @@ def handle(self, *args, **options):
1718
model_name = model_anonymizer._model._meta.verbose_name.title()
1819
else:
1920
model_name = model_anonymizer._model._meta.verbose_name_plural.title()
20-
self.stdout.write(self.style.SUCCESS(f"{total} {model_name} are anonymized"))
21+
self.stdout.write(
22+
self.style.SUCCESS(f"{total} {model_name} are anonymized")
23+
)

django_anonymous/register.py

+7-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from importlib import import_module
2+
23
from django.apps import apps
34

45
registered_models = {}
@@ -10,15 +11,16 @@ def register(*models):
1011

1112
def _class_wrapper(anonymizer_class):
1213
if not models:
13-
raise ValueError('At least one model must be passed to register.')
14+
raise ValueError("At least one model must be passed to register.")
1415

1516
if not issubclass(anonymizer_class, Anonymizer):
16-
raise ValueError('Wrapped class must subclass Anonymizer')
17+
raise ValueError("Wrapped class must subclass Anonymizer")
1718

1819
for model in models:
1920
registered_models[model] = anonymizer_class(model)
2021

2122
return anonymizer_class
23+
2224
return _class_wrapper
2325

2426

@@ -27,6 +29,8 @@ def load_anonymizer():
2729
for app in apps.get_app_configs():
2830
for module in ["anonymizer", "anonymous", "anon"]:
2931
try:
30-
import_module('{}.{}'.format(getattr(app.module, '__package__'), module))
32+
import_module(
33+
"{}.{}".format(getattr(app.module, "__package__"), module)
34+
)
3135
except ImportError:
3236
pass

manage.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
def main():
88
"""Run administrative tasks."""
9-
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'test_project.settings')
9+
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "test_project.settings")
1010
try:
1111
from django.core.management import execute_from_command_line
1212
except ImportError as exc:
@@ -18,5 +18,5 @@ def main():
1818
execute_from_command_line(sys.argv)
1919

2020

21-
if __name__ == '__main__':
21+
if __name__ == "__main__":
2222
main()

requirements.txt

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
django~=3.2.12
2+
faker
3+
black
4+
isort
5+
flake8
6+
pytest
7+
pytest-django
8+
pytest-cov

setup.cfg

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
[flake8]
2+
max-line-length = 88
3+
ignore = W503
4+
5+
[tool:isort]
6+
profile = black
7+
known_first_party =
8+
django_anonymous
9+
10+
[tool:pytest]
11+
DJANGO_SETTINGS_MODULE = test_project.settings
12+
testpaths = test_project django_anonymous
13+
addopts =
14+
--cov=django_anonymous
15+
--cov-report html
16+
--cov-report xml

setup.py

+8-7
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import os
2+
23
from setuptools import Command, find_packages, setup
34

45
from django_anonymous import __version__
56

67

78
def readme():
8-
with open('README.md') as f:
9+
with open("README.md") as f:
910
return f.read()
1011

1112

@@ -43,18 +44,18 @@ def finalize_options(self):
4344
name="django-anonymous",
4445
version=__version__,
4546
packages=find_packages(include=["django_anonymous", "django_anonymous.*"]),
46-
python_requires='>=3.6',
47+
python_requires=">=3.6",
4748
install_requires=["Faker"],
4849
cmdclass={"publish": PublishCommand, "tag": CreateTagCommand},
4950
# metadata for upload to PyPI
50-
description="Simple Djanngo module to anonymize production data for safe usage on none production environments",
51+
description="Simple Djanngo module to anonymize production data for safe usage on none production environments", # noqa E501
5152
long_description=readme(),
5253
long_description_content_type="text/markdown",
53-
keywords=['Django', 'anonymous', 'anonymize'],
54+
keywords=["Django", "anonymous", "anonymize"],
5455
author="Maikel Martens",
55-
author_email='[email protected]',
56+
author_email="[email protected]",
5657
url="https://github.com/krukas/django-anonymous",
57-
download_url=f'https://github.com/krukas/django-anonymous/releases/tag/{__version__}',
58+
download_url=f"https://github.com/krukas/django-anonymous/releases/tag/{__version__}", # noqa E501
5859
license="GPL3",
5960
platforms=["any"],
6061
classifiers=[
@@ -66,4 +67,4 @@ def finalize_options(self):
6667
"Programming Language :: Python",
6768
"Programming Language :: Python :: 3",
6869
],
69-
)
70+
)

test_project/anon.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
from django_anonymous import Anonymizer, Faker, register
2-
from .models import Order, Item
2+
3+
from .models import Item, Order
34

45

56
@register(Order)
67
class OrderAnonymizer(Anonymizer):
8+
UPDATE_BATCH_SIZE = 2
9+
710
first_name = Faker("first_name", unique=True)
811
last_name = "Anon"
912

+35-13
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,55 @@
11
# Generated by Django 3.2.12 on 2022-03-03 15:34
22

3-
from django.db import migrations, models
43
import django.db.models.deletion
4+
from django.db import migrations, models
55

66

77
class Migration(migrations.Migration):
88

99
initial = True
1010

11-
dependencies = [
12-
]
11+
dependencies = []
1312

1413
operations = [
1514
migrations.CreateModel(
16-
name='Order',
15+
name="Order",
1716
fields=[
18-
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
19-
('created_on', models.DateTimeField(auto_now_add=True)),
20-
('first_name', models.CharField(max_length=128)),
21-
('last_name', models.CharField(max_length=128)),
17+
(
18+
"id",
19+
models.BigAutoField(
20+
auto_created=True,
21+
primary_key=True,
22+
serialize=False,
23+
verbose_name="ID",
24+
),
25+
),
26+
("created_on", models.DateTimeField(auto_now_add=True)),
27+
("first_name", models.CharField(max_length=128)),
28+
("last_name", models.CharField(max_length=128)),
2229
],
2330
),
2431
migrations.CreateModel(
25-
name='Item',
32+
name="Item",
2633
fields=[
27-
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
28-
('description', models.TextField()),
29-
('amount', models.DecimalField(decimal_places=2, max_digits=11)),
30-
('order', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='items', to='test_project.order')),
34+
(
35+
"id",
36+
models.BigAutoField(
37+
auto_created=True,
38+
primary_key=True,
39+
serialize=False,
40+
verbose_name="ID",
41+
),
42+
),
43+
("description", models.TextField()),
44+
("amount", models.DecimalField(decimal_places=2, max_digits=11)),
45+
(
46+
"order",
47+
models.ForeignKey(
48+
on_delete=django.db.models.deletion.CASCADE,
49+
related_name="items",
50+
to="test_project.order",
51+
),
52+
),
3153
],
3254
),
3355
]

0 commit comments

Comments
 (0)