[add] widget table $ENV support

This commit is contained in:
Max 2022-10-03 19:08:02 +08:00
parent b485fd3955
commit 7ca05b9f0f
6 changed files with 131 additions and 3 deletions

View file

@ -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:

View file

@ -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:

View 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
}

View 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"))
}

View file

@ -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

View file

@ -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) {