mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-09-15 06:01:50 +00:00
Merge pull request #39432 from deads2k/generic-06-strings
Automatic merge from submit-queue snip pkg/util/strings dependency The `pkg/util/strings` package looks to be largely used by volumes, which are independent of the bits used by genericapiserver which aren't used by anyone else. This moves the single function (used no where else) to its point of use. @sttts
This commit is contained in:
@@ -35,7 +35,6 @@ go_library(
|
|||||||
"//pkg/runtime:go_default_library",
|
"//pkg/runtime:go_default_library",
|
||||||
"//pkg/runtime/schema:go_default_library",
|
"//pkg/runtime/schema:go_default_library",
|
||||||
"//pkg/util/errors:go_default_library",
|
"//pkg/util/errors:go_default_library",
|
||||||
"//pkg/util/strings:go_default_library",
|
|
||||||
"//vendor:github.com/emicklei/go-restful",
|
"//vendor:github.com/emicklei/go-restful",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@@ -26,6 +26,7 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
"unicode"
|
||||||
|
|
||||||
"k8s.io/kubernetes/pkg/api"
|
"k8s.io/kubernetes/pkg/api"
|
||||||
"k8s.io/kubernetes/pkg/api/errors"
|
"k8s.io/kubernetes/pkg/api/errors"
|
||||||
@@ -40,7 +41,6 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/genericapiserver/api/request"
|
"k8s.io/kubernetes/pkg/genericapiserver/api/request"
|
||||||
"k8s.io/kubernetes/pkg/runtime"
|
"k8s.io/kubernetes/pkg/runtime"
|
||||||
"k8s.io/kubernetes/pkg/runtime/schema"
|
"k8s.io/kubernetes/pkg/runtime/schema"
|
||||||
utilstrings "k8s.io/kubernetes/pkg/util/strings"
|
|
||||||
|
|
||||||
"github.com/emicklei/go-restful"
|
"github.com/emicklei/go-restful"
|
||||||
)
|
)
|
||||||
@@ -654,7 +654,7 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
|
|||||||
handler = handlers.CreateResource(creater, reqScope, a.group.Typer, admit)
|
handler = handlers.CreateResource(creater, reqScope, a.group.Typer, admit)
|
||||||
}
|
}
|
||||||
handler = metrics.InstrumentRouteFunc(action.Verb, resource, handler)
|
handler = metrics.InstrumentRouteFunc(action.Verb, resource, handler)
|
||||||
article := utilstrings.GetArticleForNoun(kind, " ")
|
article := getArticleForNoun(kind, " ")
|
||||||
doc := "create" + article + kind
|
doc := "create" + article + kind
|
||||||
if hasSubresource {
|
if hasSubresource {
|
||||||
doc = "create " + subresource + " of" + article + kind
|
doc = "create " + subresource + " of" + article + kind
|
||||||
@@ -670,7 +670,7 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
|
|||||||
addParams(route, action.Params)
|
addParams(route, action.Params)
|
||||||
ws.Route(route)
|
ws.Route(route)
|
||||||
case "DELETE": // Delete a resource.
|
case "DELETE": // Delete a resource.
|
||||||
article := utilstrings.GetArticleForNoun(kind, " ")
|
article := getArticleForNoun(kind, " ")
|
||||||
doc := "delete" + article + kind
|
doc := "delete" + article + kind
|
||||||
if hasSubresource {
|
if hasSubresource {
|
||||||
doc = "delete " + subresource + " of" + article + kind
|
doc = "delete " + subresource + " of" + article + kind
|
||||||
@@ -1080,3 +1080,30 @@ func splitSubresource(path string) (string, string, error) {
|
|||||||
}
|
}
|
||||||
return resource, subresource, nil
|
return resource, subresource, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// getArticleForNoun returns the article needed for the given noun.
|
||||||
|
func getArticleForNoun(noun string, padding string) string {
|
||||||
|
if noun[len(noun)-2:] != "ss" && noun[len(noun)-1:] == "s" {
|
||||||
|
// Plurals don't have an article.
|
||||||
|
// Don't catch words like class
|
||||||
|
return fmt.Sprintf("%v", padding)
|
||||||
|
}
|
||||||
|
|
||||||
|
article := "a"
|
||||||
|
if isVowel(rune(noun[0])) {
|
||||||
|
article = "an"
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Sprintf("%s%s%s", padding, article, padding)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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
|
||||||
|
}
|
||||||
|
@@ -56,3 +56,73 @@ func TestScopeNamingGenerateLink(t *testing.T) {
|
|||||||
t.Errorf("Unexpected error %v", err)
|
t.Errorf("Unexpected error %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetArticleForNoun(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
noun string
|
||||||
|
padding string
|
||||||
|
want string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
noun: "Frog",
|
||||||
|
padding: " ",
|
||||||
|
want: " a ",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
noun: "frogs",
|
||||||
|
padding: " ",
|
||||||
|
want: " ",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
noun: "apple",
|
||||||
|
padding: "",
|
||||||
|
want: "an",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
noun: "Apples",
|
||||||
|
padding: " ",
|
||||||
|
want: " ",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
noun: "Ingress",
|
||||||
|
padding: " ",
|
||||||
|
want: " an ",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
noun: "Class",
|
||||||
|
padding: " ",
|
||||||
|
want: " a ",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
if got := getArticleForNoun(tt.noun, tt.padding); got != tt.want {
|
||||||
|
t.Errorf("%q. GetArticleForNoun() = %v, want %v", tt.noun, got, tt.want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -17,7 +17,6 @@ limitations under the License.
|
|||||||
package strings
|
package strings
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"path"
|
"path"
|
||||||
"strings"
|
"strings"
|
||||||
"unicode"
|
"unicode"
|
||||||
@@ -48,22 +47,6 @@ func ShortenString(str string, n int) string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetArticleForNoun returns the article needed for the given noun.
|
|
||||||
func GetArticleForNoun(noun string, padding string) string {
|
|
||||||
if noun[len(noun)-2:] != "ss" && noun[len(noun)-1:] == "s" {
|
|
||||||
// Plurals don't have an article.
|
|
||||||
// Don't catch words like class
|
|
||||||
return fmt.Sprintf("%v", padding)
|
|
||||||
}
|
|
||||||
|
|
||||||
article := "a"
|
|
||||||
if isVowel(rune(noun[0])) {
|
|
||||||
article = "an"
|
|
||||||
}
|
|
||||||
|
|
||||||
return fmt.Sprintf("%s%s%s", padding, article, padding)
|
|
||||||
}
|
|
||||||
|
|
||||||
// isVowel returns true if the rune is a vowel (case insensitive).
|
// isVowel returns true if the rune is a vowel (case insensitive).
|
||||||
func isVowel(c rune) bool {
|
func isVowel(c rune) bool {
|
||||||
vowels := []rune{'a', 'e', 'i', 'o', 'u'}
|
vowels := []rune{'a', 'e', 'i', 'o', 'u'}
|
||||||
|
@@ -95,49 +95,3 @@ func TestIsVowel(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGetArticleForNoun(t *testing.T) {
|
|
||||||
type args struct {
|
|
||||||
}
|
|
||||||
tests := []struct {
|
|
||||||
noun string
|
|
||||||
padding string
|
|
||||||
want string
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
noun: "Frog",
|
|
||||||
padding: " ",
|
|
||||||
want: " a ",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
noun: "frogs",
|
|
||||||
padding: " ",
|
|
||||||
want: " ",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
noun: "apple",
|
|
||||||
padding: "",
|
|
||||||
want: "an",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
noun: "Apples",
|
|
||||||
padding: " ",
|
|
||||||
want: " ",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
noun: "Ingress",
|
|
||||||
padding: " ",
|
|
||||||
want: " an ",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
noun: "Class",
|
|
||||||
padding: " ",
|
|
||||||
want: " a ",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, tt := range tests {
|
|
||||||
if got := GetArticleForNoun(tt.noun, tt.padding); got != tt.want {
|
|
||||||
t.Errorf("%q. GetArticleForNoun() = %v, want %v", tt.noun, got, tt.want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Reference in New Issue
Block a user