Retrieving Code Complexity via CoCom Backend
- CoCom ( Code Complexity ) Backend based on supported languages and with the help of Lizard retrieves various source code related analysis such as:
- Cyclomatic Complexity and Average Cyclomatic Complexity
- Lines of Code and Average Lines of Code
- Number of functions in a module
- Total number of tokens
- ( and many more )
Basic usage of the CoCom backend
Once you’ve successfully installed Graal, you can get started real quick with the command line interface as easy as -
graal cocom --help
Note: You can invoke other available backends in a similar way.
Using Graal as a program
- Let’s start our analysis with the host repository itself. As you can see the positional parameter is added with the repository url and
git-path
flag is used to define the path where the git repository will be cloned.
graal cocom https://github.com/chaoss/grimoirelab-graal --git-path /tmp/graal-cocom
[2019-03-27 21:32:03,719] - Starting the quest for the Graal.
[2019-03-27 21:32:11,663] - Git worktree /tmp/worktrees/graal-cocom created!
[2019-03-27 21:32:11,663] - Fetching commits: 'https://github.com/chaoss/grimoirelab-graal' git repository from 1970-01-01 00:00:00+00:00 to 2100-01-01 00:00:00+00:00; all branches
[2019-03-27 21:32:13,276] - Git repository /tmp/graal-cocom checked out!
...
{
"backend_name": "CoCom",
"backend_version": "0.2.3",
"category": "code_complexity",
"data": {
"Author": "Valerio Cosentino <valcos@bitergia.com>",
"AuthorDate": "Sun May 6 13:56:51 2018 +0200",
"Commit": "Valerio Cosentino <valcos@bitergia.com>",
"CommitDate": "Sun May 6 13:56:51 2018 +0200",
"analysis": [
{
"avg_ccn": 2.111111111111111,
"avg_loc": 9.11111111111111,
"avg_tokens": 64.0,
"blanks": 48,
"ccn": 19,
"comments": 63,
"ext": "py",
"file_path": "graal/codecomplexity.py",
"loc": 129,
"num_funs": 9,
"tokens": 786
}
],
"commit": "a957488c9bd95e3b72a30611edc61496ee152430",
"message": "[codecomplexity] Enable analysis with no file filtering\n\nThis patch allows to handle analysis without file filtering."
},
"graal_version": "0.1.0",
"origin": "https://github.com/chaoss/grimoirelab-graal",
"tag": "https://github.com/chaoss/grimoirelab-graal",
"timestamp": 1553702540.824002,
"updated_on": 1525607811.0,
"uuid": "ce7c47568fd87100aff497dd7677b0736d85db1e"
}
...
[2019-03-27 21:35:59,077] - Fetch process completed: 137 commits fetched
[2019-03-27 21:35:59,089] - /tmp/worktrees/graal-cocom deleted!
[2019-03-27 21:35:59,116] - Git worktree /tmp/worktrees/graal-cocom deleted!
[2019-03-27 21:35:59,116] - Fetch process completed: 137 commits inspected
[2019-03-27 21:35:59,117] - Quest completed.
- In the above graal output, you can read one commit item obtained which contains
analysis
attribute underdata
.
Note: Some of the intermediate output items are skipped for representational purposes.
Using Graal as a Python script
- We can also use the backend provided by Graal in python scripts via importing the appropriate modules. Shown below is using
cocom
backend in a python script. [ Example: graal_cocom_1.py ]
#! /usr/bin/env python3
from graal.backends.core.cocom import CoCom
# URL for the git repo to analyze
repo_uri = "http://github.com/chaoss/grimoirelab-graal"
# directory where to mirror the repo
repo_dir = "/tmp/graal-cocom"
# Cocom object initialization
cc = CoCom(uri=repo_uri, git_path=repo_dir)
# fetch all commits
commits = [commit for commit in cc.fetch()]
- The above
commits
list contains commit items and can be used for further extraction of specific attributes.