From 9961245ed7445e606b5ad3fd479f7e74290aca53 Mon Sep 17 00:00:00 2001 From: luci Date: Thu, 4 Sep 2025 00:11:53 -0400 Subject: [PATCH 01/12] added headers --- courseProjectDocs/project-proposal.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/courseProjectDocs/project-proposal.md b/courseProjectDocs/project-proposal.md index e69de29bb2d..a44f25f91e2 100644 --- a/courseProjectDocs/project-proposal.md +++ b/courseProjectDocs/project-proposal.md @@ -0,0 +1,3 @@ +##Project Overview + +##Key Quality Metrics From 4c344a2b561bd114a6773888909d55349a447718 Mon Sep 17 00:00:00 2001 From: gpt5405 <98571750+gpt5405@users.noreply.github.com> Date: Fri, 5 Sep 2025 14:42:15 -0400 Subject: [PATCH 02/12] Number of JUnit Tests --- courseProjectDocs/Metrics/testMetrics.py | 29 ++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 courseProjectDocs/Metrics/testMetrics.py diff --git a/courseProjectDocs/Metrics/testMetrics.py b/courseProjectDocs/Metrics/testMetrics.py new file mode 100644 index 00000000000..5a0dc6a7ea6 --- /dev/null +++ b/courseProjectDocs/Metrics/testMetrics.py @@ -0,0 +1,29 @@ +import os +import re + +def count_junit_tests(): + script_dir = os.path.dirname(os.path.abspath(__file__)) + project_root = os.path.abspath(os.path.join(script_dir, '..', '..')) + + total = 0 + for root, _, files in os.walk(project_root): + for file in files: + if file.endswith(".java"): + with open(os.path.join(root, file), 'r', encoding='utf-8') as f: + in_block_comment = False + for line in f: + line = line.strip() + + if '/*' in line: + in_block_comment = True + if '*/' in line: + in_block_comment = False + continue + if in_block_comment or line.startswith('//'): + continue + if re.search(r'^\s*@Test\b', line): + total += 1 + return total + +if __name__ == "__main__": + print(count_junit_tests()) From e09630d3b9f58ebfa274ab18b257d2568c33d104 Mon Sep 17 00:00:00 2001 From: Vanessa <71130347+typewriterbot@users.noreply.github.com> Date: Sun, 7 Sep 2025 12:39:27 -0400 Subject: [PATCH 03/12] Adding #1 of software code metrics quality This contains the 1. LOC, 2. Comment density, and 3. Cyclomatic Complexity per module. --- courseProjectDocs/Metrics/metrics.py | 94 +++++++++++++++++++++++++++ courseProjectDocs/Metrics/results.csv | 11 ++++ 2 files changed, 105 insertions(+) create mode 100644 courseProjectDocs/Metrics/metrics.py create mode 100644 courseProjectDocs/Metrics/results.csv diff --git a/courseProjectDocs/Metrics/metrics.py b/courseProjectDocs/Metrics/metrics.py new file mode 100644 index 00000000000..ac545d27629 --- /dev/null +++ b/courseProjectDocs/Metrics/metrics.py @@ -0,0 +1,94 @@ +import os +import re +import glob + +import lizard +from pygount import SourceAnalysis +import csv + +# 1. LOC (per file/module) +# 2. comment density : comments / total lines +# 3. cyclomatic complexity + + +standalone_paths = [] + +def print_results(results): + with open('results.csv', 'w', newline='') as csvfile: + fieldnames = ['Module', 'loc', 'density', 'complexity'] + writer = csv.DictWriter(csvfile, fieldnames=fieldnames) + writer.writeheader() + for result in results: + writer.writerow(result) + +def get_all_src_paths(root_dir): # This function grabs all paths that have 'src' for modules to count metrics. + path_list = [] + for path, names, file in os.walk(root_dir): + for name in names: + if 'src' in name: + full_path = os.path.join(path, name) + path_list.append(full_path) + dir_name = os.path.dirname(full_path) + standalone_paths.append(os.path.basename(dir_name)) + return path_list + +def get_all_files(directory): + all_files = [] + for root, dirs, files in os.walk(directory): + for file in files: + if '.' not in file: + continue # Exclude any file without file extension (verfied txt files no major contribution to src code) + file_path = os.path.join(root, file) + abs_path = os.path.abspath(file_path) + all_files.append(abs_path) + return all_files + +def evaluate_files(files, index): + total_loc = 0 + total_comments = 0 + total_density = 0.0 + total_cc = 0 + for file in files: + i = lizard.analyze_file(file) + loc = i.__dict__.get("nloc") # typeof int + analyze = SourceAnalysis.from_file(file, "pygount") + comments = analyze.documentation_count # typeof int + big_cc = 0 + if i.function_list: + for func in i.function_list: + cc = func.__dict__.get('cyclomatic_complexity') + big_cc = big_cc + cc + total_cc = big_cc + total_cc + total_loc = loc + total_loc + total_comments = comments + total_comments + try: + total_density = total_loc / total_comments + except ZeroDivisionError: + total_density = -1 # Module has 0 LOC?? check. + file_dict = { + 'Module':standalone_paths[index], 'loc':total_loc, 'density':total_density, 'complexity':total_cc + } + return file_dict + +def main(): + root_dir = os.path.abspath(os.curdir) # glob_pattern = "/.*/src/*.java" or ".kts" (java or kotlin) + paths = get_all_src_paths(root_dir) # args_ignore = ".*" + exclude_exts = ('.tff', '.xsl', '.fxml', '.properties', '.blg', '.gitignore', '.tex', '.layout', + '.md', '.terms', '.readme', '.json', '.jstyle', '.jks', '.aux', '.csl', '.bst', + '.cff', '.enw', '.ctv6bak', '.txt', '.isi', '.nbib', '.ris', '.ref', '.docx', + '.g4', '.gitkeep', '.sh', '.ico', '.icns', '.svo', '.Writer', '.ResourceLocator', + '.IkonHandler', '.IkonProvider', '.ttf', '.bak', '.end', '.log', '.bib', '.pdf', + '.png', '.http', '.xml') # List of ext to exclude + results = [] + print("Program now running .... ") + for i, dir in enumerate(paths): + single_dir = get_all_files(dir) + filtered_files = [f for f in single_dir if not f.endswith(exclude_exts)] + result = evaluate_files(filtered_files, i) + results.append(result) + print(str(result)) + print_results(results) + print("Program done!") # print(results) + +if __name__ == "__main__": + main() diff --git a/courseProjectDocs/Metrics/results.csv b/courseProjectDocs/Metrics/results.csv new file mode 100644 index 00000000000..f4e915b8908 --- /dev/null +++ b/courseProjectDocs/Metrics/results.csv @@ -0,0 +1,11 @@ +Module,loc,density,complexity +build-logic,739,13.943396226415095,2 +build-support,242,2.951219512195122,21 +jabgui,85574,13.275519702140862,11578 +jabkit,1457,31.67391304347826,137 +jablib,129741,7.408268143664706,19775 +jabls,622,62.2,95 +jabls-cli,51,17.0,3 +jabsrv,1857,13.170212765957446,216 +jabsrv-cli,99,8.25,5 +test-support,364,4.6075949367088604,39 From 3b53a706f5171b89ad7e1b560ed75f00153ab898 Mon Sep 17 00:00:00 2001 From: Vanessa <71130347+typewriterbot@users.noreply.github.com> Date: Sun, 7 Sep 2025 12:42:31 -0400 Subject: [PATCH 04/12] Results image for README Adding image for results for proper formatting in the proposal paper. --- courseProjectDocs/Metrics/metrics_1_results.png | Bin 0 -> 46612 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 courseProjectDocs/Metrics/metrics_1_results.png diff --git a/courseProjectDocs/Metrics/metrics_1_results.png b/courseProjectDocs/Metrics/metrics_1_results.png new file mode 100644 index 0000000000000000000000000000000000000000..ece5b34032b1adf751f7d6e5e354153a353e5241 GIT binary patch literal 46612 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 Yrf71|vik*PNZR<}eTYKgy+<$q1G&AAhyVZp literal 0 HcmV?d00001 From 9ed6e834db1917b6c467a0e5a6101f1361ae14f0 Mon Sep 17 00:00:00 2001 From: Vanessa <71130347+typewriterbot@users.noreply.github.com> Date: Sun, 7 Sep 2025 13:17:43 -0400 Subject: [PATCH 05/12] Update README.md Adding code metrics for #1 --- courseProjectDocs/Metrics/README.md | 54 +++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/courseProjectDocs/Metrics/README.md b/courseProjectDocs/Metrics/README.md index 18af1baf483..ef01ab0ef98 100644 --- a/courseProjectDocs/Metrics/README.md +++ b/courseProjectDocs/Metrics/README.md @@ -1 +1,55 @@ This shows how to recreate the results generated via Metrics code. + + +## Key Metrics: +### 1. LOC (per file/module) +### 2. comment density +### 3. cyclomatic complexity + +## **Modules**: +#### build-logic +#### build-support +#### jabgui +#### jabkit +#### jablib +#### jabls +#### jabls-cli +#### jabsrv +#### jabsrv-cli +#### test-support + +![The Module Results for code metrics](metrics_1_results.png) + +This *modules* were chosen as they contained the 'src' code for major contributions to the project, their file extensions includes: .kts (kotlin), .java, and .css + + +## Library + +The library used were a mixture of **lizard** and **pygount**. Although, the script was written in Python, these libraries support the analysis of many languages via source code from files. + +### Steps to Recreate: + +1. main() + - Get the root dir path os.path.abs(path(os.curdir)) + - Get all paths that have 'src' folders, save as a list + - Create a for loop that iterates through the path list +2. Filter files + - Filter files in that src folder to disregard any resources (.png, .tff, etc.) + - Return this list to the main for loop +3. Evaluate files + - This is the heartbeat of the program that computes the metrics. + ```python + + for file in files: + i = lizard.analyze_file(file) + loc = i.__dict__.get("nloc") + analyze = SourceAnalysis.from_file(file, "pygount") + comments = analyze.documentation_count # typeof int + for func in i.function_list: + cc = func.__dict__.get('cyclomatic_complexity') + return dict + ``` + - Then calculate the comment density, LOC, and cyclomatic complexity +4. Print results + - Use CSV library to print the list of dictionaries + From 0e3cf6d76f3e3108934558c8c34e6df71929be6a Mon Sep 17 00:00:00 2001 From: Vanessa <71130347+typewriterbot@users.noreply.github.com> Date: Sun, 7 Sep 2025 13:22:55 -0400 Subject: [PATCH 06/12] Update README.md Proper formatting fix --- courseProjectDocs/Metrics/README.md | 31 ++++++++++++++++++----------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/courseProjectDocs/Metrics/README.md b/courseProjectDocs/Metrics/README.md index ef01ab0ef98..fa7c6137629 100644 --- a/courseProjectDocs/Metrics/README.md +++ b/courseProjectDocs/Metrics/README.md @@ -7,25 +7,32 @@ This shows how to recreate the results generated via Metrics code. ### 3. cyclomatic complexity ## **Modules**: -#### build-logic -#### build-support -#### jabgui -#### jabkit -#### jablib -#### jabls -#### jabls-cli -#### jabsrv -#### jabsrv-cli -#### test-support + +| ------------- | ------------- | +| build-logic | build-support | +| jabgui | jabkit | +| jablib | jabls | +| jabsrv | jabsrv-cli | + +#### + build-logic +#### + build-support +#### + jabgui +#### + jabkit +#### + jablib +#### + jabls +#### + jabls-cli +#### + jabsrv +#### + jabsrv-cli +#### + test-support ![The Module Results for code metrics](metrics_1_results.png) -This *modules* were chosen as they contained the 'src' code for major contributions to the project, their file extensions includes: .kts (kotlin), .java, and .css +These *modules* were chosen as they contained the 'src' code for major contributions to the project, their file extensions includes: .kts (kotlin), .java, and .css ## Library -The library used were a mixture of **lizard** and **pygount**. Although, the script was written in Python, these libraries support the analysis of many languages via source code from files. +The libraries used were a mixture of **lizard** and **pygount**. Although, the script was written in Python, these libraries support the analysis of many languages via source code from files. ### Steps to Recreate: From e03625a7842e3e79c83720fc4e9c7d7f871622a4 Mon Sep 17 00:00:00 2001 From: Vanessa <71130347+typewriterbot@users.noreply.github.com> Date: Sun, 7 Sep 2025 13:27:57 -0400 Subject: [PATCH 07/12] Adding code structure portion Proper heading fix --- courseProjectDocs/Metrics/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/courseProjectDocs/Metrics/README.md b/courseProjectDocs/Metrics/README.md index fa7c6137629..f62eecc0d28 100644 --- a/courseProjectDocs/Metrics/README.md +++ b/courseProjectDocs/Metrics/README.md @@ -1,13 +1,13 @@ This shows how to recreate the results generated via Metrics code. - -## Key Metrics: +# Key Metrics: +## Code Structure: ### 1. LOC (per file/module) ### 2. comment density ### 3. cyclomatic complexity ## **Modules**: - +| Module | Module | | ------------- | ------------- | | build-logic | build-support | | jabgui | jabkit | From b2f19a340c1e993406a80ce8985a417763daaf19 Mon Sep 17 00:00:00 2001 From: gpt5405 <98571750+gpt5405@users.noreply.github.com> Date: Sun, 7 Sep 2025 17:47:58 -0400 Subject: [PATCH 08/12] Update README.md --- courseProjectDocs/Metrics/README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/courseProjectDocs/Metrics/README.md b/courseProjectDocs/Metrics/README.md index f62eecc0d28..c9fb4122016 100644 --- a/courseProjectDocs/Metrics/README.md +++ b/courseProjectDocs/Metrics/README.md @@ -1,10 +1,11 @@ -This shows how to recreate the results generated via Metrics code. +This shows how to recreate the results generated via Metrics code and Test Metrics. # Key Metrics: ## Code Structure: ### 1. LOC (per file/module) -### 2. comment density -### 3. cyclomatic complexity +### 2. Comment Density +### 3. Cyclomatic Complexity +### 4. Number of Unit Tests ## **Modules**: | Module | Module | @@ -59,4 +60,4 @@ The libraries used were a mixture of **lizard** and **pygount**. Although, the s - Then calculate the comment density, LOC, and cyclomatic complexity 4. Print results - Use CSV library to print the list of dictionaries - +5. Run the testMetrics.py file using any python interpreter. Results will be output into the terminal. Current number of tests = 3643 From 895d7db3312a0608dba411de43b82be01fa346fb Mon Sep 17 00:00:00 2001 From: Vanessa <71130347+typewriterbot@users.noreply.github.com> Date: Sun, 7 Sep 2025 23:13:09 -0400 Subject: [PATCH 09/12] Update README.md extra fluff --- courseProjectDocs/Metrics/README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/courseProjectDocs/Metrics/README.md b/courseProjectDocs/Metrics/README.md index c9fb4122016..825e496fbec 100644 --- a/courseProjectDocs/Metrics/README.md +++ b/courseProjectDocs/Metrics/README.md @@ -13,7 +13,8 @@ This shows how to recreate the results generated via Metrics code and Test Metri | build-logic | build-support | | jabgui | jabkit | | jablib | jabls | -| jabsrv | jabsrv-cli | +| jabsrv | jabsrv-cli | +| test-suport | jabls-cli | #### + build-logic #### + build-support @@ -28,7 +29,7 @@ This shows how to recreate the results generated via Metrics code and Test Metri ![The Module Results for code metrics](metrics_1_results.png) -These *modules* were chosen as they contained the 'src' code for major contributions to the project, their file extensions includes: .kts (kotlin), .java, and .css +These *modules* were chosen as they contained the 'src' code for major contributions to the project, their file extensions include: .kts, .java, and .css ## Library @@ -36,7 +37,9 @@ These *modules* were chosen as they contained the 'src' code for major contribut The libraries used were a mixture of **lizard** and **pygount**. Although, the script was written in Python, these libraries support the analysis of many languages via source code from files. ### Steps to Recreate: - +#### Prequistes + - pip install lizard + - pip install pygount 1. main() - Get the root dir path os.path.abs(path(os.curdir)) - Get all paths that have 'src' folders, save as a list From dad831ea57cf33d695d9714036f82c90a692138e Mon Sep 17 00:00:00 2001 From: luci Date: Mon, 8 Sep 2025 00:45:01 -0400 Subject: [PATCH 10/12] added brief overview --- courseProjectDocs/project-proposal.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/courseProjectDocs/project-proposal.md b/courseProjectDocs/project-proposal.md index a44f25f91e2..05ce9184792 100644 --- a/courseProjectDocs/project-proposal.md +++ b/courseProjectDocs/project-proposal.md @@ -1,3 +1,10 @@ -##Project Overview +## Project Overview + JabRef is an cross platform citation and reference managment tool design to help mangage and find bilibographic data. Key Features include: + - Collections: Users and import references for serveral online scientific catalogs such as Goog Scholar and PubMed, retrieve its metadata using DOI or ISBN, + - Organization: The software allows research to be filtering, manage duplication , add custom data fields and has advance surch features/ Users can allso attach related documents together + - Cite: With the intergrate of LaTeX editors, as more references are added , it can magemange the citations needed in serveral different styles + - Share: Allows users to exort their files with sharign services such as Dropbox, and allows different databases to be sync using a sql database -##Key Quality Metrics + + +## Key Quality Metrics From 4b08b97a1ca9d34c48545c91ddd2d5304e8190d8 Mon Sep 17 00:00:00 2001 From: luci Date: Mon, 8 Sep 2025 00:46:48 -0400 Subject: [PATCH 11/12] moved metrics --- courseProjectDocs/Metrics/README.md | 32 --------------------------- courseProjectDocs/project-proposal.md | 30 ++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 33 deletions(-) diff --git a/courseProjectDocs/Metrics/README.md b/courseProjectDocs/Metrics/README.md index 825e496fbec..e3989683e6b 100644 --- a/courseProjectDocs/Metrics/README.md +++ b/courseProjectDocs/Metrics/README.md @@ -1,37 +1,5 @@ This shows how to recreate the results generated via Metrics code and Test Metrics. -# Key Metrics: -## Code Structure: -### 1. LOC (per file/module) -### 2. Comment Density -### 3. Cyclomatic Complexity -### 4. Number of Unit Tests - -## **Modules**: -| Module | Module | -| ------------- | ------------- | -| build-logic | build-support | -| jabgui | jabkit | -| jablib | jabls | -| jabsrv | jabsrv-cli | -| test-suport | jabls-cli | - -#### + build-logic -#### + build-support -#### + jabgui -#### + jabkit -#### + jablib -#### + jabls -#### + jabls-cli -#### + jabsrv -#### + jabsrv-cli -#### + test-support - -![The Module Results for code metrics](metrics_1_results.png) - -These *modules* were chosen as they contained the 'src' code for major contributions to the project, their file extensions include: .kts, .java, and .css - - ## Library The libraries used were a mixture of **lizard** and **pygount**. Although, the script was written in Python, these libraries support the analysis of many languages via source code from files. diff --git a/courseProjectDocs/project-proposal.md b/courseProjectDocs/project-proposal.md index 05ce9184792..aaed76dc143 100644 --- a/courseProjectDocs/project-proposal.md +++ b/courseProjectDocs/project-proposal.md @@ -5,6 +5,34 @@ - Cite: With the intergrate of LaTeX editors, as more references are added , it can magemange the citations needed in serveral different styles - Share: Allows users to exort their files with sharign services such as Dropbox, and allows different databases to be sync using a sql database +# Key Metrics: +## Code Structure: +### 1. LOC (per file/module) +### 2. Comment Density +### 3. Cyclomatic Complexity +### 4. Number of Unit Tests +## **Modules**: +| Module | Module | +| ------------- | ------------- | +| build-logic | build-support | +| jabgui | jabkit | +| jablib | jabls | +| jabsrv | jabsrv-cli | +| test-suport | jabls-cli | + +#### + build-logic +#### + build-support +#### + jabgui +#### + jabkit +#### + jablib +#### + jabls +#### + jabls-cli +#### + jabsrv +#### + jabsrv-cli +#### + test-support + +![The Module Results for code metrics](metrics_1_results.png) + +These *modules* were chosen as they contained the 'src' code for major contributions to the project, their file extensions include: .kts, .java, and .css -## Key Quality Metrics From 299307ddacf237d6b277135225279eb54db61e51 Mon Sep 17 00:00:00 2001 From: Vanessa <71130347+typewriterbot@users.noreply.github.com> Date: Mon, 8 Sep 2025 09:23:41 -0400 Subject: [PATCH 12/12] Update project-proposal.md fix folder for metrics PNG --- courseProjectDocs/project-proposal.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/courseProjectDocs/project-proposal.md b/courseProjectDocs/project-proposal.md index aaed76dc143..1d8c4febfff 100644 --- a/courseProjectDocs/project-proposal.md +++ b/courseProjectDocs/project-proposal.md @@ -32,7 +32,7 @@ #### + jabsrv-cli #### + test-support -![The Module Results for code metrics](metrics_1_results.png) +![The Module Results for code metrics](Metrics/metrics_1_results.png) These *modules* were chosen as they contained the 'src' code for major contributions to the project, their file extensions include: .kts, .java, and .css