Package allows to enforce certain kinds of PEP-8 convention coding styles (or perform overall code diagnostics). It aims to help maintain programmers sanity while making any code changes. In large object-oriented programs, it can sometimes be useful to put class definitions under control of a metaclass that are used to alert programmers to potential problems.
Most important that package enforces you to write clear and concise pythonic code.
- python 3.6, 3.7, 3.8, 3.9
Please run following script to obtain latest package from PYPI:
pip install enforce-pep8
β¨ π° β¨
Bad class name: lowercase class name is defined
from punish.style import AbstractStyle
class stylish(AbstractStyle):
def name(self) -> None:
pass
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
punish.style.BadClassNameError
Class name 'stylish' specified in lowercase. Consider to use camelcase style!
Bad attribute name: camelcase method name is defined
from punish.style import AbstractStyle
class Stylish(AbstractStyle):
def showName(self) -> None:
pass
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
punish.style.BadAttributeNameError
Bad attribute name is specified: 'Stylish:showName'. Consider to use lowercase style: 'Stylish:showname'!
Bad method signature: method signature mismatch within base and child classes
from punish.style import AbstractStyle
class Stylish(AbstractStyle):
def show(self, indent: str = ":") -> str:
pass
class SoStylish(Stylish):
def show(self, indent: str = ":", not_expected_argument: bool = False) -> str:
pass
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
punish.style.SignatureError
Signature mismatch in 'SoStylish.show',
(self, indent: str = ':') -> str != (self, indent: str = ':', not_expected_argument: bool = False) -> str
Duplicated attribute name: defined two methods with same name
from punish.style import AbstractStyle
class Stylish(AbstractStyle):
def name(self) -> None:
pass
def name(self) -> None:
pass
Traceback (most recent call last):
File "<stdin>", line 5, in Stylish
punish.style.DuplicateAttributeError: 'name' attribute is already defined in 'Stylish' class
Bad argument type: not expected type is passed to the argument
from punish.type import OrderTypedMeta, String, Typed
class Car(metaclass=OrderTypedMeta):
color: Typed = String()
def __init__(self, color: str) -> None:
self.color = color
car: Car = Car(color=23)
Traceback (most recent call last):
File "<stdin>", line 5, in __init__
TypeError: Expected '<class 'str'>' type for 'color' attribute
Bad setter type: not expected type for setter argument
from punish.type import typed_property
class Person:
name: property = typed_property("name", str)
age: property = typed_property("age", int)
def __init__(self, name: str, age: int) -> None:
self._name = name
self._age = age
person: Person = Person(name="Luke", age=22)
person.age = None
Traceback (most recent call last):
File "<stdin>", line 5, in __init__
TypeError: 'age' argument must be a '<class 'int'>' type
Frozen class attributes: it is forbidden to modify class attributes
from punish.type import FrozenMeta
class Bio(metaclass=FrozenMeta):
name: str = 'Luke'
company: str = 'Cisco'
bio = Bio()
bio.name = 'Amir'
dataclasses.FrozenInstanceError: cannot assign to field 'name'
git clone git@github.com:vyahello/enforce-pep8.git
pip install -e .
Or using direct source:
pip install git+https://github.com/vyahello/enforce-pep8@0.0.1
Please execute command below to run unittests with pytest
tool:
pytest
Project has Travis CI integration using .travis.yml file thus code analysis (black
, pylint
, flake8
, mypy
, pydocstyle
) and unittests (pytest
) will be run automatically after every made change to the repository.
To be able to run code analysis, please execute command below:
./analyse-source-code.sh
Please check changelog file to get more details about actual versions and it's release notes.
Author β Volodymyr Yahello. Please check authors file for more details.
Distributed under the MIT
license. See LICENSE for more information.
You can reach out me at:
- vyahello@gmail.com
- https://twitter.com/vyahello
- https://www.linkedin.com/in/volodymyr-yahello-821746127
I would highly appreciate any contribution and support. If you are interested to add your ideas into project please follow next simple steps:
- Clone the repository
- Configure
git
for the first time after cloning with yourname
andemail
pip install -r requirements.txt
to install all project dependenciespip install -r requirements-dev.txt
to install all development project dependencies- Create your feature branch (git checkout -b feature/fooBar)
- Commit your changes (git commit -am 'Add some fooBar')
- Push to the branch (git push origin feature/fooBar)
- Create a new Pull Request
Project is inspired mainly by pythonic PEP8 code style reflected at https://www.python.org/dev/peps/pep-0008. Also decent ideas are described in https://github.com/zedr/clean-code-python project.
In general, future releases will contain API implementations from mentioned style guides above.
All recent activities and ideas are described at project issues page. If you have ideas you want to change/implement please do not hesitate and create an issue.