The Module Size Calculator is a Java library designed for analyzing the size of modules within a project based on lines of code (LOC). It provides functionalities to calculate and visualize the distribution of code among different modules, helping developers understand the codebase's structure and identify potential areas for optimization or refactoring.
In the context of a library, a module is simply a package/directory with all its contents (recursive search). This definition is flexible and allows the library to be used in most standard projects.
- Analyze project modules recursively.
- Include specific file extensions for analysis (e.g., Java, CSV).
- Generate Mermaid pie charts to visualize module sizes.
- Verify module sizes against predefined thresholds.
- Handle exceptions gracefully for invalid inputs or file operations.
Below is an example jUnit test verifying the size of modules using the library:
@Test
void shouldVerifyModulesSize() {
ProjectSummary projectSummary = ModuleSizeCalculator.project("src/main/java")
.withModule("com.example.module1")
.withModule("com.example.module2")
.withModule("com.example.module3")
.withModule("com.example.commons")
.analyze()
.verifyEachModuleRelativeSizeIsSmallerThan(0.3)
.verifyModuleRelativeSizeIsSmallerThan("com.example.commons", 0.1)
.verifyNoEmptyModules()
.verifyUndefinedModuleNumberOfFilesIsSmallerThan(1)
.saveMermaidPieChart(Path.of("target/modules-size.mermaid"));
}
To analyze project modules, use the ModuleSizeCalculator
class.
You can specify the project directory and include specific file extensions if needed.
ProjectSummary projectSummary = ModuleSizeCalculator.project("src/main/java")
.withModule("com.example.module1")
.withModule("com.example.module2")
// Add more modules as needed
.include("java", "csv") // Include specific file extensions
.analyze();
The library allows to perform various verifications on the module sizes
Check if the relative size of each module is smaller than a specified threshold (relative to the total project size). If, for example, the project has 20 modules and 80% of the code is in one of them, we cannot talk about modularization because almost all the code is in one place. This check ensures that none of the modules is larger than a certain threshold.
projectSummary.verifyEachModuleRelativeSizeIsSmallerThan(0.3);
Verify if the relative size of a specific module is smaller than a specified threshold (relative to the total project size). An example use would be to ensure that a specific module, e.g. commons, is small.
projectSummary.verifyModuleRelativeSizeIsSmallerThan("com.example.commons", 0.1);
Ensure that none of the modules are empty. It may be useful, for example, to ensure that tests are up-to-date when a module is removed but the definition in the test was forgotten to be corrected.
projectSummary.verifyNoEmptyModules();
Check if the number of files in modules without names (undefined) is smaller than a specified limit.
An example of such a file could be a class with a main()
method that is in the main project directory, along with the packages defining all modules.
\ com
\ example
| module1
| module2
| module2
\ Main.java
The method can also catch situations when a new module is added to the project which is not added to the module definitions in the test. In such a case, files from the new module will be classified as belonging to the undefined module and the assertion will not pass. This allows you to ensure that the test is up-to-date.
projectSummary.verifyUndefinedModuleNumberOfFilesIsSmallerThan(1);
You can generate Mermaid pie charts to visualize module sizes using the saveMermaidPieChart() method.
projectSummary.saveMermaidPieChart(Path.of("target/modules-size.mermaid"));
You can include this library in your project using Maven or Gradle. Add the following dependency to your pom.xml file for Maven:
<dependency>
<groupId>pl.tfij</groupId>
<artifactId>module-size-calculator</artifactId>
<version>1.0.0</version>
<scope>test</scope>
</dependency>
For Gradle, add the following to your build.gradle file:
testImplementation 'pl.tfij:module-size-calculator:1.0.0'
Contributions to the library are welcome. If you encounter any bugs or have suggestions for improvements, please submit an issue or pull request on the GitHub repository.