From b9601f011f49e281f36f72970436e9ae4210bd16 Mon Sep 17 00:00:00 2001 From: beatrausch Date: Sat, 22 Jun 2024 08:04:38 +0200 Subject: [PATCH] extented marker with custom prefix --- pkg/machinery/marker.go | 33 +++++++++++++++++++++++++++++---- pkg/machinery/marker_test.go | 26 ++++++++++++++++++++++++-- 2 files changed, 53 insertions(+), 6 deletions(-) diff --git a/pkg/machinery/marker.go b/pkg/machinery/marker.go index 893fff5c2a..017c696c19 100644 --- a/pkg/machinery/marker.go +++ b/pkg/machinery/marker.go @@ -22,7 +22,7 @@ import ( "strings" ) -const prefix = "+kubebuilder:scaffold:" +const kbPrefix = "+kubebuilder:scaffold:" var commentsByExt = map[string]string{ ".go": "//", @@ -33,6 +33,7 @@ var commentsByExt = map[string]string{ // Marker represents a machine-readable comment that will be used for scaffolding purposes type Marker struct { + prefix string comment string value string } @@ -40,9 +41,19 @@ type Marker struct { // NewMarkerFor creates a new marker customized for the specific file // Supported file extensions: .go, .yaml, .yml func NewMarkerFor(path string, value string) Marker { + return NewMarkerWithPrefixFor(kbPrefix, path, value) +} + +// NewMarkerWithPrefixFor creates a new prefixed marker customized for the specific file +// Supported file extensions: .go, .yaml, .yml +func NewMarkerWithPrefixFor(prefix string, path string, value string) Marker { ext := filepath.Ext(path) if comment, found := commentsByExt[ext]; found { - return Marker{comment, value} + return Marker{ + prefix: markerPrefix(prefix), + comment: comment, + value: value, + } } extensions := make([]string, 0, len(commentsByExt)) @@ -54,13 +65,13 @@ func NewMarkerFor(path string, value string) Marker { // String implements Stringer func (m Marker) String() string { - return m.comment + " " + prefix + m.value + return m.comment + " " + m.prefix + m.value } // EqualsLine compares a marker with a string representation to check if they are the same marker func (m Marker) EqualsLine(line string) bool { line = strings.TrimSpace(strings.TrimPrefix(strings.TrimSpace(line), m.comment)) - return line == prefix+m.value + return line == m.prefix+m.value } // CodeFragments represents a set of code fragments @@ -69,3 +80,17 @@ type CodeFragments []string // CodeFragmentsMap binds Markers and CodeFragments together type CodeFragmentsMap map[Marker]CodeFragments + +func markerPrefix(prefix string) string { + trimmed := strings.TrimSpace(prefix) + var builder strings.Builder + if !strings.HasPrefix(trimmed, "+") { + builder.WriteString("+") + } + builder.WriteString(trimmed) + if !strings.HasSuffix(trimmed, ":") { + builder.WriteString(":") + } + + return builder.String() +} diff --git a/pkg/machinery/marker_test.go b/pkg/machinery/marker_test.go index 17220a81fe..0cab6b0c28 100644 --- a/pkg/machinery/marker_test.go +++ b/pkg/machinery/marker_test.go @@ -39,8 +39,30 @@ var _ = Describe("Marker", func() { Context("String", func() { DescribeTable("should return the right string representation", func(marker Marker, str string) { Expect(marker.String()).To(Equal(str)) }, - Entry("for go files", Marker{comment: "//", value: "test"}, "// +kubebuilder:scaffold:test"), - Entry("for yaml files", Marker{comment: "#", value: "test"}, "# +kubebuilder:scaffold:test"), + Entry("for go files", Marker{prefix: kbPrefix, comment: "//", value: "test"}, "// +kubebuilder:scaffold:test"), + Entry("for yaml files", Marker{prefix: kbPrefix, comment: "#", value: "test"}, "# +kubebuilder:scaffold:test"), + ) + }) +}) + +var _ = Describe("NewMarkerFor", func() { + Context("String", func() { + DescribeTable("should return the right string representation", + func(marker Marker, str string) { Expect(marker.String()).To(Equal(str)) }, + Entry("for yaml files", NewMarkerFor("test.yaml", "test"), "# +kubebuilder:scaffold:test"), + ) + }) +}) + +var _ = Describe("NewMarkerWithPrefixFor", func() { + Context("String", func() { + DescribeTable("should return the right string representation", + func(marker Marker, str string) { Expect(marker.String()).To(Equal(str)) }, + Entry("for yaml files", NewMarkerWithPrefixFor("custom:scaffold", "test.yaml", "test"), "# +custom:scaffold:test"), + Entry("for yaml files", NewMarkerWithPrefixFor("+custom:scaffold", "test.yaml", "test"), "# +custom:scaffold:test"), + Entry("for yaml files", NewMarkerWithPrefixFor("custom:scaffold:", "test.yaml", "test"), "# +custom:scaffold:test"), + Entry("for yaml files", NewMarkerWithPrefixFor("+custom:scaffold:", "test.yaml", "test"), "# +custom:scaffold:test"), + Entry("for yaml files", NewMarkerWithPrefixFor(" +custom:scaffold: ", "test.yaml", "test"), "# +custom:scaffold:test"), ) }) })