From 531fe17a0b61dd791bab7ddc7beebb69a4867937 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christofer=20Ba=CC=88cklin?= Date: Fri, 24 Nov 2017 11:42:41 +0100 Subject: [PATCH 1/8] Kafka version parsing. --- utils.go | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/utils.go b/utils.go index 70ecab247..d65c89b1b 100644 --- a/utils.go +++ b/utils.go @@ -3,6 +3,7 @@ package sarama import ( "bufio" "net" + "fmt" ) type none struct{} @@ -135,6 +136,32 @@ func (v KafkaVersion) IsAtLeast(other KafkaVersion) bool { return true } +func (v KafkaVersion) String() string { + return fmt.Sprintf("%d.%d.%d.%d", v.version[0], v.version[1], v.version[2], v.version[3]) +} + +func ParseKafkaVersion(s string) (version KafkaVersion, ok bool) { + versions := []KafkaVersion{ + V0_8_2_0, + V0_8_2_1, + V0_8_2_2, + V0_9_0_0, + V0_9_0_1, + V0_10_0_0, + V0_10_0_1, + V0_10_1_0, + V0_10_2_0, + V0_11_0_0, + V1_0_0_0, + } + for _, v := range versions { + if s == v.String() { + return v, true + } + } + return minVersion, false +} + // Effective constants defining the supported kafka versions. var ( V0_8_2_0 = newKafkaVersion(0, 8, 2, 0) From 14c7ebb2601e8bed6592c3c470046f636d971952 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christofer=20Ba=CC=88cklin?= Date: Fri, 24 Nov 2017 13:54:20 +0100 Subject: [PATCH 2/8] Protoc style version parsing. --- utils.go | 54 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/utils.go b/utils.go index d65c89b1b..df61d67d2 100644 --- a/utils.go +++ b/utils.go @@ -136,32 +136,6 @@ func (v KafkaVersion) IsAtLeast(other KafkaVersion) bool { return true } -func (v KafkaVersion) String() string { - return fmt.Sprintf("%d.%d.%d.%d", v.version[0], v.version[1], v.version[2], v.version[3]) -} - -func ParseKafkaVersion(s string) (version KafkaVersion, ok bool) { - versions := []KafkaVersion{ - V0_8_2_0, - V0_8_2_1, - V0_8_2_2, - V0_9_0_0, - V0_9_0_1, - V0_10_0_0, - V0_10_0_1, - V0_10_1_0, - V0_10_2_0, - V0_11_0_0, - V1_0_0_0, - } - for _, v := range versions { - if s == v.String() { - return v, true - } - } - return minVersion, false -} - // Effective constants defining the supported kafka versions. var ( V0_8_2_0 = newKafkaVersion(0, 8, 2, 0) @@ -177,3 +151,31 @@ var ( V1_0_0_0 = newKafkaVersion(1, 0, 0, 0) minVersion = V0_8_2_0 ) + +var KafkaVersion_value = map[string]KafkaVersion{ + "0.8.2.0": V0_8_2_0, + "0.8.2.1": V0_8_2_1, + "0.8.2.2": V0_8_2_2, + "0.9.0.0": V0_9_0_0, + "0.9.0.1": V0_9_0_1, + "0.10.0.0": V0_10_0_0, + "0.10.0.1": V0_10_0_1, + "0.10.1.0": V0_10_1_0, + "0.10.2.0": V0_10_2_0, + "0.11.0.0": V0_11_0_0, + "1.0.0.0": V1_0_0_0, +} + +var KafkaVersion_name = map[KafkaVersion]string{ + V0_8_2_0: "0.8.2.0", + V0_8_2_1: "0.8.2.1", + V0_8_2_2: "0.8.2.2", + V0_9_0_0: "0.9.0.0", + V0_9_0_1: "0.9.0.1", + V0_10_0_0: "0.10.0.0", + V0_10_0_1: "0.10.0.1", + V0_10_1_0: "0.10.1.0", + V0_10_2_0: "0.10.2.0", + V0_11_0_0: "0.11.0.0", + V1_0_0_0: "1.0.0.0", +} From e56ada368c739b44394e8ba755bc86cf9e8c6beb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christofer=20Ba=CC=88cklin?= Date: Fri, 24 Nov 2017 13:56:25 +0100 Subject: [PATCH 3/8] To string method. --- utils.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/utils.go b/utils.go index df61d67d2..8d6b39650 100644 --- a/utils.go +++ b/utils.go @@ -179,3 +179,7 @@ var KafkaVersion_name = map[KafkaVersion]string{ V0_11_0_0: "0.11.0.0", V1_0_0_0: "1.0.0.0", } + +func (v KafkaVersion) String() string { + return KafkaVersion_name[v] +} From 68402418ff8bf4b02da68fa443044cc9c4eae355 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christofer=20Ba=CC=88cklin?= Date: Fri, 24 Nov 2017 14:02:15 +0100 Subject: [PATCH 4/8] Ditched protoc naming style in favour of go fmt. --- utils.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/utils.go b/utils.go index 8d6b39650..9b5578637 100644 --- a/utils.go +++ b/utils.go @@ -3,7 +3,6 @@ package sarama import ( "bufio" "net" - "fmt" ) type none struct{} @@ -152,7 +151,7 @@ var ( minVersion = V0_8_2_0 ) -var KafkaVersion_value = map[string]KafkaVersion{ +var KafkaVersionValue = map[string]KafkaVersion{ "0.8.2.0": V0_8_2_0, "0.8.2.1": V0_8_2_1, "0.8.2.2": V0_8_2_2, @@ -166,7 +165,7 @@ var KafkaVersion_value = map[string]KafkaVersion{ "1.0.0.0": V1_0_0_0, } -var KafkaVersion_name = map[KafkaVersion]string{ +var KafkaVersionName = map[KafkaVersion]string{ V0_8_2_0: "0.8.2.0", V0_8_2_1: "0.8.2.1", V0_8_2_2: "0.8.2.2", @@ -181,5 +180,5 @@ var KafkaVersion_name = map[KafkaVersion]string{ } func (v KafkaVersion) String() string { - return KafkaVersion_name[v] + return KafkaVersionName[v] } From 85c62b8d883edf0723e8c5cf3da57b5e93902d4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christofer=20Ba=CC=88cklin?= Date: Fri, 24 Nov 2017 14:05:16 +0100 Subject: [PATCH 5/8] Updated 1.0.0 to official naming. --- utils.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/utils.go b/utils.go index 9b5578637..3de2afd9c 100644 --- a/utils.go +++ b/utils.go @@ -152,31 +152,31 @@ var ( ) var KafkaVersionValue = map[string]KafkaVersion{ - "0.8.2.0": V0_8_2_0, - "0.8.2.1": V0_8_2_1, - "0.8.2.2": V0_8_2_2, - "0.9.0.0": V0_9_0_0, - "0.9.0.1": V0_9_0_1, + "0.8.2.0": V0_8_2_0, + "0.8.2.1": V0_8_2_1, + "0.8.2.2": V0_8_2_2, + "0.9.0.0": V0_9_0_0, + "0.9.0.1": V0_9_0_1, "0.10.0.0": V0_10_0_0, "0.10.0.1": V0_10_0_1, "0.10.1.0": V0_10_1_0, "0.10.2.0": V0_10_2_0, "0.11.0.0": V0_11_0_0, - "1.0.0.0": V1_0_0_0, + "1.0.0": V1_0_0_0, } var KafkaVersionName = map[KafkaVersion]string{ - V0_8_2_0: "0.8.2.0", - V0_8_2_1: "0.8.2.1", - V0_8_2_2: "0.8.2.2", - V0_9_0_0: "0.9.0.0", - V0_9_0_1: "0.9.0.1", + V0_8_2_0: "0.8.2.0", + V0_8_2_1: "0.8.2.1", + V0_8_2_2: "0.8.2.2", + V0_9_0_0: "0.9.0.0", + V0_9_0_1: "0.9.0.1", V0_10_0_0: "0.10.0.0", V0_10_0_1: "0.10.0.1", V0_10_1_0: "0.10.1.0", V0_10_2_0: "0.10.2.0", V0_11_0_0: "0.11.0.0", - V1_0_0_0: "1.0.0.0", + V1_0_0_0: "1.0.0", } func (v KafkaVersion) String() string { From 0142770068f57d97b0472fb12ea470a6404df1f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christofer=20Ba=CC=88cklin?= Date: Fri, 24 Nov 2017 17:02:11 +0100 Subject: [PATCH 6/8] Tests for KafkaVersion name and value handling. --- utils_test.go | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/utils_test.go b/utils_test.go index a9e09502c..07c81f0ca 100644 --- a/utils_test.go +++ b/utils_test.go @@ -19,3 +19,37 @@ func TestVersionCompare(t *testing.T) { t.Error("0.8.2.1 >= 0.10.0.0") } } + +func TestVersionValues(t *testing.T) { + validNames := []string{"0.8.2.0", "0.8.2.1", "0.9.0.0", "0.10.2.0", "1.0.0"} + for _, name := range validNames { + if _, ok := KafkaVersionValue[name]; !ok { + t.Errorf("valid version name %s missing in value map", name) + } + } + + invalidNames := []string{"0.8.2.4", "0.8.20.1", "0.19.0.0", "1.0.x"} + for _, name := range invalidNames { + if _, ok := KafkaVersionValue[name]; ok { + t.Errorf("invalid version name %s found in value map", name) + } + } +} + +func TestVersionNames(t *testing.T) { + validValues := map[string]KafkaVersion{ + "V0_8_2_0": V0_8_2_0, + "V0_8_2_1": V0_8_2_1, + "V0_9_0_0": V0_9_0_0, + "V0_10_2_0": V0_10_2_0, + "V1_0_0_0": V1_0_0_0, + } + for s, value := range validValues { + if _, ok := KafkaVersionName[value]; !ok { + t.Errorf("kafka version %s missing in name map", s) + } + if value.String() == "" { + t.Errorf("%s.String() == \"\"", s) + } + } +} From 92016a11d0800135e359c4ac2c12021c6a0c73b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christofer=20Ba=CC=88cklin?= Date: Sat, 25 Nov 2017 14:17:30 +0100 Subject: [PATCH 7/8] Changed to scan implementation. --- utils.go | 54 +++++++++++++++++++++++++-------------------------- utils_test.go | 38 ++++++++++++------------------------ 2 files changed, 39 insertions(+), 53 deletions(-) diff --git a/utils.go b/utils.go index 3de2afd9c..a4ea9f425 100644 --- a/utils.go +++ b/utils.go @@ -3,6 +3,8 @@ package sarama import ( "bufio" "net" + "fmt" + "regexp" ) type none struct{} @@ -151,34 +153,32 @@ var ( minVersion = V0_8_2_0 ) -var KafkaVersionValue = map[string]KafkaVersion{ - "0.8.2.0": V0_8_2_0, - "0.8.2.1": V0_8_2_1, - "0.8.2.2": V0_8_2_2, - "0.9.0.0": V0_9_0_0, - "0.9.0.1": V0_9_0_1, - "0.10.0.0": V0_10_0_0, - "0.10.0.1": V0_10_0_1, - "0.10.1.0": V0_10_1_0, - "0.10.2.0": V0_10_2_0, - "0.11.0.0": V0_11_0_0, - "1.0.0": V1_0_0_0, -} - -var KafkaVersionName = map[KafkaVersion]string{ - V0_8_2_0: "0.8.2.0", - V0_8_2_1: "0.8.2.1", - V0_8_2_2: "0.8.2.2", - V0_9_0_0: "0.9.0.0", - V0_9_0_1: "0.9.0.1", - V0_10_0_0: "0.10.0.0", - V0_10_0_1: "0.10.0.1", - V0_10_1_0: "0.10.1.0", - V0_10_2_0: "0.10.2.0", - V0_11_0_0: "0.11.0.0", - V1_0_0_0: "1.0.0", +func ParseKafkaVersion(s string) (KafkaVersion, error) { + var major, minor, veryMinor, patch uint + var err error + if s[0] == '0' { + err = scanKafkaVersion(s, `^0.\d+.\d+.\d+$`, "0.%d.%d.%d", [3]*uint{&minor, &veryMinor, &patch}) + } else { + err = scanKafkaVersion(s, `^\d+.\d+.\d+$`, "%d.%d.%d", [3]*uint{&major, &minor, &veryMinor}) + } + if err != nil { + return minVersion, err + } + return newKafkaVersion(major, minor, veryMinor, patch), nil +} + +func scanKafkaVersion(s string, pattern string, format string, v [3]*uint) error { + if !regexp.MustCompile(pattern).MatchString(s) { + return fmt.Errorf("invalid version `%s`", s) + } + _, err := fmt.Sscanf(s, format, v[0], v[1], v[2]) + return err } func (v KafkaVersion) String() string { - return KafkaVersionName[v] + if v.version[0] == 0 { + return fmt.Sprintf("0.%d.%d.%d", v.version[1], v.version[2], v.version[3]) + } else { + return fmt.Sprintf("%d.%d.%d", v.version[0], v.version[1], v.version[2]) + } } diff --git a/utils_test.go b/utils_test.go index 07c81f0ca..013620e55 100644 --- a/utils_test.go +++ b/utils_test.go @@ -20,36 +20,22 @@ func TestVersionCompare(t *testing.T) { } } -func TestVersionValues(t *testing.T) { - validNames := []string{"0.8.2.0", "0.8.2.1", "0.9.0.0", "0.10.2.0", "1.0.0"} - for _, name := range validNames { - if _, ok := KafkaVersionValue[name]; !ok { - t.Errorf("valid version name %s missing in value map", name) +func TestVersionParsing(t *testing.T) { + validVersions := []string{"0.8.2.0", "0.8.2.1", "0.9.0.0", "0.10.2.0", "1.0.0"} + for _, s := range validVersions { + v, err := ParseKafkaVersion(s) + if err != nil { + t.Errorf("could not parse valid version %s: %s", s, err) } - } - - invalidNames := []string{"0.8.2.4", "0.8.20.1", "0.19.0.0", "1.0.x"} - for _, name := range invalidNames { - if _, ok := KafkaVersionValue[name]; ok { - t.Errorf("invalid version name %s found in value map", name) + if v.String() != s { + t.Errorf("version %s != %s", v.String(), s) } } -} -func TestVersionNames(t *testing.T) { - validValues := map[string]KafkaVersion{ - "V0_8_2_0": V0_8_2_0, - "V0_8_2_1": V0_8_2_1, - "V0_9_0_0": V0_9_0_0, - "V0_10_2_0": V0_10_2_0, - "V1_0_0_0": V1_0_0_0, - } - for s, value := range validValues { - if _, ok := KafkaVersionName[value]; !ok { - t.Errorf("kafka version %s missing in name map", s) - } - if value.String() == "" { - t.Errorf("%s.String() == \"\"", s) + invalidVersions := []string{"0.8.2-4", "0.8.20", "1.19.0.0", "1.0.x"} + for _, s := range invalidVersions { + if _, err := ParseKafkaVersion(s); err == nil { + t.Errorf("invalid version %s parsed without error", s) } } } From 7c2db934144b8a043fddc8a4fe957d2157ab8b01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christofer=20Ba=CC=88cklin?= Date: Sun, 26 Nov 2017 07:38:54 +0100 Subject: [PATCH 8/8] go fmt --- utils.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils.go b/utils.go index a4ea9f425..abb063678 100644 --- a/utils.go +++ b/utils.go @@ -2,8 +2,8 @@ package sarama import ( "bufio" - "net" "fmt" + "net" "regexp" )