andrey
9 months ago
6 changed files with 1180 additions and 0 deletions
File diff suppressed because it is too large
@ -0,0 +1,15 @@ |
|||||
|
module gitoa.ru/go-4devs/config/provider/ini |
||||
|
|
||||
|
go 1.21 |
||||
|
|
||||
|
require ( |
||||
|
github.com/stretchr/testify v1.8.4 |
||||
|
gitoa.ru/go-4devs/config v0.0.1 |
||||
|
gopkg.in/ini.v1 v1.67.0 |
||||
|
) |
||||
|
|
||||
|
require ( |
||||
|
github.com/davecgh/go-spew v1.1.1 // indirect |
||||
|
github.com/pmezard/go-difflib v1.0.0 // indirect |
||||
|
gopkg.in/yaml.v3 v3.0.1 // indirect |
||||
|
) |
@ -0,0 +1,14 @@ |
|||||
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= |
||||
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= |
||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= |
||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= |
||||
|
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= |
||||
|
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= |
||||
|
gitoa.ru/go-4devs/config v0.0.1 h1:9KrOO09YbIMO8qL8aVn/G74DurGdOIW5y3O02bays4I= |
||||
|
gitoa.ru/go-4devs/config v0.0.1/go.mod h1:xfEC2Al9xnMLJUuekYs3KhJ5BIzWAseNwkMwbN6/xss= |
||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= |
||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= |
||||
|
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= |
||||
|
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= |
||||
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= |
||||
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= |
@ -0,0 +1,58 @@ |
|||||
|
package ini |
||||
|
|
||||
|
import ( |
||||
|
"context" |
||||
|
"fmt" |
||||
|
"strings" |
||||
|
|
||||
|
"gitoa.ru/go-4devs/config" |
||||
|
"gitoa.ru/go-4devs/config/value" |
||||
|
"gopkg.in/ini.v1" |
||||
|
) |
||||
|
|
||||
|
const ( |
||||
|
Name = "ini" |
||||
|
Separator = "." |
||||
|
) |
||||
|
|
||||
|
var _ config.Provider = (*Provider)(nil) |
||||
|
|
||||
|
func New(data *ini.File) *Provider { |
||||
|
return &Provider{ |
||||
|
data: data, |
||||
|
resolve: func(path []string) (string, string) { |
||||
|
if len(path) == 1 { |
||||
|
return "", path[0] |
||||
|
} |
||||
|
|
||||
|
return strings.Join(path[:len(path)-1], Separator), strings.ToUpper(path[len(path)-1]) |
||||
|
}, |
||||
|
name: Name, |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
type Provider struct { |
||||
|
data *ini.File |
||||
|
resolve func(path []string) (string, string) |
||||
|
name string |
||||
|
} |
||||
|
|
||||
|
func (p *Provider) Name() string { |
||||
|
return p.name |
||||
|
} |
||||
|
|
||||
|
func (p *Provider) Value(_ context.Context, path ...string) (config.Value, error) { |
||||
|
section, name := p.resolve(path) |
||||
|
|
||||
|
iniSection, err := p.data.GetSection(section) |
||||
|
if err != nil { |
||||
|
return nil, fmt.Errorf("%w: %s: %w", config.ErrValueNotFound, p.Name(), err) |
||||
|
} |
||||
|
|
||||
|
iniKey, err := iniSection.GetKey(name) |
||||
|
if err != nil { |
||||
|
return nil, fmt.Errorf("%w: %s: %w", config.ErrValueNotFound, p.Name(), err) |
||||
|
} |
||||
|
|
||||
|
return value.JString(iniKey.String()), nil |
||||
|
} |
@ -0,0 +1,38 @@ |
|||||
|
package ini_test |
||||
|
|
||||
|
import ( |
||||
|
"embed" |
||||
|
"testing" |
||||
|
"time" |
||||
|
|
||||
|
"github.com/stretchr/testify/require" |
||||
|
"gitoa.ru/go-4devs/config/provider/ini" |
||||
|
"gitoa.ru/go-4devs/config/test" |
||||
|
lib "gopkg.in/ini.v1" |
||||
|
) |
||||
|
|
||||
|
//go:embed fixture/*
|
||||
|
var fixtures embed.FS |
||||
|
|
||||
|
func TestProvider(t *testing.T) { |
||||
|
t.Parallel() |
||||
|
|
||||
|
data, derr := fixtures.ReadFile("fixture/config.ini") |
||||
|
require.NoError(t, derr) |
||||
|
|
||||
|
file, err := lib.Load(data) |
||||
|
require.NoError(t, err) |
||||
|
|
||||
|
read := []test.Read{ |
||||
|
test.NewRead("To Do, In Progress, Done", "project", "PROJECT_BOARD_BASIC_KANBAN_TYPE"), |
||||
|
test.NewRead("markdown", "repository.editor", "PREVIEWABLE_FILE_MODES"), |
||||
|
test.NewRead("http://0.0.0.0:3000/", "server", "LOCAL_ROOT_URL"), |
||||
|
test.NewRead(20*time.Minute, "server", "LFS_HTTP_AUTH_EXPIRY"), |
||||
|
test.NewRead(5120, "repository.pull-request", "DEFAULT_MERGE_MESSAGE_SIZE"), |
||||
|
test.NewRead(true, "ui", "SHOW_USER_EMAIL"), |
||||
|
test.NewRead(false, "cors", "enabled"), |
||||
|
} |
||||
|
|
||||
|
prov := ini.New(file) |
||||
|
test.Run(t, prov, read) |
||||
|
} |
Loading…
Reference in new issue