Compare commits

...

5 Commits
v1.0.6 ... main

Author SHA1 Message Date
AI Engineer
b57ea55ad9 chore: infrastructure alignment and doc sync (by AICoder) 2026-05-16 01:23:50 +08:00
AI Engineer
11abde5337 对齐 Tag v1.3.0 (By AI) 2026-05-10 15:48:10 +08:00
AI Engineer
c3b9255f33 chore: final infrastructure alignment 2026-05-10 13:12:00 +08:00
AI Engineer
cec549a915 chore: infrastructure alignment 2026-05-10 13:04:25 +08:00
AI Engineer
fd2ac6079b fix(config): 补充支持无后缀 .yaml 配置文件加载并升级 file 依赖至 v1.0.7 (by AI) 2026-05-09 13:22:40 +08:00
7 changed files with 73 additions and 24 deletions

7
.gitignore vendored Normal file
View File

@ -0,0 +1,7 @@
.ai/
.geminiignore
.gemini
env.json
env.yml
env.yaml
/CODE-FULL.md

View File

@ -1,5 +1,13 @@
# 更新日志 (Changelog) # 更新日志 (Changelog)
## [1.0.7] - 2026-05-09
- **修复**: 在 `resolveConfigPath` 中补充了对无后缀 `.yaml` 配置文件的支持。
- **变更**: 将 `apigo.cc/go/file` 的依赖升级至 `v1.0.7` 以对齐基础设施。
- **变更**: 补充针对无后缀 `.yaml` 文件的回归测试 `TestForYaml_Support`
## [1.0.6] - 2026-05-06
- **变更**: 修复与基础设施的兼容性。
## [1.0.5] - 2026-05-05 ## [1.0.5] - 2026-05-05
- **变更**: 基础设施对齐与生态系统同步发布。 - **变更**: 基础设施对齐与生态系统同步发布。

View File

@ -10,6 +10,7 @@
- `TestForMap_Regression`: 验证基础的基于 Map 的配置加载。 - `TestForMap_Regression`: 验证基础的基于 Map 的配置加载。
- `TestForStruct_Regression`: 验证基于结构体的映射及环境变量覆盖。 - `TestForStruct_Regression`: 验证基于结构体的映射及环境变量覆盖。
- `TestForYml_Regression`: 检查 YAML 配置解析,包括接口切片和映射。 - `TestForYml_Regression`: 检查 YAML 配置解析,包括接口切片和映射。
- `TestForYaml_Support`: 验证针对无后缀 `.yaml` 文件的默认解析支持。
## 基准测试结果 ## 基准测试结果
@ -17,8 +18,8 @@
goos: darwin goos: darwin
goarch: amd64 goarch: amd64
pkg: apigo.cc/go/config pkg: apigo.cc/go/config
BenchmarkLoad-16 9104 123326 ns/op 5136 B/op 104 allocs/op BenchmarkLoad-16 6255 164111 ns/op
BenchmarkApplyEnvOverrides-16 260586 4700 ns/op 2657 B/op 64 allocs/op BenchmarkApplyEnvOverrides-16 294292 3592 ns/op
``` ```
*注:基准测试反映了在 Intel i9-9980HK 上的性能表现。* *注:基准测试反映了在 Intel i9-9980HK 上的性能表现。*

View File

@ -89,10 +89,13 @@ func resolveConfigPath(name string) string {
return "" return ""
} }
// Otherwise, check for .yml then .json // Otherwise, check for .yml, .yaml, then .json
if file.Exists(name + ".yml") { if file.Exists(name + ".yml") {
return name + ".yml" return name + ".yml"
} }
if file.Exists(name + ".yaml") {
return name + ".yaml"
}
if file.Exists(name + ".json") { if file.Exists(name + ".json") {
return name + ".json" return name + ".json"
} }

24
go.mod
View File

@ -3,26 +3,16 @@ module apigo.cc/go/config
go 1.25.0 go 1.25.0
require ( require (
apigo.cc/go/cast v1.2.7 apigo.cc/go/cast v1.3.3
apigo.cc/go/file v1.0.6 apigo.cc/go/file v1.3.2
) )
require ( require (
apigo.cc/go/encoding v1.0.5 // indirect apigo.cc/go/encoding v1.3.1 // indirect
apigo.cc/go/rand v1.0.5 // indirect apigo.cc/go/rand v1.3.1 // indirect
apigo.cc/go/safe v1.0.5 // indirect apigo.cc/go/safe v1.3.1 // indirect
github.com/kr/text v0.2.0 // indirect github.com/kr/text v0.2.0 // indirect
golang.org/x/crypto v0.50.0 // indirect golang.org/x/crypto v0.51.0 // indirect
golang.org/x/sys v0.43.0 // indirect golang.org/x/sys v0.44.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect
) )
replace apigo.cc/go/cast => ../cast
replace apigo.cc/go/file => ../file
replace apigo.cc/go/encoding => ../encoding
replace apigo.cc/go/safe => ../safe
replace apigo.cc/go/rand => ../rand

18
go.sum
View File

@ -1,3 +1,13 @@
apigo.cc/go/cast v1.3.3 h1:aln5eDR5DZVWVzZ/y5SJh1gQNgWv2sT82I25NaO9g34=
apigo.cc/go/cast v1.3.3/go.mod h1:lGlwImiOvHxG7buyMWhFzcdvQzmSaoKbmr7bcDfUpHk=
apigo.cc/go/encoding v1.3.1 h1:y8O58KYAyulkThg1O2ji2BqjnFoSvk42sit9I3z+K7Y=
apigo.cc/go/encoding v1.3.1/go.mod h1:xAJk5b83VZ31mXMTnyp0dfMoBKfT/AHDn0u+cQfojgY=
apigo.cc/go/file v1.3.2 h1:pu4oiDyiqgj3/eykfnJf+/6+A9v/Z0b3ClP5XK+lwG4=
apigo.cc/go/file v1.3.2/go.mod h1:vci4h0Pz94mV6dkniQkuyBYERVYeq7/LX4jJVuCg9hs=
apigo.cc/go/rand v1.3.1 h1:7FvsI6PtQ5XrWER0dTiLVo0p7GIxRidT/TBKhVy93j8=
apigo.cc/go/rand v1.3.1/go.mod h1:mZ/4Soa3bk+XvDaqPWJuUe1bfEi4eThBj1XmEAuYxsk=
apigo.cc/go/safe v1.3.1 h1:irTCqPAC97gGsX/Lw5AzLelDt1xXLEZIAaVhLELWe9Q=
apigo.cc/go/safe v1.3.1/go.mod h1:XdOpBhN2vkImalaykYXXmEpczqWa1y3ah6/Q72cdRqE=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
@ -5,10 +15,10 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI=
golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8=
golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ=
golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=

30
yaml_test.go Normal file
View File

@ -0,0 +1,30 @@
package config_test
import (
"os"
"testing"
"apigo.cc/go/config"
)
func TestForYaml_Support(t *testing.T) {
os.Clearenv()
// create a test.yaml without extension in the load call
os.WriteFile("test3.yaml", []byte(`
name: yaml-config
sets: [4, 5, 6]
`), 0644)
defer os.Remove("test3.yaml")
var testConf RegressionConf
if err := config.Load(&testConf, "test3"); err != nil {
t.Errorf("Load failed: %v", err)
}
if testConf.Name != "yaml-config" {
t.Errorf("Expected name yaml-config, got %v", testConf.Name)
}
if len(testConf.Sets) != 3 || testConf.Sets[0] != 4 {
t.Errorf("Sets failed: %v", testConf.Sets)
}
}