mirror of https://github.com/k3s-io/k3s
clean pkg/util/strings
parent
093328e57f
commit
6535689680
|
@ -52,7 +52,6 @@ filegroup(
|
|||
"//pkg/util/rlimit:all-srcs",
|
||||
"//pkg/util/selinux:all-srcs",
|
||||
"//pkg/util/slice:all-srcs",
|
||||
"//pkg/util/strings:all-srcs",
|
||||
"//pkg/util/sysctl:all-srcs",
|
||||
"//pkg/util/system:all-srcs",
|
||||
"//pkg/util/tail:all-srcs",
|
||||
|
|
|
@ -1,40 +0,0 @@
|
|||
package(default_visibility = ["//visibility:public"])
|
||||
|
||||
load(
|
||||
"@io_bazel_rules_go//go:def.bzl",
|
||||
"go_library",
|
||||
"go_test",
|
||||
)
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = [
|
||||
"escape.go",
|
||||
"line_delimiter.go",
|
||||
"strings.go",
|
||||
],
|
||||
importpath = "k8s.io/kubernetes/pkg/util/strings",
|
||||
)
|
||||
|
||||
go_test(
|
||||
name = "go_default_test",
|
||||
srcs = [
|
||||
"escape_test.go",
|
||||
"line_delimiter_test.go",
|
||||
"strings_test.go",
|
||||
],
|
||||
embed = [":go_default_library"],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "package-srcs",
|
||||
srcs = glob(["**"]),
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:private"],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "all-srcs",
|
||||
srcs = [":package-srcs"],
|
||||
tags = ["automanaged"],
|
||||
)
|
|
@ -1,49 +0,0 @@
|
|||
/*
|
||||
Copyright 2014 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package strings
|
||||
|
||||
import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
// EscapePluginName converts a plugin name in the format
|
||||
// vendor/pluginname into a proper ondisk vendor~pluginname plugin directory
|
||||
// format.
|
||||
func EscapePluginName(in string) string {
|
||||
return strings.Replace(in, "/", "~", -1)
|
||||
}
|
||||
|
||||
// UnescapePluginName converts a plugin directory name in the format
|
||||
// vendor~pluginname into a proper vendor/pluginname.
|
||||
func UnescapePluginName(in string) string {
|
||||
return strings.Replace(in, "~", "/", -1)
|
||||
}
|
||||
|
||||
// EscapeQualifiedNameForDisk converts a plugin name, which might contain a / into a
|
||||
// string that is safe to use on-disk. This assumes that the input has already
|
||||
// been validates as a qualified name. we use "~" rather than ":" here in case
|
||||
// we ever use a filesystem that doesn't allow ":".
|
||||
func EscapeQualifiedNameForDisk(in string) string {
|
||||
return strings.Replace(in, "/", "~", -1)
|
||||
}
|
||||
|
||||
// UnescapeQualifiedNameForDisk converts an escaped plugin name (as per EscapeQualifiedNameForDisk)
|
||||
// back to its normal form. This assumes that the input has already been
|
||||
// validates as a qualified name.
|
||||
func UnescapeQualifiedNameForDisk(in string) string {
|
||||
return strings.Replace(in, "~", "/", -1)
|
||||
}
|
|
@ -1,63 +0,0 @@
|
|||
/*
|
||||
Copyright 2016 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package strings
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestEscapePluginName(t *testing.T) {
|
||||
testCases := []struct {
|
||||
input string
|
||||
output string
|
||||
}{
|
||||
{"kubernetes.io/blah", "kubernetes.io~blah"},
|
||||
{"blah/blerg/borg", "blah~blerg~borg"},
|
||||
{"kubernetes.io", "kubernetes.io"},
|
||||
}
|
||||
for i, tc := range testCases {
|
||||
escapee := EscapePluginName(tc.input)
|
||||
if escapee != tc.output {
|
||||
t.Errorf("case[%d]: expected (%q), got (%q)", i, tc.output, escapee)
|
||||
}
|
||||
original := UnescapePluginName(escapee)
|
||||
if original != tc.input {
|
||||
t.Errorf("case[%d]: expected (%q), got (%q)", i, tc.input, original)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestEscapeQualifiedNameForDisk(t *testing.T) {
|
||||
testCases := []struct {
|
||||
input string
|
||||
output string
|
||||
}{
|
||||
{"kubernetes.io/blah", "kubernetes.io~blah"},
|
||||
{"blah/blerg/borg", "blah~blerg~borg"},
|
||||
{"kubernetes.io", "kubernetes.io"},
|
||||
}
|
||||
for i, tc := range testCases {
|
||||
escapee := EscapeQualifiedNameForDisk(tc.input)
|
||||
if escapee != tc.output {
|
||||
t.Errorf("case[%d]: expected (%q), got (%q)", i, tc.output, escapee)
|
||||
}
|
||||
original := UnescapeQualifiedNameForDisk(escapee)
|
||||
if original != tc.input {
|
||||
t.Errorf("case[%d]: expected (%q), got (%q)", i, tc.input, original)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,64 +0,0 @@
|
|||
/*
|
||||
Copyright 2015 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package strings
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// LineDelimiter is a filter that will split input on lines
|
||||
// and bracket each line with the delimiter string.
|
||||
type LineDelimiter struct {
|
||||
output io.Writer
|
||||
delimiter []byte
|
||||
buf bytes.Buffer
|
||||
}
|
||||
|
||||
// NewLineDelimiter allocates a new io.Writer that will split input on lines
|
||||
// and bracket each line with the delimiter string. This can be useful in
|
||||
// output tests where it is difficult to see and test trailing whitespace.
|
||||
func NewLineDelimiter(output io.Writer, delimiter string) *LineDelimiter {
|
||||
return &LineDelimiter{output: output, delimiter: []byte(delimiter)}
|
||||
}
|
||||
|
||||
// Write writes buf to the LineDelimiter ld. The only errors returned are ones
|
||||
// encountered while writing to the underlying output stream.
|
||||
func (ld *LineDelimiter) Write(buf []byte) (n int, err error) {
|
||||
return ld.buf.Write(buf)
|
||||
}
|
||||
|
||||
// Flush all lines up until now. This will assume insert a linebreak at the current point of the stream.
|
||||
func (ld *LineDelimiter) Flush() (err error) {
|
||||
lines := strings.Split(ld.buf.String(), "\n")
|
||||
for _, line := range lines {
|
||||
if _, err = ld.output.Write(ld.delimiter); err != nil {
|
||||
return
|
||||
}
|
||||
if _, err = ld.output.Write([]byte(line)); err != nil {
|
||||
return
|
||||
}
|
||||
if _, err = ld.output.Write(ld.delimiter); err != nil {
|
||||
return
|
||||
}
|
||||
if _, err = ld.output.Write([]byte("\n")); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
|
@ -1,40 +0,0 @@
|
|||
/*
|
||||
Copyright 2015 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package strings
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
)
|
||||
|
||||
func Example_trailingNewline() {
|
||||
ld := NewLineDelimiter(os.Stdout, "|")
|
||||
defer ld.Flush()
|
||||
fmt.Fprint(ld, " Hello \n World \n")
|
||||
// Output:
|
||||
// | Hello |
|
||||
// | World |
|
||||
// ||
|
||||
}
|
||||
func Example_noTrailingNewline() {
|
||||
ld := NewLineDelimiter(os.Stdout, "|")
|
||||
defer ld.Flush()
|
||||
fmt.Fprint(ld, " Hello \n World ")
|
||||
// Output:
|
||||
// | Hello |
|
||||
// | World |
|
||||
}
|
|
@ -1,58 +0,0 @@
|
|||
/*
|
||||
Copyright 2014 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package strings
|
||||
|
||||
import (
|
||||
"path"
|
||||
"strings"
|
||||
"unicode"
|
||||
)
|
||||
|
||||
// SplitQualifiedName splits a fully qualified name and returns its namespace and name.
|
||||
// Assumes that the input 'str' has been validated.
|
||||
func SplitQualifiedName(str string) (string, string) {
|
||||
parts := strings.Split(str, "/")
|
||||
if len(parts) < 2 {
|
||||
return "", str
|
||||
}
|
||||
return parts[0], parts[1]
|
||||
}
|
||||
|
||||
// JoinQualifiedName joins 'namespace' and 'name' and returns a fully qualified name
|
||||
// Assumes that the input is valid.
|
||||
func JoinQualifiedName(namespace, name string) string {
|
||||
return path.Join(namespace, name)
|
||||
}
|
||||
|
||||
// ShortenString returns the first N slice of a string.
|
||||
func ShortenString(str string, n int) string {
|
||||
if len(str) <= n {
|
||||
return str
|
||||
}
|
||||
return str[:n]
|
||||
}
|
||||
|
||||
// isVowel returns true if the rune is a vowel (case insensitive).
|
||||
func isVowel(c rune) bool {
|
||||
vowels := []rune{'a', 'e', 'i', 'o', 'u'}
|
||||
for _, value := range vowels {
|
||||
if value == unicode.ToLower(c) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
|
@ -1,97 +0,0 @@
|
|||
/*
|
||||
Copyright 2014 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package strings
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestSplitQualifiedName(t *testing.T) {
|
||||
testCases := []struct {
|
||||
input string
|
||||
output []string
|
||||
}{
|
||||
{"kubernetes.io/blah", []string{"kubernetes.io", "blah"}},
|
||||
{"blah", []string{"", "blah"}},
|
||||
{"kubernetes.io/blah/blah", []string{"kubernetes.io", "blah"}},
|
||||
}
|
||||
for i, tc := range testCases {
|
||||
namespace, name := SplitQualifiedName(tc.input)
|
||||
if namespace != tc.output[0] || name != tc.output[1] {
|
||||
t.Errorf("case[%d]: expected (%q, %q), got (%q, %q)", i, tc.output[0], tc.output[1], namespace, name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestJoinQualifiedName(t *testing.T) {
|
||||
testCases := []struct {
|
||||
input []string
|
||||
output string
|
||||
}{
|
||||
{[]string{"kubernetes.io", "blah"}, "kubernetes.io/blah"},
|
||||
{[]string{"blah", ""}, "blah"},
|
||||
{[]string{"kubernetes.io", "blah"}, "kubernetes.io/blah"},
|
||||
}
|
||||
for i, tc := range testCases {
|
||||
res := JoinQualifiedName(tc.input[0], tc.input[1])
|
||||
if res != tc.output {
|
||||
t.Errorf("case[%d]: expected %q, got %q", i, tc.output, res)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestShortenString(t *testing.T) {
|
||||
testCases := []struct {
|
||||
input string
|
||||
outLen int
|
||||
output string
|
||||
}{
|
||||
{"kubernetes.io", 5, "kuber"},
|
||||
{"blah", 34, "blah"},
|
||||
{"kubernetes.io", 13, "kubernetes.io"},
|
||||
}
|
||||
for i, tc := range testCases {
|
||||
res := ShortenString(tc.input, tc.outLen)
|
||||
if res != tc.output {
|
||||
t.Errorf("case[%d]: expected %q, got %q", i, tc.output, res)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestIsVowel(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
arg rune
|
||||
want bool
|
||||
}{
|
||||
{
|
||||
name: "yes",
|
||||
arg: 'E',
|
||||
want: true,
|
||||
},
|
||||
{
|
||||
name: "no",
|
||||
arg: 'n',
|
||||
want: false,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
if got := isVowel(tt.arg); got != tt.want {
|
||||
t.Errorf("%q. IsVowel() = %v, want %v", tt.name, got, tt.want)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -802,7 +802,6 @@ k8s.io/kubernetes/pkg/util/oom,vishh,0,
|
|||
k8s.io/kubernetes/pkg/util/parsers,derekwaynecarr,1,
|
||||
k8s.io/kubernetes/pkg/util/procfs,roberthbailey,1,
|
||||
k8s.io/kubernetes/pkg/util/slice,quinton-hoole,0,
|
||||
k8s.io/kubernetes/pkg/util/strings,quinton-hoole,0,
|
||||
k8s.io/kubernetes/pkg/util/system,mwielgus,0,
|
||||
k8s.io/kubernetes/pkg/util/tail,zmerlynn,1,
|
||||
k8s.io/kubernetes/pkg/util/taints,rrati,0,
|
||||
|
|
|
Loading…
Reference in New Issue