multimetric
Calculate code metrics in various languages
Purpose
This tool tries to calculate the following metrics for many, many programming languages
- Comment to Code percentage
- Cyclomatic complexity according to McCabe
- Difficulty according to Halstead
- Effort according to Halstead
- Fan-Out
- Lines of code
- Maintainability index
- Metric according to pylint
- Metric according to TIOBE
- Number of delivered bugs according to Halstead
- Time required to program according to Halstead
- Volume according to Halstead
This tool was heavily inspired by metrics
Fully supported languages
For the following programming language we do offer the complete feature set.
- Bash/Shell
- C
- CoffeeScript
- C++
- C#
- Dart
- Go
- Groovy
- Haskell
- Java
- JavaScript
- Julia
- Kotlin
- Lisp
- Lua
- Objective-C
- Perl
- PHP
- Python
- Ruby
- Rust
- TCL
- TypeScript
- Zig
Other languages work too, but might have a more limited support of what metrics can be extracted.
Requirements
Installation
PyPi
simply run
pip3 install multimetric
From source
- git clone this repository
- cd to <clone folder>
- run
pip3 install .
Usage
usage: multimetric [-h] [--warn_compiler WARN_COMPILER] [--warn_duplication WARN_DUPLICATION] [--warn_functional WARN_FUNCTIONAL] [--warn_standard WARN_STANDARD]
[--warn_security WARN_SECURITY] [--coverage COVERAGE] [--dump] [--verbose] [--jobs JOBS] [--bugpredict {old,new}] [--maintindex {sei,classic,microsoft}]
files [files ...]
Calculate code metrics in various languages
positional arguments:
files Files to parse
options:
-h, --help show this help message and exit
--warn_compiler WARN_COMPILER
File(s) holding information about compiler warnings
--warn_duplication WARN_DUPLICATION
File(s) holding information about code duplications
--warn_functional WARN_FUNCTIONAL
File(s) holding information about static code analysis findings
--warn_standard WARN_STANDARD
File(s) holding information about language standard violations
--warn_security WARN_SECURITY
File(s) File(s) holding information about found security issue
--coverage COVERAGE File(s) with compiler warningsFile(s) holding information about testing coverage
--dump Just dump the token tree
--verbose Verbose logging output
--jobs JOBS Run x jobs in parallel
--bugpredict {old,new}
Method how to calculate the bug prediction
--maintindex {sei,classic,microsoft}
Method how to calculate the maintainability index
Currently you could import files of the following types for --warn_* or --coverage
Following information can be read
<file> = full path to file
<severity> = severity [error, warning, info]
<content> = optional string
Note: you could also add a single line, then <content>
has to be a number reflecting to total number of findings
File formats
csv: CSV file of following line format
<file>,<severity>,[<content>]
json: JSON file
<file>: {
["content": <content>,]
"severity": <severity>
}
By default tool guesses the content type by the filename, if that doesn't work for you please see below
Output
Output will be written to stdout as json.
Output structure
filescontains a list of each file passed by CLIoverallcontains the calculated values for all passed filesstatscontains the statistically calculated values over all files passed see Statistical additions
Item structure
| item | description | range | recommendation |
|---|---|---|---|
| comment_ratio | Comment to Code percentage | 0..100 | > 30.0 |
| cyclomatic_complexity | Cyclomatic complexity according to McCabe | 0..(inf) | < 10 |
| fanout_external | Number imports from out of tree modules | 0..(inf) | |
| fanout_internal | Number imports from same source tree modules | 0..(inf) | |
| halstead_bugprop | Number of delivered bugs according to Halstead | 0..(inf) | < 0.05 |
| halstead_difficulty | Difficulty according to Halstead | 0..(inf) | |
| halstead_effort | Effort according to Halstead | 0..(inf) | |
| halstead_timerequired | Time required to program according to Halstead | 0..(inf) | |
| halstead_volume | Volume according to Halstead | 0..(inf) | |
| lang | list of identified programming languages | list | |
| loc | Lines of code | 1..(inf) | |
| maintainability_index | Maintainability index | 0..100 | > 80.0 |
| operands_sum | Number of used operands | 1..(inf) | |
| operands_uniq | Number of unique used operands | 1..(inf) | |
| operators_sum | Number of used operators | 1..(inf) | |
| operators_uniq | Number of unique used operators | 1..(inf) | |
| pylint | General quality score according to pylint | 0..100 | > 80.0 |
| tiobe_compiler | Compiler warnings score according to TIOBE | 0..100 | > 90.0 |
| tiobe_complexity | Complexity according to TIOBE | 0..100 | > 80.0 |
| tiobe_coverage | Coverage according to TIOBE | 0..100 | > 80.0 |
| tiobe_duplication | Code duplications score according to TIOBE | 0..100 | > 80.0 |
| tiobe_fanout | Fan-Out score according to TIOBE | 0..100 | > 80.0 |
| tiobe_functional | Functional defect score according to TIOBE | 0..100 | > 90.0 |
| tiobe_security | Security score according to TIOBE | 0..100 | > 90.0 |
| tiobe_standard | Language standard score according to TIOBE | 0..100 | > 80.0 |
| tiobe | General quality score according to TIOBE | 0..100 | > 80.0 |
Statistics
The item stats contains in addition to the above mentioned the following items, which by themselves contain all the items mentioned at Item structure
max= the maximum value of all items of the metricmean= statistical mean over all items of the metricmedian= statistical median over all items of the metricmin= the minimum value of all items of the metricsd= standard deviation over all items of the metric (needs more than one file to be passed by CLI)
Further reading
Bugs & Contribution
Feel free to create issues or pull requests
Contribution
flowchart TD
A[I want to contribute!] --> C(Code your changes)
C -->|Flake8 successful| E[Open PR]
C -->|pytest successful| E[Open PR]
C -->|Contribution guideline accepted| E[Open PR]
C -->|README updated| E[Open PR]
Contribute settings for a new language
flowchart TD
A[I want to contribute a new language config!] --> A1(Find permissively licensed test code)
A1 --> B(Pygments contains a lexer for the language)
B --> C(Create fanout settings)
C --> D[Code your changes]
D -->|Flake8 successful| E[Open PR]
D -->|pytest successful| E[Open PR]
D -->|Contribution guideline accepted| E[Open PR]
D -->|README updated| E[Open PR]
Metadata
Release files for multimetric 2.4.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| multimetric-2.4.5.tar.gz | 21.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| multimetric-2.4.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 92.7 kB
Release files / multimetric-2.4.5.tar.gz
| Download URL | multimetric-2.4.5.tar.gz |
|---|---|
| Size | 21.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
59c1b3654535b6029791446a4d8467f4bec5c1954375ab429e2a35b3a27209ae
|
|
BLAKE2b-256 checksum How to use checksums |
c1a62b9d2808d6d38e4cfe144e54f37404bd312f36e99b15129ce72ed8eebab4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / multimetric-2.4.5-py3-none-any.whl
| Download URL | multimetric-2.4.5-py3-none-any.whl |
|---|---|
| Size | 70.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8595e3f4827a4d80be64a66849f5a98b5091b4b730d614804eed5e65061a88c1
|
|
BLAKE2b-256 checksum How to use checksums |
d9cb76ac283ae2136ea5500bf926c9ac667ef95c729cfa6fa794146efc652c62
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|