[object Object]

← back to Cli Printing Press

fix(cli): handle sentry openapi generation (#507)

e37cff9d36101695268636badbeb341670f9e9ff · 2026-05-02 15:30:33 -0500 · Cathryn Lavery

Files touched

Diff

commit e37cff9d36101695268636badbeb341670f9e9ff
Author: Cathryn Lavery <50469282+cathrynlavery@users.noreply.github.com>
Date:   Sat May 2 15:30:33 2026 -0500

    fix(cli): handle sentry openapi generation (#507)
---
 internal/generator/templates/store.go.tmpl | 17 ++++++++++++++--
 internal/openapi/parser.go                 | 16 ++++++++++++---
 internal/openapi/parser_test.go            | 32 ++++++++++++++++++++++++++++++
 3 files changed, 60 insertions(+), 5 deletions(-)

diff --git a/internal/generator/templates/store.go.tmpl b/internal/generator/templates/store.go.tmpl
index cd8dcd13..60c6e4ce 100644
--- a/internal/generator/templates/store.go.tmpl
+++ b/internal/generator/templates/store.go.tmpl
@@ -583,7 +583,7 @@ func ftsRowID(id string) int64 {
 // way — a divergence here produces silent drops on heterogeneous payloads.
 func LookupFieldValue(obj map[string]any, snakeKey string) any {
 	if v, ok := obj[snakeKey]; ok {
-		return v
+		return sqliteFieldValue(v)
 	}
 	parts := strings.Split(snakeKey, "_")
 	for i := 1; i < len(parts); i++ {
@@ -593,11 +593,24 @@ func LookupFieldValue(obj map[string]any, snakeKey string) any {
 		parts[i] = strings.ToUpper(parts[i][:1]) + parts[i][1:]
 	}
 	if v, ok := obj[strings.Join(parts, "")]; ok {
-		return v
+		return sqliteFieldValue(v)
 	}
 	return nil
 }
 
+func sqliteFieldValue(v any) any {
+	switch v.(type) {
+	case nil, string, bool, int, int64, float64, []byte:
+		return v
+	default:
+		data, err := json.Marshal(v)
+		if err != nil {
+			return fmt.Sprint(v)
+		}
+		return string(data)
+	}
+}
+
 // lookupFieldValue is kept as an unexported alias for in-package callers so
 // the existing UpsertBatch code reads naturally without prefixing every call
 // with the package name.
diff --git a/internal/openapi/parser.go b/internal/openapi/parser.go
index eeff4aad..e104c1fb 100644
--- a/internal/openapi/parser.go
+++ b/internal/openapi/parser.go
@@ -428,7 +428,13 @@ func mapAuth(doc *openapi3.T, name string) spec.AuthConfig {
 			auth.EnvVars = []string{envPrefix + "_API_KEY"}
 		}
 	case "bearer_token":
-		auth.EnvVars = []string{envPrefix + "_TOKEN"}
+		schemeEnvSuffix := toSnakeCase(schemeName)
+		switch schemeEnvSuffix {
+		case "", "bearer", "bearer_token", "token":
+			auth.EnvVars = []string{envPrefix + "_TOKEN"}
+		default:
+			auth.EnvVars = []string{envPrefix + "_" + strings.ToUpper(schemeEnvSuffix)}
+		}
 	}
 
 	return auth
@@ -2671,10 +2677,14 @@ func isGenericAPIPrefix(segment string) bool {
 }
 
 func isVersionSegment(segment string) bool {
-	if len(segment) < 2 || segment[0] != 'v' {
+	if segment == "" {
 		return false
 	}
-	_, err := strconv.Atoi(segment[1:])
+	if segment[0] == 'v' && len(segment) >= 2 {
+		_, err := strconv.Atoi(segment[1:])
+		return err == nil
+	}
+	_, err := strconv.Atoi(segment)
 	return err == nil
 }
 
diff --git a/internal/openapi/parser_test.go b/internal/openapi/parser_test.go
index 038604c9..7df204d9 100644
--- a/internal/openapi/parser_test.go
+++ b/internal/openapi/parser_test.go
@@ -160,6 +160,37 @@ func TestParseGmailOAuth2(t *testing.T) {
 	assert.NotEmpty(t, parsed.Auth.Scopes)
 }
 
+func TestBearerSchemeNameCanSpecializeEnvVar(t *testing.T) {
+	t.Parallel()
+
+	spec := []byte(`openapi: "3.0.3"
+info:
+  title: Sentry
+  version: "1.0"
+servers:
+  - url: https://example.com
+components:
+  securitySchemes:
+    auth_token:
+      type: http
+      scheme: bearer
+paths:
+  /api/0/organizations/:
+    get:
+      operationId: List Your Organizations
+      security:
+        - auth_token: []
+      responses:
+        "200":
+          description: ok
+`)
+	parsed, err := Parse(spec)
+	require.NoError(t, err)
+
+	assert.Equal(t, "bearer_token", parsed.Auth.Type)
+	assert.Equal(t, []string{"SENTRY_AUTH_TOKEN"}, parsed.Auth.EnvVars)
+}
+
 func TestSkipUnderscoreFields(t *testing.T) {
 	spec := []byte(`
 openapi: "3.0.0"
@@ -413,6 +444,7 @@ func TestPathSegmentsStripsGenericAPIPrefix(t *testing.T) {
 		{"strips version then api", "/v1/api/networkentity", "", "networkentity"},
 		{"strips api then version", "/api/v2/pokemon", "", "pokemon"},
 		{"strips version then api then version", "/v2/api/v1/pokemon", "", "pokemon"},
+		{"strips api then numeric version", "/api/0/organizations", "", "organizations"},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {

← 73468bac feat(cli): README template links to release page for binary  ·  back to Cli Printing Press  ·  chore(main): release 3.6.0 (#509) 53203a0c →