A tool for measuring Python class cohesion.
Project description
Cohesion
Cohesion is a tool for measuring Python class cohesion.
In computer programming, cohesion refers to the degree to which the elements of a module belong together. Thus, cohesion measures the strength of relationship between pieces of functionality within a given module. For example, in highly cohesive systems functionality is strongly related.
When cohesion is high, it means that the methods and variables of the class are co-dependent and hang together as a logical whole.
- Clean Code pg. 140
Some of the advantages of high cohesion, also by Wikipedia:
- Reduced module complexity (they are simpler, having fewer operations).
- Increased system maintainability, because logical changes in the domain affect fewer modules, and because changes in one module require fewer changes in other modules.
- Increased module reusability, because application developers will find the component they need more easily among the cohesive set of operations provided by the module.
Installing
$ pip install cohesion
$ cohesion -h
OR
$ git clone https://github.com/mschwager/cohesion.git
$ cd cohesion
$ PYTHONPATH=lib/ python -m cohesion -h
Using
Cohesion
measures class and instance variable usage across the methods
of that class.
$ cat example.py
class ExampleClass1(object):
class_variable1 = 5
class_variable2 = 6
def func1(self):
self.instance_variable = 6
def inner_func(b):
return b + 5
local_variable = self.class_variable1
return local_variable
def func2(self):
print(self.class_variable2)
@staticmethod
def func3(variable):
return variable + 7
class ExampleClass2(object):
def func1(self):
self.instance_variable1 = 7
$ cohesion --files example.py --verbose
File: example.py
Class: ExampleClass1 (1:0)
Function: func1 2/3 66.67%
Variable: class_variable1 True
Variable: class_variable2 False
Variable: instance_variable True
Function: func2 1/3 33.33%
Variable: class_variable1 False
Variable: class_variable2 True
Variable: instance_variable False
Function: func3 0/3 0.00%
Variable: class_variable1 False
Variable: class_variable2 False
Variable: instance_variable False
Total: 33.33%
Class: ExampleClass2 (23:0)
Function: func1 1/1 100.00%
Variable: instance_variable1 True
Total: 100.00%
The --below
and --above
flags can be specified to only show classes with
a cohesion value below or above the specified percentage, respectively.
Flake8 Support
You can now lint Python files for classes with low cohesion with flake8
!
First, ensure your installation has registered cohesion
:
$ flake8 --version
3.2.1 (pyflakes: 1.0.0, cohesion: 0.8.0, pycodestyle: 2.2.0, mccabe: 0.5.3) CPython 2.7.12 on Linux
And now use flake8
to lint your file with the extension enabled:
$ flake8 --enable-extension=H60 example.py
example.py:1:1: H601 class has low cohesion
Python Versions
If you would like to simultaneously run Cohesion
on Python 2 and Python 3
code then you will have to install it for both versions. I.e.
$ pip2 install cohesion
$ pip3 install cohesion
Then use the corresponding version to run the module:
$ python2 -m cohesion --files python2_file.py
$ python3 -m cohesion --files python3_file.py
Developing
First, install development packages:
$ pip install -r requirements-dev.txt
Testing
$ nose2
Linting
$ flake8
Coverage
$ nose2 --with-coverage
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 Distributions
Built Distribution
Hashes for cohesion-0.9.1-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a20019bdf6c5345bb1ddf18124121b87b79db5a039f20b53547d9e664dab19ed |
|
MD5 | 9b7ec8f6abf12ca4de919d9406c9f261 |
|
BLAKE2b-256 | 67f2cf09448fa0186a7661fd37e0f1bc3e35d1e5d6d403e6dca306c6ac5b1266 |