Skip to content

Commit 64b1b3f

Browse files
authored
feat(docs): support lang for fetch v2 (#1459)
1 parent a0e83c7 commit 64b1b3f

4 files changed

Lines changed: 80 additions & 1 deletion

File tree

internal/core/config.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,8 +265,8 @@ func ResolveConfigFromMulti(raw *MultiAppConfig, kc keychain.KeychainAccess, pro
265265
AppID: app.AppId,
266266
AppSecret: secret,
267267
Brand: app.Brand,
268-
DefaultAs: app.DefaultAs,
269268
Lang: app.Lang,
269+
DefaultAs: app.DefaultAs,
270270
}
271271
if len(app.Users) > 0 {
272272
cfg.UserOpenId = app.Users[0].UserOpenId

internal/core/config_test.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,27 @@ func TestResolveConfigFromMulti_AcceptsPlainSecret(t *testing.T) {
132132
}
133133
}
134134

135+
func TestResolveConfigFromMulti_CarriesLang(t *testing.T) {
136+
raw := &MultiAppConfig{
137+
Apps: []AppConfig{
138+
{
139+
AppId: "cli_abc",
140+
AppSecret: PlainSecret("my-secret"),
141+
Brand: BrandFeishu,
142+
Lang: "en",
143+
},
144+
},
145+
}
146+
147+
cfg, err := ResolveConfigFromMulti(raw, nil, "")
148+
if err != nil {
149+
t.Fatalf("unexpected error: %v", err)
150+
}
151+
if cfg.Lang != "en" {
152+
t.Errorf("Lang = %q, want %q", cfg.Lang, "en")
153+
}
154+
}
155+
135156
func TestResolveConfigFromMulti_MatchingKeychainRefPassesValidation(t *testing.T) {
136157
// Keychain ref matches appId, so validation passes.
137158
// The subsequent ResolveSecretInput will fail (no real keychain),

shortcuts/doc/docs_fetch_v2.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ func v2FetchFlags() []common.Flag {
1919
return []common.Flag{
2020
{Name: "doc-format", Desc: "output content format; xml keeps DocxXML structure and optional block ids, markdown is plain export", Default: "xml", Enum: []string{"xml", "markdown"}},
2121
{Name: "detail", Desc: "detail level; simple for reading, with-ids for block references, full for styles and edit metadata", Default: "simple", Enum: []string{"simple", "with-ids", "full"}},
22+
{Name: "lang", Desc: "user cite display language, e.g. en-US, zh-CN, ja-JP"},
2223
{Name: "revision-id", Desc: "document revision id; -1 means latest", Type: "int", Default: "-1"},
2324
{Name: "scope", Desc: "read scope; full reads whole doc, outline lists headings, section expands from heading anchor, range uses block ids, keyword searches text", Default: "full", Enum: []string{"full", "outline", "range", "keyword", "section"}},
2425
{Name: "start-block-id", Desc: "range/section anchor block id; required for section and optional start for range"},
@@ -89,6 +90,9 @@ func buildFetchBody(runtime *common.RuntimeContext) map[string]interface{} {
8990
if v := runtime.Int("revision-id"); v > 0 {
9091
body["revision_id"] = v
9192
}
93+
if lang := resolveFetchLang(runtime); lang != "" {
94+
body["lang"] = lang
95+
}
9296

9397
detail := effectiveFetchDetail(runtime)
9498
switch detail {
@@ -118,6 +122,16 @@ func buildFetchBody(runtime *common.RuntimeContext) map[string]interface{} {
118122
return body
119123
}
120124

125+
func resolveFetchLang(runtime *common.RuntimeContext) string {
126+
if runtime.Changed("lang") {
127+
return strings.TrimSpace(runtime.Str("lang"))
128+
}
129+
if runtime.Config == nil {
130+
return ""
131+
}
132+
return strings.TrimSpace(string(runtime.Config.Lang))
133+
}
134+
121135
// buildReadOption 拼装 read_option JSON;full/空模式返回 nil,让服务端走默认全文路径。
122136
func buildReadOption(runtime *common.RuntimeContext) map[string]interface{} {
123137
mode := strings.TrimSpace(runtime.Str("scope"))

shortcuts/doc/docs_fetch_v2_test.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"testing"
1111

1212
"github.com/larksuite/cli/internal/cmdutil"
13+
"github.com/larksuite/cli/internal/core"
1314
"github.com/larksuite/cli/internal/httpmock"
1415
"github.com/larksuite/cli/shortcuts/common"
1516
"github.com/spf13/cobra"
@@ -62,6 +63,47 @@ func TestBuildFetchBodyOmitsEmptyScene(t *testing.T) {
6263
}
6364
}
6465

66+
func TestBuildFetchBodyIncludesExplicitLang(t *testing.T) {
67+
t.Parallel()
68+
69+
runtime := newFetchBodyTestRuntime(context.Background())
70+
if err := runtime.Cmd.Flags().Set("lang", "en-US"); err != nil {
71+
t.Fatalf("set lang: %v", err)
72+
}
73+
74+
body := buildFetchBody(runtime)
75+
if got := body["lang"]; got != "en-US" {
76+
t.Fatalf("lang = %#v, want %q", got, "en-US")
77+
}
78+
}
79+
80+
func TestBuildFetchBodyUsesRuntimeConfigLang(t *testing.T) {
81+
t.Parallel()
82+
83+
runtime := newFetchBodyTestRuntime(context.Background())
84+
runtime.Config = &core.CliConfig{Lang: "zh_cn"}
85+
86+
body := buildFetchBody(runtime)
87+
if got := body["lang"]; got != "zh_cn" {
88+
t.Fatalf("lang = %#v, want %q", got, "zh_cn")
89+
}
90+
}
91+
92+
func TestBuildFetchBodyExplicitBlankLangOmitsLang(t *testing.T) {
93+
t.Parallel()
94+
95+
runtime := newFetchBodyTestRuntime(context.Background())
96+
runtime.Config = &core.CliConfig{Lang: "zh_cn"}
97+
if err := runtime.Cmd.Flags().Set("lang", ""); err != nil {
98+
t.Fatalf("set lang: %v", err)
99+
}
100+
101+
body := buildFetchBody(runtime)
102+
if _, ok := body["lang"]; ok {
103+
t.Fatalf("did not expect blank explicit lang in fetch body: %#v", body)
104+
}
105+
}
106+
65107
func TestDocsFetchDryRunDefaultsToV2Endpoint(t *testing.T) {
66108
t.Parallel()
67109

@@ -262,6 +304,7 @@ func newFetchBodyTestRuntime(ctx context.Context) *common.RuntimeContext {
262304
cmd := &cobra.Command{Use: "+fetch"}
263305
cmd.Flags().String("doc-format", "xml", "")
264306
cmd.Flags().String("detail", "simple", "")
307+
cmd.Flags().String("lang", "", "")
265308
cmd.Flags().Int("revision-id", -1, "")
266309
cmd.Flags().String("scope", "full", "")
267310
cmd.Flags().String("start-block-id", "", "")
@@ -281,6 +324,7 @@ func newFetchShortcutTestRuntime(t *testing.T, apiVersion string, setFlags map[s
281324
cmd.Flags().String("doc", "doxcnFetchDryRun", "")
282325
cmd.Flags().String("doc-format", "xml", "")
283326
cmd.Flags().String("detail", "simple", "")
327+
cmd.Flags().String("lang", "", "")
284328
cmd.Flags().Int("revision-id", -1, "")
285329
cmd.Flags().String("scope", "full", "")
286330
cmd.Flags().String("start-block-id", "", "")

0 commit comments

Comments
 (0)