Skip to main content

multimetric

Build status PyPI version Python version Downloads

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

  • files contains a list of each file passed by CLI
  • overall contains the calculated values for all passed files
  • stats contains 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 metric
  • mean = statistical mean over all items of the metric
  • median = statistical median over all items of the metric
  • min = the minimum value of all items of the metric
  • sd = 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)

Source distribution for multimetric 2.4.5
File Size Uploaded
multimetric-2.4.5.tar.gz 21.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for multimetric 2.4.5
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

This release

2.4.5 This release

2 release files

2.4.4

2 release files

2.4.3

2 release files

2.4.2

2 release files

2.4.1

2 release files

2.4.0

2 release files

2.3.0

2 release files

2.2.2

2 release files

2.2.1

2 release files

2.2.0

2 release files

2.1.0

2 release files

2.0.6

2 release files

2.0.5

2 release files

2.0.4

2 release files

2.0.3

2 release files

2.0.2

2 release files

2.0.1

2 release files

2.0.0

2 release files

1.4.1

1 release file

1.3.1

1 release file

1.3.0

1 release file

1.2.0

1 release file

1.1.5

1 release file

1.1.4

1 release file

1.1.3

2 release files

1.1.2

1 release file

1.1.1

1 release file

1.1.0

1 release file

1.0.5

2 release files

1.0.4

1 release file

1.0.3

1 release file

1.0.2

1 release file

1.0.1

1 release file

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page