[add] migrate importer

This commit is contained in:
Max 2023-02-03 14:43:00 +08:00
parent a9d5e8dd42
commit 5faf62a789
6 changed files with 133 additions and 55 deletions

View file

@ -9,7 +9,7 @@ COMMIT := $(shell git log | head -n 1 | awk '{print substr($$2, 0, 12)}')
NOW := $(shell date +"%FT%T%z") NOW := $(shell date +"%FT%T%z")
# ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) # ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
TESTFOLDER := $(shell $(GO) list ./... | grep -E 'api|model|flow|script|fs|i18n|connector|query|plugin|cert|crypto|task|schedule|runtime|helper|utils|widget' | grep -vE 'examples|tests*|config|widgets') TESTFOLDER := $(shell $(GO) list ./... | grep -E 'api|model|flow|script|fs|i18n|connector|query|plugin|cert|crypto|task|schedule|runtime|helper|utils|widget|importer' | grep -vE 'examples|tests*|config|widgets')
TESTTAGS ?= "" TESTTAGS ?= ""
# TESTWIDGETS := $(shell $(GO) list ./widgets/...) # TESTWIDGETS := $(shell $(GO) list ./widgets/...)

View file

@ -22,7 +22,7 @@ var Conf Config
var LogOutput *os.File // 日志文件 var LogOutput *os.File // 日志文件
// DSLExtensions the dsl file Extensions // DSLExtensions the dsl file Extensions
var DSLExtensions = []string{".yao", ".json", ".jsonc"} var DSLExtensions = []string{"*.yao", "*.json", "*.jsonc"}
func init() { func init() {
filename, _ := filepath.Abs(filepath.Join(".", ".env")) filename, _ := filepath.Abs(filepath.Join(".", ".env"))

View file

@ -14,6 +14,7 @@ import (
"github.com/yaoapp/kun/exception" "github.com/yaoapp/kun/exception"
"github.com/yaoapp/kun/log" "github.com/yaoapp/kun/log"
"github.com/yaoapp/yao/config" "github.com/yaoapp/yao/config"
"github.com/yaoapp/yao/fs"
"github.com/yaoapp/yao/importer/from" "github.com/yaoapp/yao/importer/from"
"github.com/yaoapp/yao/importer/xlsx" "github.com/yaoapp/yao/importer/xlsx"
"github.com/yaoapp/yao/share" "github.com/yaoapp/yao/share"
@ -22,9 +23,23 @@ import (
// Importers 导入器 // Importers 导入器
var Importers = map[string]*Importer{} var Importers = map[string]*Importer{}
// DataRoot data file root
var DataRoot string = ""
// Load 加载导入器 // Load 加载导入器
func Load(cfg config.Config) error { func Load(cfg config.Config) error {
return application.App.Walk("apis", func(root, file string, isdir bool) error {
root, err := fs.Root(cfg)
if err != nil {
return err
}
DataRoot = root
exts := []string{"*.imp.yao", "*.imp.json", "*.imp.jsonc"}
return application.App.Walk("imports", func(root, file string, isdir bool) error {
if isdir {
return nil
}
id := share.ID(root, file) id := share.ID(root, file)
data, err := application.App.Read(file) data, err := application.App.Read(file)
@ -37,10 +52,10 @@ func Load(cfg config.Config) error {
if err != nil { if err != nil {
return fmt.Errorf("%s 导入配置错误. %s", id, err.Error()) return fmt.Errorf("%s 导入配置错误. %s", id, err.Error())
} }
Importers[id] = &importer
return err Importers[id] = &importer
}, config.DSLExtensions...) return nil
}, exts...)
} }
// Select 选择已加载导入器 // Select 选择已加载导入器
@ -57,13 +72,8 @@ func Open(name string) from.Source {
ext := strings.ToLower(strings.TrimPrefix(filepath.Ext(name), ".")) ext := strings.ToLower(strings.TrimPrefix(filepath.Ext(name), "."))
switch ext { switch ext {
case "xlsx": case "xlsx":
// Refector ***** file := filepath.Join(DataRoot, name)
// fullpath := name return xlsx.Open(file)
// fullpath := filepath.Join(xfs.Stor.Root, name)
// if !strings.HasPrefix(fullpath, "/") {
// fullpath = filepath.Join(xfs.Stor.Root, name)
// }
return xlsx.Open(name)
} }
exception.New("暂不支持: %s 文件导入", 400, ext).Throw() exception.New("暂不支持: %s 文件导入", 400, ext).Throw()
return nil return nil

View file

@ -5,25 +5,41 @@ import (
"testing" "testing"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/yaoapp/kun/utils"
"github.com/yaoapp/yao/config" "github.com/yaoapp/yao/config"
"github.com/yaoapp/yao/fs"
"github.com/yaoapp/yao/importer/xlsx" "github.com/yaoapp/yao/importer/xlsx"
"github.com/yaoapp/yao/script"
"github.com/yaoapp/yao/test"
) )
func TestLoad(t *testing.T) { func TestLoad(t *testing.T) {
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t, config.Conf)
assert.IsType(t, &Importer{}, Select("order")) assert.IsType(t, &Importer{}, Select("order"))
} }
func TestFingerprintSimple(t *testing.T) { func TestFingerprintSimple(t *testing.T) {
simple := filepath.Join(config.Conf.Root, "data", "assets", "simple.xlsx") test.Prepare(t, config.Conf)
defer test.Clean()
root := prepare(t, config.Conf)
simple := filepath.Join(root, "assets", "simple.xlsx")
file := xlsx.Open(simple) file := xlsx.Open(simple)
defer file.Close() defer file.Close()
imp := Select("order") imp := Select("order")
fingerprint := imp.Fingerprint(file) fingerprint := imp.Fingerprint(file)
assert.Equal(t, "3451ca87d71801687abba8993e5a69af79482914435d7cc064236fd93160f999", fingerprint) assert.Equal(t, "3451ca87d71801687abba8993e5a69af79482914435d7cc064236fd93160f999", fingerprint)
} }
func TestAutoMappingSimple(t *testing.T) { func TestAutoMappingSimple(t *testing.T) {
simple := filepath.Join(config.Conf.Root, "data", "assets", "simple.xlsx")
test.Prepare(t, config.Conf)
defer test.Clean()
root := prepare(t, config.Conf)
simple := filepath.Join(root, "assets", "simple.xlsx")
file := xlsx.Open(simple) file := xlsx.Open(simple)
defer file.Close() defer file.Close()
@ -47,7 +63,12 @@ func TestAutoMappingSimple(t *testing.T) {
} }
func TestDataGetSimple(t *testing.T) { func TestDataGetSimple(t *testing.T) {
simple := filepath.Join(config.Conf.Root, "data", "assets", "simple.xlsx")
test.Prepare(t, config.Conf)
defer test.Clean()
root := prepare(t, config.Conf)
simple := filepath.Join(root, "assets", "simple.xlsx")
file := xlsx.Open(simple) file := xlsx.Open(simple)
defer file.Close() defer file.Close()
@ -68,7 +89,11 @@ func TestDataGetSimple(t *testing.T) {
} }
func TestDataChunkSimple(t *testing.T) { func TestDataChunkSimple(t *testing.T) {
simple := filepath.Join(config.Conf.Root, "data", "assets", "simple.xlsx") test.Prepare(t, config.Conf)
defer test.Clean()
root := prepare(t, config.Conf)
simple := filepath.Join(root, "assets", "simple.xlsx")
file := xlsx.Open(simple) file := xlsx.Open(simple)
defer file.Close() defer file.Close()
@ -82,7 +107,11 @@ func TestDataChunkSimple(t *testing.T) {
} }
func TestRunSimple(t *testing.T) { func TestRunSimple(t *testing.T) {
simple := filepath.Join(config.Conf.Root, "data", "assets", "simple.xlsx") test.Prepare(t, config.Conf)
defer test.Clean()
root := prepare(t, config.Conf)
simple := filepath.Join(root, "assets", "simple.xlsx")
file := xlsx.Open(simple) file := xlsx.Open(simple)
defer file.Close() defer file.Close()
@ -96,7 +125,11 @@ func TestRunSimple(t *testing.T) {
} }
func TestDataPreviewSimple(t *testing.T) { func TestDataPreviewSimple(t *testing.T) {
simple := filepath.Join(config.Conf.Root, "data", "assets", "simple.xlsx") test.Prepare(t, config.Conf)
defer test.Clean()
root := prepare(t, config.Conf)
simple := filepath.Join(root, "assets", "simple.xlsx")
file := xlsx.Open(simple) file := xlsx.Open(simple)
defer file.Close() defer file.Close()
imp := Select("order") imp := Select("order")
@ -115,7 +148,11 @@ func TestDataPreviewSimple(t *testing.T) {
} }
func TestMappingPreviewSimple(t *testing.T) { func TestMappingPreviewSimple(t *testing.T) {
simple := filepath.Join(config.Conf.Root, "data", "assets", "simple.xlsx") test.Prepare(t, config.Conf)
defer test.Clean()
root := prepare(t, config.Conf)
simple := filepath.Join(root, "assets", "simple.xlsx")
file := xlsx.Open(simple) file := xlsx.Open(simple)
defer file.Close() defer file.Close()
@ -139,19 +176,47 @@ func TestMappingPreviewSimple(t *testing.T) {
} }
func TestMappingSetting(t *testing.T) { func TestMappingSetting(t *testing.T) {
simple := filepath.Join(config.Conf.Root, "data", "assets", "simple.xlsx") test.Prepare(t, config.Conf)
defer test.Clean()
root := prepare(t, config.Conf)
simple := filepath.Join(root, "assets", "simple.xlsx")
file := xlsx.Open(simple) file := xlsx.Open(simple)
defer file.Close() defer file.Close()
imp := Select("order") imp := Select("order")
setting := imp.MappingSetting(file) setting := imp.MappingSetting(file)
utils.Dump(setting) // utils.Dump(setting)
assert.NotNil(t, setting) assert.NotNil(t, setting)
} }
func TestDataSetting(t *testing.T) { func TestDataSetting(t *testing.T) {
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t, config.Conf)
imp := Select("order") imp := Select("order")
setting := imp.DataSetting() setting := imp.DataSetting()
utils.Dump(setting) // utils.Dump(setting)
assert.NotNil(t, setting) assert.NotNil(t, setting)
} }
func prepare(t *testing.T, cfg config.Config) string {
err := Load(cfg)
if err != nil {
t.Fatal(err)
}
dataRoot, err := fs.Root(cfg)
if err != nil {
t.Fatal(err)
}
err = script.Load(cfg)
if err != nil {
t.Fatal(err)
}
return dataRoot
}

View file

@ -1,23 +0,0 @@
package importer
import (
"os"
"testing"
"github.com/yaoapp/yao/config"
"github.com/yaoapp/yao/model"
"github.com/yaoapp/yao/query"
"github.com/yaoapp/yao/script"
"github.com/yaoapp/yao/share"
)
func TestMain(m *testing.M) {
share.DBConnect(config.Conf.DB)
model.Load(config.Conf)
query.Load(config.Conf)
share.Load(config.Conf)
script.Load(config.Conf)
Load(config.Conf)
code := m.Run()
os.Exit(code)
}

View file

@ -6,52 +6,78 @@ import (
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/yaoapp/gou/process" "github.com/yaoapp/gou/process"
"github.com/yaoapp/yao/config"
"github.com/yaoapp/yao/test"
) )
func TestProcessMapping(t *testing.T) { func TestProcessMapping(t *testing.T) {
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t, config.Conf)
simple := filepath.Join("assets", "simple.xlsx") simple := filepath.Join("assets", "simple.xlsx")
args := []interface{}{"order", simple} args := []interface{}{"order", simple}
response := process.New("xiang.import.Mapping", args...).Run() response := process.New("yao.import.Mapping", args...).Run()
_, ok := response.(*Mapping) _, ok := response.(*Mapping)
assert.True(t, ok) assert.True(t, ok)
} }
func TestProcessMappingSetting(t *testing.T) { func TestProcessMappingSetting(t *testing.T) {
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t, config.Conf)
simple := filepath.Join("assets", "simple.xlsx") simple := filepath.Join("assets", "simple.xlsx")
args := []interface{}{"order", simple} args := []interface{}{"order", simple}
response := process.New("xiang.import.MappingSetting", args...).Run() response := process.New("yao.import.MappingSetting", args...).Run()
_, ok := response.(map[string]interface{}) _, ok := response.(map[string]interface{})
assert.True(t, ok) assert.True(t, ok)
} }
func TestProcessData(t *testing.T) { func TestProcessData(t *testing.T) {
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t, config.Conf)
simple := filepath.Join("assets", "simple.xlsx") simple := filepath.Join("assets", "simple.xlsx")
mapping := process.New("xiang.import.Mapping", "order", simple).Run() mapping := process.New("yao.import.Mapping", "order", simple).Run()
args := []interface{}{"order", simple, 1, 2, mapping} args := []interface{}{"order", simple, 1, 2, mapping}
response := process.New("xiang.import.Data", args...).Run() response := process.New("yao.import.Data", args...).Run()
_, ok := response.(map[string]interface{}) _, ok := response.(map[string]interface{})
assert.True(t, ok) assert.True(t, ok)
} }
func TestProcessDataSetting(t *testing.T) { func TestProcessDataSetting(t *testing.T) {
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t, config.Conf)
args := []interface{}{"order"} args := []interface{}{"order"}
response := process.New("xiang.import.DataSetting", args...).Run() response := process.New("yao.import.DataSetting", args...).Run()
_, ok := response.(map[string]interface{}) _, ok := response.(map[string]interface{})
assert.True(t, ok) assert.True(t, ok)
} }
func TestProcessSetting(t *testing.T) { func TestProcessSetting(t *testing.T) {
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t, config.Conf)
args := []interface{}{"order"} args := []interface{}{"order"}
response := process.New("xiang.import.Setting", args...).Run() response := process.New("yao.import.Setting", args...).Run()
_, ok := response.(map[string]interface{}) _, ok := response.(map[string]interface{})
assert.True(t, ok) assert.True(t, ok)
} }
func TestProcessRun(t *testing.T) { func TestProcessRun(t *testing.T) {
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t, config.Conf)
simple := filepath.Join("assets", "simple.xlsx") simple := filepath.Join("assets", "simple.xlsx")
mapping := process.New("xiang.import.Mapping", "order", simple).Run() mapping := process.New("yao.import.Mapping", "order", simple).Run()
args := []interface{}{"order", simple, mapping} args := []interface{}{"order", simple, mapping}
response := process.New("xiang.import.Run", args...).Run() response := process.New("yao.import.Run", args...).Run()
_, ok := response.(map[string]int) _, ok := response.(map[string]int)
assert.True(t, ok) assert.True(t, ok)
} }