Skip to content

Commit

Permalink
add tests; split up logic of diagram creation
Browse files Browse the repository at this point in the history
  • Loading branch information
KarnerTh committed Feb 9, 2023
1 parent 2188ef6 commit 0141c2f
Show file tree
Hide file tree
Showing 9 changed files with 356 additions and 167 deletions.
5 changes: 3 additions & 2 deletions analyzer/analyzer.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,12 @@ import (

"github.com/KarnerTh/mermerd/config"
"github.com/KarnerTh/mermerd/database"
"github.com/KarnerTh/mermerd/presentation"
"github.com/KarnerTh/mermerd/util"
)

type analyzer struct {
loadingSpinner util.LoadingSpinner
loadingSpinner presentation.LoadingSpinner
config config.MermerdConfig
connectorFactory database.ConnectorFactory
questioner Questioner
Expand All @@ -27,7 +28,7 @@ type Analyzer interface {
}

func NewAnalyzer(config config.MermerdConfig, connectorFactory database.ConnectorFactory, questioner Questioner) Analyzer {
loadingSpinner := util.NewLoadingSpinner()
loadingSpinner := presentation.NewLoadingSpinner()
return analyzer{loadingSpinner, config, connectorFactory, questioner}
}

Expand Down
10 changes: 5 additions & 5 deletions cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import (
"github.com/KarnerTh/mermerd/config"
"github.com/KarnerTh/mermerd/database"
"github.com/KarnerTh/mermerd/diagram"
"github.com/KarnerTh/mermerd/util"
"github.com/KarnerTh/mermerd/presentation"
)

var runConfig string
Expand All @@ -24,7 +24,7 @@ var rootCmd = &cobra.Command{
Short: "Create Mermaid ERD diagrams from existing tables",
Long: "Create Mermaid ERD diagrams from existing tables",
Run: func(cmd *cobra.Command, args []string) {
util.ShowIntro()
presentation.ShowIntro()
config := config.NewConfig()
connectorFactory := database.NewConnectorFactory()
questioner := analyzer.NewQuestioner()
Expand All @@ -38,18 +38,18 @@ var rootCmd = &cobra.Command{
result, err := analyzer.Analyze()
if err != nil {
logrus.Error(err)
util.ShowError()
presentation.ShowError()
os.Exit(1)
}

err = diagram.Create(result)
if err != nil {
logrus.Error(err)
util.ShowError()
presentation.ShowError()
os.Exit(1)
}

util.ShowSuccess(config.OutputFileName())
presentation.ShowSuccess(config.OutputFileName())
},
}

Expand Down
61 changes: 3 additions & 58 deletions diagram/diagram.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,22 +49,7 @@ func (d diagram) Create(result *database.Result) error {

columnData := make([]ErdColumnData, len(table.Columns))
for columnIndex, column := range table.Columns {
attributeKey := getAttributeKey(column)
if d.config.OmitAttributeKeys() {
attributeKey = none
}

var enumValues string
if d.config.ShowEnumValues() {
enumValues = column.EnumValues
}

columnData[columnIndex] = ErdColumnData{
Name: column.Name,
DataType: column.DataType,
EnumValues: enumValues,
AttributeKey: attributeKey,
}
columnData[columnIndex] = getColumnData(d.config, column)
}

tableData[tableIndex] = ErdTableData{
Expand All @@ -75,21 +60,11 @@ func (d diagram) Create(result *database.Result) error {

var constraints []ErdConstraintData
for _, constraint := range allConstraints {
if (!tableNameInSlice(tableData, constraint.PkTable) || !tableNameInSlice(tableData, constraint.FkTable)) && !d.config.ShowAllConstraints() {
if shouldSkipConstraint(d.config, tableData, constraint) {
continue
}

constraintLabel := constraint.ColumnName
if d.config.OmitConstraintLabels() {
constraintLabel = ""
}

constraints = append(constraints, ErdConstraintData{
PkTableName: constraint.PkTable,
FkTableName: constraint.FkTable,
Relation: getRelation(constraint),
ConstraintLabel: constraintLabel,
})
constraints = append(constraints, getConstraintData(d.config, constraint))
}

diagramData := ErdDiagramData{
Expand All @@ -104,33 +79,3 @@ func (d diagram) Create(result *database.Result) error {
}
return nil
}

func getRelation(constraint database.ConstraintResult) ErdRelationType {
if constraint.IsPrimary && !constraint.HasMultiplePK {
return relationOneToOne
} else {
return relationManyToOne
}
}

func tableNameInSlice(slice []ErdTableData, tableName string) bool {
for _, sliceItem := range slice {
if sliceItem.Name == tableName {
return true
}
}

return false
}

func getAttributeKey(column database.ColumnResult) ErdAttributeKey {
if column.IsPrimary {
return primaryKey
}

if column.IsForeign {
return foreignKey
}

return none
}
99 changes: 0 additions & 99 deletions diagram/diagram_test.go

This file was deleted.

78 changes: 78 additions & 0 deletions diagram/diagram_util.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package diagram

import (
"github.com/KarnerTh/mermerd/config"
"github.com/KarnerTh/mermerd/database"
)

func getRelation(constraint database.ConstraintResult) ErdRelationType {
if constraint.IsPrimary && !constraint.HasMultiplePK {
return relationOneToOne
} else {
return relationManyToOne
}
}

func tableNameInSlice(slice []ErdTableData, tableName string) bool {
for _, sliceItem := range slice {
if sliceItem.Name == tableName {
return true
}
}

return false
}

func getAttributeKey(column database.ColumnResult) ErdAttributeKey {
if column.IsPrimary {
return primaryKey
}

if column.IsForeign {
return foreignKey
}

return none
}

func getColumnData(config config.MermerdConfig, column database.ColumnResult) ErdColumnData {
attributeKey := getAttributeKey(column)
if config.OmitAttributeKeys() {
attributeKey = none
}

var enumValues string
if config.ShowEnumValues() {
enumValues = column.EnumValues
}

return ErdColumnData{
Name: column.Name,
DataType: column.DataType,
EnumValues: enumValues,
AttributeKey: attributeKey,
}
}

func shouldSkipConstraint(config config.MermerdConfig, tables []ErdTableData, constraint database.ConstraintResult) bool {
if config.ShowAllConstraints() {
return false
}

// if config for all constraints is not set, only show constraints of selected tables
return !(tableNameInSlice(tables, constraint.PkTable) && tableNameInSlice(tables, constraint.FkTable))
}

func getConstraintData(config config.MermerdConfig, constraint database.ConstraintResult) ErdConstraintData {
constraintLabel := constraint.ColumnName
if config.OmitConstraintLabels() {
constraintLabel = ""
}

return ErdConstraintData{
PkTableName: constraint.PkTable,
FkTableName: constraint.FkTable,
Relation: getRelation(constraint),
ConstraintLabel: constraintLabel,
}
}
Loading

0 comments on commit 0141c2f

Please sign in to comment.