Skip to content

Commit 5bb3228

Browse files
authored
Merge pull request #1 from acgray/master
Support for transforming lowerCamel operation IDs to kebab-case
2 parents 71a54e0 + b039da8 commit 5bb3228

2 files changed

Lines changed: 46 additions & 18 deletions

File tree

main.go

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"log"
99
"os"
1010
"path"
11+
"regexp"
1112
"sort"
1213
"strconv"
1314
"strings"
@@ -368,17 +369,17 @@ func ProcessAPI(shortName string, api *openapi3.Swagger) *OpenAPI {
368369
}
369370

370371
o := &Operation{
371-
HandlerName: slug(name),
372-
GoName: toGoName(name, true),
373-
Use: use,
374-
Aliases: aliases,
375-
Short: short,
376-
Long: escapeString(description),
377-
Method: method,
378-
CanHaveBody: method == "Post" || method == "Put" || method == "Patch",
379-
ReturnType: returnType,
380-
Path: path,
381-
AllParams: params,
372+
HandlerName: Slug(name),
373+
GoName: toGoName(name, true),
374+
Use: use,
375+
Aliases: aliases,
376+
Short: short,
377+
Long: escapeString(description),
378+
Method: method,
379+
CanHaveBody: method == "Post" || method == "Put" || method == "Patch",
380+
ReturnType: returnType,
381+
Path: path,
382+
AllParams: params,
382383
RequiredParams: requiredParams,
383384
OptionalParams: optionalParams,
384385
MediaType: reqMt,
@@ -418,7 +419,7 @@ func ProcessAPI(shortName string, api *openapi3.Swagger) *OpenAPI {
418419
}
419420

420421
for name, waiter := range waiters {
421-
waiter.CLIName = slug(name)
422+
waiter.CLIName = Slug(name)
422423
waiter.GoName = toGoName(name+"-waiter", true)
423424
waiter.Operation = operationMap[waiter.OperationID]
424425
waiter.Use = usage(name, waiter.Operation.RequiredParams)
@@ -512,18 +513,20 @@ func escapeString(value string) string {
512513
return transformed
513514
}
514515

515-
func slug(operationID string) string {
516-
transformed := strings.ToLower(operationID)
516+
func Slug(operationID string) string {
517+
re, _ := regexp.Compile("([a-z])([A-Z])")
518+
transformed := re.ReplaceAllString(operationID, "$1-$2")
519+
transformed = strings.ToLower(transformed)
517520
transformed = strings.Replace(transformed, "_", "-", -1)
518521
transformed = strings.Replace(transformed, " ", "-", -1)
519522
return transformed
520523
}
521524

522525
func usage(name string, requiredParams []*Param) string {
523-
usage := slug(name)
526+
usage := Slug(name)
524527

525528
for _, p := range requiredParams {
526-
usage += " " + slug(p.Name)
529+
usage += " " + Slug(p.Name)
527530
}
528531

529532
return usage
@@ -555,7 +558,7 @@ func getParams(path *openapi3.PathItem, httpMethod string) []*Param {
555558
}
556559
}
557560

558-
cliName := slug(p.Value.Name)
561+
cliName := Slug(p.Value.Name)
559562
if p.Value.Extensions[ExtName] != nil {
560563
cliName = extStr(p.Value.Extensions[ExtName])
561564
}
@@ -724,7 +727,7 @@ func generate(cmd *cobra.Command, args []string) {
724727

725728
funcs := template.FuncMap{
726729
"escapeStr": escapeString,
727-
"slug": slug,
730+
"Slug": Slug,
728731
"title": strings.Title,
729732
}
730733

main_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"context"
66
"encoding/json"
77
"fmt"
8+
main "github.com/danielgtaylor/openapi-cli-generator"
89
"io/ioutil"
910
"net/http"
1011
"os"
@@ -71,3 +72,27 @@ func TestEchoSuccess(t *testing.T) {
7172

7273
assert.JSONEq(t, "{\"hello\": \"world\", \"q\": \"foo\", \"request-id\": \"bar\"}", string(out))
7374
}
75+
76+
func Test_slug(t *testing.T) {
77+
type args struct {
78+
operationID string
79+
}
80+
tests := []struct {
81+
name string
82+
args args
83+
want string
84+
}{
85+
{name: "lowercase with spaces", args: args{operationID: "get all articles"}, want: "get-all-articles"},
86+
{name: "Mixed sentence case", args: args{operationID: "Get all articles"}, want: "get-all-articles"},
87+
{name: "lower snake case", args: args{operationID: "get_all_articles"}, want: "get-all-articles"},
88+
{name: "upper snake case", args: args{operationID: "GET_ALL_ARTICLES"}, want: "get-all-articles"},
89+
{name: "kebab case", args: args{operationID: "get-all-articles"}, want: "get-all-articles"},
90+
}
91+
for _, tt := range tests {
92+
t.Run(tt.name, func(t *testing.T) {
93+
if got := main.Slug(tt.args.operationID); got != tt.want {
94+
t.Errorf("Slug() = %v, want %v", got, tt.want)
95+
}
96+
})
97+
}
98+
}

0 commit comments

Comments
 (0)