https://github.com/mschwager/cohesion
  
  
    A tool for measuring Python class cohesion. 
    https://github.com/mschwager/cohesion
  
class code cohesion flake8 flake8-plugin lint linter-plugin measure module oop python quality
        Last synced: 2 months ago 
        JSON representation
    
A tool for measuring Python class cohesion.
- Host: GitHub
 - URL: https://github.com/mschwager/cohesion
 - Owner: mschwager
 - License: gpl-3.0
 - Created: 2016-08-11T21:09:32.000Z (about 9 years ago)
 - Default Branch: master
 - Last Pushed: 2024-12-09T15:09:55.000Z (11 months ago)
 - Last Synced: 2025-03-31T23:33:59.589Z (7 months ago)
 - Topics: class, code, cohesion, flake8, flake8-plugin, lint, linter-plugin, measure, module, oop, python, quality
 - Language: Python
 - Size: 109 KB
 - Stars: 239
 - Watchers: 10
 - Forks: 5
 - Open Issues: 7
 - 
            Metadata Files:
            
- Readme: README.md
 - Changelog: CHANGELOG.md
 - License: LICENSE
 
 
Awesome Lists containing this project
- awesome-flake8-extensions - cohesion - Extension for measuring Python class cohesion. (Complexity)
 - best-of-python-dev - GitHub - 35% open · ⏱️ 09.12.2024): (Code Metrics & Complexity)
 
README
          # Cohesion
[](https://img.shields.io/pypi/pyversions/cohesion.svg)
[](https://img.shields.io/pypi/v/cohesion.svg)
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.
> - [Wikipedia](https://en.wikipedia.org/wiki/Cohesion_(computer_science))
> 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
```
$ python -m pip install cohesion
$ 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
Cohesion supports being run by `flake8`. First, ensure your installation has
registered `cohesion`:
```
$ flake8 --version
3.2.1 (pyflakes: 1.0.0, cohesion: 1.2.0, pycodestyle: 2.2.0, mccabe: 0.5.3) CPython 2.7.12 on Linux
```
And now use `flake8` to lint your file:
```
$ flake8 example.py
example.py:1:1: H601 class has low cohesion
```
# Developing
First, install development packages:
```
$ python -m poetry install --with=dev
```
## Testing
```
$ python -m poetry run pytest
```
## Linting
```
$ python -m poetry run flake8
```
## Coverage
```
$ python -m poetry run pytest --cov
```