Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/2619/import from metric gardener #2875

Merged
merged 55 commits into from
Jul 25, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
f3bce4e
add cli for metric-gardener
Chrisp485 Jun 30, 2022
8d4e5aa
add cli for metric-gardener
Chrisp485 Jun 30, 2022
14982d4
add interactive dialog, adjust gradle
Chrisp485 Jun 30, 2022
6eaf6f7
add filereader
Chrisp485 Jul 1, 2022
bcd620c
add ParserDialogTest.kt
Chrisp485 Jul 1, 2022
a7da286
add call function
Chrisp485 Jul 4, 2022
4c0a616
update dependencies
Chrisp485 Jul 5, 2022
1c6c0b1
anlegen dtos + tests (#2619)
charlotteKehm Jul 14, 2022
00d4ce7
Metric Gardener Importer (#2619)
charlotteKehm Jul 14, 2022
41e69af
Merge branch 'main' into feature/2619/import-from-metric-gardener
MW-Friedrich Jul 15, 2022
dee4b8e
refactor a method-name for more clarity
MW-Friedrich Jul 15, 2022
e4f2e20
fix some formatting
MW-Friedrich Jul 15, 2022
8aebb78
add a test that checks the correct execution of the cli and that file…
MW-Friedrich Jul 15, 2022
249ba4f
fix more formatting #2619
MW-Friedrich Jul 15, 2022
a3ad4ca
use map instead of metrics-object (#2619)
charlotteKehm Jul 18, 2022
4a27344
Merge remote-tracking branch 'origin/feature/2619/import-from-metric-…
charlotteKehm Jul 18, 2022
6ca04fc
delete class + formatting (#2619)
charlotteKehm Jul 18, 2022
50b9459
ressources for tests angepasst (#2619)
charlotteKehm Jul 18, 2022
39fc7c9
Add first rough draft of MetricGardener-script
MW-Friedrich Jul 18, 2022
2831f70
Merge remote-tracking branch 'origin/feature/2619/import-from-metric-…
MW-Friedrich Jul 18, 2022
5999a83
fix parser dialog test (#2619)
charlotteKehm Jul 19, 2022
cdf5e83
Add Metric-Gardener npm dependency
MW-Friedrich Jul 19, 2022
5475c7e
Try pipeline fix #2619
jannikr Jul 20, 2022
70f3351
Merge remote-tracking branch 'origin/feature/2619/import-from-metric-…
MW-Friedrich Jul 20, 2022
cb037d3
Update to Java version 11 #2619
jannikr Jul 20, 2022
20277c5
Merge remote-tracking branch 'origin/feature/2619/import-from-metric-…
MW-Friedrich Jul 20, 2022
358c431
Downgrade pico cli to version 4.6.2 and revert previous changes #2619
jannikr Jul 20, 2022
edc6906
Revert previous changes #2619
jannikr Jul 20, 2022
d6d92b4
Merge remote-tracking branch 'origin/feature/2619/import-from-metric-…
MW-Friedrich Jul 20, 2022
5bdfa59
Remove AutoComplete #2619
jannikr Jul 20, 2022
3cbb76f
Remove subcommand metricgardener for test purposes #2619
jannikr Jul 20, 2022
02da42f
Merge branch 'main' into feature/2619/import-from-metric-gardener
MW-Friedrich Jul 21, 2022
19fc94c
Merge remote-tracking branch 'origin/feature/2619/import-from-metric-…
MW-Friedrich Jul 21, 2022
cdc609e
Revert "Remove subcommand metricgardener for test purposes #2619"
MW-Friedrich Jul 21, 2022
f63f6f1
ccsh metricGardener wieder reinnehmen + integrationstests für windows…
charlotteKehm Jul 21, 2022
505c3e3
test mit java reflections rausnehmen #2619
charlotteKehm Jul 21, 2022
7928b23
remove subcommand metricgardener #2619
charlotteKehm Jul 22, 2022
0445cf5
remove import metricgardener #2619
charlotteKehm Jul 22, 2022
77c6cb0
pfad umbenennung #2619
charlotteKehm Jul 22, 2022
786b42b
metric gardener import wieder reinnehmen #2619
charlotteKehm Jul 22, 2022
495fa55
Merge remote-tracking branch 'origin/feature/2619/import-from-metric-…
MW-Friedrich Jul 22, 2022
e51540b
update the shell script to run metric gardener via Kotlin
MW-Friedrich Jul 22, 2022
4abb322
remove metric gardener from package.json
MW-Friedrich Jul 22, 2022
e687c95
add tests for previously uncovered cases
MW-Friedrich Jul 22, 2022
2ad0917
Merge branch 'main' into feature/2619/import-from-metric-gardener
MW-Friedrich Jul 25, 2022
84c7a5a
remove the option to run metric gardener automatically
MW-Friedrich Jul 25, 2022
0bec8bc
Merge remote-tracking branch 'origin/feature/2619/import-from-metric-…
MW-Friedrich Jul 25, 2022
1ccbb79
additional tests #2619
charlotteKehm Jul 25, 2022
39a88ec
remove a stray metric-gardener import
MW-Friedrich Jul 25, 2022
81b413a
Merge remote-tracking branch 'origin/feature/2619/import-from-metric-…
MW-Friedrich Jul 25, 2022
db28da0
further additional tests #2619
charlotteKehm Jul 25, 2022
d16ceef
adjusting null condition #2619
charlotteKehm Jul 25, 2022
b9e4be1
Changelog hinzufügen #2619
charlotteKehm Jul 25, 2022
803a27b
review issues adjusted #2619
charlotteKehm Jul 25, 2022
983c3fe
added import #2619
charlotteKehm Jul 25, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
8 changes: 6 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,15 @@ and this project adheres to [Semantic Versioning](http://semver.org/)

## [unreleased] (Added 🚀 | Changed | Removed 🗑 | Fixed 🐞 | Chore 👨‍💻 👩‍💻)

## Changed
### Added 🚀

- Transform a metric gardener json file into a code charta json file, that can be correctly visualized [#2675](https://github.com/MaibornWolff/codecharta/pull/2875)

### Changed

- Restore previous selected files when switching back from delta to standard mode [#2891](https://github.com/MaibornWolff/codecharta/pull/2891)

## Fixed 🐞
### Fixed 🐞

- Let file selection always show what is actual rendered within the map [#2891](https://github.com/MaibornWolff/codecharta/pull/2891)

Expand Down
12 changes: 8 additions & 4 deletions analysis/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -150,11 +150,15 @@ task integrationTest(type: Exec) {
if (System.properties['os.name'].toLowerCase().contains('windows')) {
println "In order to run the integration tests a bash script is executed."
println "Make sure to use a shell with bash capability (e.g. GitBash) to run this task."
executable 'bash'
workingDir('test')
args '-c', "./golden_test.sh $version"
}
else {
executable 'sh'
workingDir('test')
args '-c', "./golden_test.sh $version"
}

executable 'sh'
workingDir('test')
args '-c', "./golden_test.sh $version"
}

task jacocoTestReport(type: JacocoReport) {
Expand Down
5 changes: 5 additions & 0 deletions analysis/import/MetricGardenerImporter/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
### Metric-Gardener Importer

This importer receives a json-File generated by the Metric Gardener Importer as input
[metric-gardener ](https://github.com/MaibornWolff/metric-gardener/)and returns a cc.json file.
It is optional to generate a compressed cc.json file.
38 changes: 38 additions & 0 deletions analysis/import/MetricGardenerImporter/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
plugins {
id "com.github.node-gradle.node" version "3.4.0"
}

dependencies {

implementation project(':tools:InteractiveParser')
implementation project(':import:SourceCodeParser')
implementation project(':model')

implementation group: 'io.reactivex.rxjava2', name: 'rxjava', version: '2.2.21'
implementation group: 'org.glassfish.jersey.core', name: 'jersey-client', version: jersey_version
implementation group: 'com.google.code.gson', name: 'gson', version: gson_version
implementation group: 'info.picocli', name: 'picocli', version: picocli_version
implementation group: 'io.github.microutils', name: 'kotlin-logging', version: kotlin_logging_version
implementation group: 'com.github.kotlin-inquirer', name: 'kotlin-inquirer', version: kotlin_inquirer_version
implementation group: 'com.fasterxml.jackson', name: 'jackson-base', version: jackson_version
implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-xml', version: jackson_version
implementation group: 'com.fasterxml.jackson.module', name: 'jackson-module-kotlin', version: jackson_version

implementation group: 'org.slf4j', name: 'slf4j-simple', version: slf4j_version
implementation group: 'org.glassfish.jersey.inject', name: 'jersey-hk2', version: jersey_version
implementation group: 'com.sun.activation', name: 'javax.activation', version: '1.2.0'


testImplementation group: 'junit', name: 'junit', version: junit4_version
testImplementation group: 'org.assertj', name: 'assertj-core', version: assertj_version
testImplementation group: 'org.hamcrest', name: 'hamcrest-core', version: hamcrest_version
testImplementation group: 'org.hamcrest', name: 'hamcrest-library', version: hamcrest_version
testImplementation group: 'io.mockk', name: 'mockk', version: mockk_version
testImplementation group: 'com.github.tomakehurst', name: 'wiremock', version: wiremock_version

testRuntimeOnly group: 'org.junit.vintage', name: 'junit-vintage-engine', version: junit5_version
}

test {
useJUnitPlatform()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package de.maibornwolff.codecharta.importer.metricgardenerimporter

import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import de.maibornwolff.codecharta.importer.metricgardenerimporter.json.MetricGardenerProjectBuilder
import de.maibornwolff.codecharta.importer.metricgardenerimporter.model.MetricGardenerNodes
import de.maibornwolff.codecharta.serialization.ProjectSerializer
import de.maibornwolff.codecharta.tools.interactiveparser.InteractiveParser
import de.maibornwolff.codecharta.tools.interactiveparser.ParserDialogInterface
import mu.KotlinLogging
import picocli.CommandLine
import java.io.BufferedWriter
import java.io.File
import java.io.FileWriter
import java.io.IOException
import java.nio.charset.Charset
import java.nio.file.Paths
import java.util.concurrent.Callable

@CommandLine.Command(
name = "metricgardenerimport",
description = ["generates a cc.json file from a project parsed with metric-gardener"],
footer = ["Copyright(c) 2022, MaibornWolff GmbH"]
)

class MetricGardenerImporter : Callable<Void>, InteractiveParser {

private val logger = KotlinLogging.logger {}
private val mapper = jacksonObjectMapper()

@CommandLine.Option(
names = ["-h", "--help"], usageHelp = true,
description = ["Specify: path/to/input/folder/or/file -o path/to/outputfile.json"]
)
private var help = false

@CommandLine.Parameters(
arity = "1", paramLabel = "FOLDER or FILE",
description = ["path for project folder or code file"]
)
private var inputFile = File("")

@CommandLine.Option(names = ["-o", "--output-file"], description = ["output File (or empty for stdout)"])
private var outputFile = File("")

@CommandLine.Option(names = ["-nc", "--not-compressed"], description = ["save uncompressed output File"])
private var compress = true

@Throws(IOException::class)
override fun call(): Void? {
if (!inputFile.exists()) {
printErrorLog()
return null
}
val metricGardenerNodes: MetricGardenerNodes =
mapper.readValue(inputFile.reader(Charset.defaultCharset()), MetricGardenerNodes::class.java)
val metricGardenerProjectBuilder = MetricGardenerProjectBuilder(metricGardenerNodes)
val project = metricGardenerProjectBuilder.build()
val filePath = outputFile.absolutePath ?: "notSpecified"
if (compress && filePath != "notSpecified") {
ProjectSerializer.serializeAsCompressedFile(project, filePath)
} else {
val outputWriter = BufferedWriter(FileWriter(outputFile))
ProjectSerializer.serializeProject(project, outputWriter)
}

return null
}

private fun printErrorLog() {
val path = Paths.get("").toAbsolutePath().toString()
logger.error { "Current working directory = $path" }
logger.error { "Could not find $inputFile" }
}

companion object {

@JvmStatic
fun main(args: Array<String>) {
CommandLine.call(MetricGardenerImporter(), System.out, *args)
}
}

override fun getDialog(): ParserDialogInterface = ParserDialog
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package de.maibornwolff.codecharta.importer.metricgardenerimporter

import com.github.kinquirer.KInquirer
import com.github.kinquirer.components.promptConfirm
import com.github.kinquirer.components.promptInput
import de.maibornwolff.codecharta.tools.interactiveparser.ParserDialogInterface

class ParserDialog {
companion object : ParserDialogInterface {

override fun collectParserArgs(): List<String> {
val inputFile = KInquirer.promptInput(
message = "What Project do you want to parse?",
hint = "path/to/my/project"
)

val outputFileName: String = KInquirer.promptInput(
message = "What is the name of the output file?",
hint = "path/to/output/filename.cc.json"
)

val isCompressed: Boolean =
KInquirer.promptConfirm(message = "Do you want to compress the output file?", default = true)

return listOfNotNull(
inputFile,
"--output-file=$outputFileName",
if (isCompressed) null else "--not-compressed"
)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package de.maibornwolff.codecharta.importer.metricgardenerimporter.json

import de.maibornwolff.codecharta.importer.metricgardenerimporter.model.MetricGardenerNode
import de.maibornwolff.codecharta.importer.metricgardenerimporter.model.MetricGardenerNodes
import de.maibornwolff.codecharta.model.MutableNode
import de.maibornwolff.codecharta.model.NodeType
import de.maibornwolff.codecharta.model.Project
import de.maibornwolff.codecharta.model.ProjectBuilder
import mu.KotlinLogging

class MetricGardenerProjectBuilder(var metricGardenerNodes: MetricGardenerNodes) : ProjectBuilder() {

private val logger = KotlinLogging.logger {}

override fun build(): Project {
var i = 0
for (inputNode in metricGardenerNodes.metricGardenerNodes) {
val node = generateCodeChartaFileNode(inputNode)
insertByPath(inputNode.getPathWithoutFileName(), node)
i = i.inc()
logger.info { "$i. Node von ${metricGardenerNodes.metricGardenerNodes.size} MetricGardenerNodes wurde eingelesen." }
}
return super.build()
}

fun generateCodeChartaFileNode(metricGardenerNode: MetricGardenerNode): MutableNode {
return MutableNode(extractFileNameFromPath(metricGardenerNode.name), NodeType.File, metricGardenerNode.metrics, "", setOf())
}

private fun extractFileNameFromPath(path: String?): String {
if (!path.isNullOrBlank()) {
return path.split("\\").reversed().get(0)
}
return ""
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package de.maibornwolff.codecharta.importer.metricgardenerimporter.model

import com.fasterxml.jackson.annotation.JsonIgnoreProperties
import com.fasterxml.jackson.annotation.JsonProperty
import de.maibornwolff.codecharta.model.Path

@JsonIgnoreProperties("types")
class MetricGardenerNode(
@JsonProperty("name") var name: String?,
@JsonProperty("type") var type: String?,
@JsonProperty("metrics") var metrics: Map<String, Any>
) {

fun getPathWithoutFileName(): Path {
if (!name.isNullOrBlank()) {
return Path(name!!.split("\\").dropLast(1))
}
return Path(emptyList())
}

override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false

other as MetricGardenerNode

if (name != other.name) return false
if (type != other.type) return false
if (metrics != other.metrics) return false

return true
}

override fun hashCode(): Int {
var result = name?.hashCode() ?: 0
result = 31 * result + (type?.hashCode() ?: 0)
result = 31 * result + metrics.hashCode()
return result
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package de.maibornwolff.codecharta.importer.metricgardenerimporter.model

import com.fasterxml.jackson.annotation.JsonIgnoreProperties
import com.fasterxml.jackson.annotation.JsonProperty

@JsonIgnoreProperties("relationships")
class MetricGardenerNodes(
@JsonProperty("nodes") var metricGardenerNodes: MutableList<MetricGardenerNode>
) {

override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false

other as MetricGardenerNodes

if (metricGardenerNodes != other.metricGardenerNodes) return false

return true
}

override fun hashCode(): Int {
return metricGardenerNodes.hashCode()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package de.maibornwolff.codecharta.importer.metricgardenerimporter

import de.maibornwolff.codecharta.importer.metricgardenerimporter.MetricGardenerImporter.Companion.main
import org.junit.jupiter.api.Assertions.assertFalse
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
import java.io.File

class MetricGardenerImporterTest {

private val metricGardenerImporter = MetricGardenerImporter()

@Test
fun `should create json uncompressed file`() {
main(
arrayOf(
"src/test/resources/metricgardener-analysis.json", "-nc",
"-o=src/test/resources/metricgardener-analysis.cc.json"
)
)
val file = File("src/test/resources/metricgardener-analysis.cc.json")
file.deleteOnExit()

assertTrue(file.exists())
}

@Test
fun `should create json gzip file`() {
main(
arrayOf(
"src/test/resources/metricgardener-analysis.json",
"-o=src/test/resources/metricgardener-analysis.cc.json"
)
)
val file = File("src/test/resources/metricgardener-analysis.cc.json.gz")
file.deleteOnExit()

assertTrue(file.exists())
}

@Test
fun `should create no file when the input file was not specified`() {
main(
arrayOf(
"-o=src/test/resources/metricgardener-analysis.cc.json"
)
)
val file = File("src/test/resources/metricgardener-analysis.cc.json.gz")
file.deleteOnExit()
metricGardenerImporter.call()
assertFalse(file.exists())
}
}