diff --git a/.github/workflows/pr-test.yml b/.github/workflows/pr-test.yml index 8b3dc137..19d81608 100644 --- a/.github/workflows/pr-test.yml +++ b/.github/workflows/pr-test.yml @@ -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: diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index 8b8567cc..71d49c39 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -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: diff --git a/widgets/environment/environment.go b/widgets/environment/environment.go new file mode 100644 index 00000000..a2a0a0a0 --- /dev/null +++ b/widgets/environment/environment.go @@ -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 +} diff --git a/widgets/environment/environment_test.go b/widgets/environment/environment_test.go new file mode 100644 index 00000000..8e0fb365 --- /dev/null +++ b/widgets/environment/environment_test.go @@ -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")) + +} diff --git a/widgets/table/table.go b/widgets/table/table.go index bf9370e4..6513bca2 100644 --- a/widgets/table/table.go +++ b/widgets/table/table.go @@ -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 diff --git a/widgets/table/table_test.go b/widgets/table/table_test.go index 76461d58..dbb343aa 100644 --- a/widgets/table/table_test.go +++ b/widgets/table/table_test.go @@ -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) {