[add] widget table $ENV support
This commit is contained in:
parent
b485fd3955
commit
7ca05b9f0f
6 changed files with 131 additions and 3 deletions
4
.github/workflows/pr-test.yml
vendored
4
.github/workflows/pr-test.yml
vendored
|
|
@ -38,6 +38,10 @@ env:
|
|||
MONGO_TEST_USER: "root"
|
||||
MONGO_TEST_PASS: "123456"
|
||||
|
||||
TAB_NAME: "::PET ADMIN"
|
||||
PAGE_SIZE: "20"
|
||||
PAGE_LINK: "https://yaoapps.com"
|
||||
|
||||
DEMO_APP: ${{ github.WORKSPACE }}/../app
|
||||
|
||||
jobs:
|
||||
|
|
|
|||
4
.github/workflows/unit-test.yml
vendored
4
.github/workflows/unit-test.yml
vendored
|
|
@ -42,6 +42,10 @@ env:
|
|||
MONGO_TEST_USER: "root"
|
||||
MONGO_TEST_PASS: "123456"
|
||||
|
||||
TAB_NAME: "::PET ADMIN"
|
||||
PAGE_SIZE: "20"
|
||||
PAGE_LINK: "https://yaoapps.com"
|
||||
|
||||
DEMO_APP: ${{ github.WORKSPACE }}/../app
|
||||
|
||||
jobs:
|
||||
|
|
|
|||
84
widgets/environment/environment.go
Normal file
84
widgets/environment/environment.go
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
package environment
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
jsoniter "github.com/json-iterator/go"
|
||||
)
|
||||
|
||||
// ReadFile open file and replace the content $ENV.XXX
|
||||
func ReadFile(file string, defaults ...map[string]interface{}) ([]byte, error) {
|
||||
content := map[string]interface{}{}
|
||||
bytes, err := ioutil.ReadFile(file)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = jsoniter.Unmarshal(bytes, &content)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
defaultValues := map[string]interface{}{}
|
||||
if len(defaults) > 0 {
|
||||
defaultValues = defaults[0]
|
||||
}
|
||||
|
||||
Replace(content, defaultValues)
|
||||
return jsoniter.Marshal(content)
|
||||
}
|
||||
|
||||
// Replace replace content
|
||||
func Replace(content map[string]interface{}, defaults map[string]interface{}) {
|
||||
replaceMap(content, defaults)
|
||||
}
|
||||
|
||||
func replaceAny(value interface{}, defaults map[string]interface{}) interface{} {
|
||||
switch value.(type) {
|
||||
case string:
|
||||
return replaceStr(value.(string), defaults)
|
||||
|
||||
case map[string]interface{}:
|
||||
return replaceMap(value.(map[string]interface{}), defaults)
|
||||
|
||||
case []interface{}:
|
||||
return replaceArr(value.([]interface{}), defaults)
|
||||
}
|
||||
return value
|
||||
}
|
||||
|
||||
func replaceStr(value string, defaults map[string]interface{}) interface{} {
|
||||
|
||||
if strings.HasPrefix(value, "\\$$ENV.") {
|
||||
return fmt.Sprintf("$ENV.%s", strings.TrimLeft(value, "\\$$ENV."))
|
||||
}
|
||||
|
||||
if !strings.HasPrefix(value, "$ENV.") {
|
||||
return value
|
||||
}
|
||||
|
||||
name := strings.TrimLeft(value, "$ENV.")
|
||||
v := os.Getenv(name)
|
||||
if v != "" {
|
||||
return v
|
||||
}
|
||||
|
||||
return defaults[name]
|
||||
}
|
||||
|
||||
func replaceMap(values map[string]interface{}, defaults map[string]interface{}) map[string]interface{} {
|
||||
for key, value := range values {
|
||||
values[key] = replaceAny(value, defaults)
|
||||
}
|
||||
return values
|
||||
}
|
||||
|
||||
func replaceArr(values []interface{}, defaults map[string]interface{}) []interface{} {
|
||||
for key, value := range values {
|
||||
values[key] = replaceAny(value, defaults)
|
||||
}
|
||||
return values
|
||||
}
|
||||
35
widgets/environment/environment_test.go
Normal file
35
widgets/environment/environment_test.go
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
package environment
|
||||
|
||||
import (
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
jsoniter "github.com/json-iterator/go"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/yaoapp/kun/maps"
|
||||
"github.com/yaoapp/yao/config"
|
||||
)
|
||||
|
||||
func TestReadFile(t *testing.T) {
|
||||
file := filepath.Join(config.Conf.Root, "tables", "env.tab.json")
|
||||
defaults := map[string]interface{}{"PAGE_STATUS": "cured"}
|
||||
content, err := ReadFile(file, defaults)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
res := maps.MapStr{}
|
||||
err = jsoniter.Unmarshal(content, &res)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
res = res.Dot()
|
||||
// utils.Dump(res)
|
||||
|
||||
assert.Equal(t, "::PET ADMIN", res.Get("name"))
|
||||
assert.Equal(t, "20", res.Get("action.search.default.2"))
|
||||
assert.Equal(t, "https://yaoapps.com", res.Get("layout.header.preset.import.operation.0.link"))
|
||||
assert.Equal(t, "cured", res.Get("layout.table.operation.actions.2.action.Table.save.status"))
|
||||
|
||||
}
|
||||
|
|
@ -12,6 +12,7 @@ import (
|
|||
"github.com/yaoapp/yao/config"
|
||||
"github.com/yaoapp/yao/share"
|
||||
"github.com/yaoapp/yao/widgets/component"
|
||||
"github.com/yaoapp/yao/widgets/environment"
|
||||
"github.com/yaoapp/yao/widgets/field"
|
||||
)
|
||||
|
||||
|
|
@ -113,9 +114,9 @@ func LoadFrom(dir string, prefix string) error {
|
|||
messages := []string{}
|
||||
err := share.Walk(dir, ".json", func(root, filename string) {
|
||||
id := prefix + share.ID(root, filename)
|
||||
data := share.ReadFile(filename)
|
||||
data, err := environment.ReadFile(filename)
|
||||
dsl := New(id)
|
||||
err := jsoniter.Unmarshal(data, dsl)
|
||||
err = jsoniter.Unmarshal(data, dsl)
|
||||
if err != nil {
|
||||
messages = append(messages, fmt.Sprintf("[%s] %s", id, err.Error()))
|
||||
return
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ func TestLoad(t *testing.T) {
|
|||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
assert.Equal(t, 2, len(Tables))
|
||||
assert.Equal(t, 3, len(Tables))
|
||||
}
|
||||
|
||||
func prepare(t *testing.T, language ...string) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue