refactor: move load json/yaml functions to internal

This commit is contained in:
debugtalk
2022-03-26 09:09:02 +08:00
parent 0111deece7
commit d3b3b80d17
3 changed files with 72 additions and 96 deletions

View File

@@ -1,56 +1,15 @@
package hrp
import (
"bytes"
"fmt"
"os"
"path/filepath"
"strings"
"github.com/rs/zerolog/log"
"gopkg.in/yaml.v3"
"github.com/httprunner/httprunner/hrp/internal/json"
"github.com/httprunner/httprunner/hrp/internal/builtin"
)
func loadFromJSON(path string, structObj interface{}) error {
path, err := filepath.Abs(path)
if err != nil {
log.Error().Str("path", path).Err(err).Msg("convert absolute path failed")
return err
}
log.Info().Str("path", path).Msg("load json")
file, err := os.ReadFile(path)
if err != nil {
log.Error().Err(err).Msg("load json path failed")
return err
}
decoder := json.NewDecoder(bytes.NewReader(file))
decoder.UseNumber()
err = decoder.Decode(structObj)
return err
}
func loadFromYAML(path string, structObj interface{}) error {
path, err := filepath.Abs(path)
if err != nil {
log.Error().Str("path", path).Err(err).Msg("convert absolute path failed")
return err
}
log.Info().Str("path", path).Msg("load yaml")
file, err := os.ReadFile(path)
if err != nil {
log.Error().Err(err).Msg("load yaml path failed")
return err
}
err = yaml.Unmarshal(file, structObj)
return err
}
func convertCompatValidator(Validators []interface{}) (err error) {
for i, iValidator := range Validators {
validatorMap := iValidator.(map[string]interface{})
@@ -192,18 +151,8 @@ func (path *APIPath) ToString() string {
func (path *APIPath) ToAPI() (*API, error) {
api := &API{}
var err error
apiPath := path.ToString()
ext := filepath.Ext(apiPath)
switch ext {
case ".json":
err = loadFromJSON(apiPath, api)
case ".yaml", ".yml":
err = loadFromYAML(apiPath, api)
default:
err = ErrUnsupportedFileExt
}
err := builtin.LoadFile(apiPath, api)
if err != nil {
return nil, err
}
@@ -220,18 +169,8 @@ func (path *TestCasePath) ToString() string {
func (path *TestCasePath) ToTestCase() (*TestCase, error) {
tc := &TCase{}
var err error
casePath := path.ToString()
ext := filepath.Ext(casePath)
switch ext {
case ".json":
err = loadFromJSON(casePath, tc)
case ".yaml", ".yml":
err = loadFromYAML(casePath, tc)
default:
err = ErrUnsupportedFileExt
}
err := builtin.LoadFile(casePath, tc)
if err != nil {
return nil, err
}

View File

@@ -4,6 +4,8 @@ import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/httprunner/httprunner/hrp/internal/builtin"
)
var (
@@ -18,11 +20,11 @@ var (
func TestLoadCase(t *testing.T) {
tcJSON := &TCase{}
tcYAML := &TCase{}
err := loadFromJSON(demoTestCaseJSONPath.ToString(), tcJSON)
err := builtin.LoadFile(demoTestCaseJSONPath.ToString(), tcJSON)
if !assert.NoError(t, err) {
t.Fail()
}
err = loadFromYAML(demoTestCaseYAMLPath.ToString(), tcYAML)
err = builtin.LoadFile(demoTestCaseYAMLPath.ToString(), tcYAML)
if !assert.NoError(t, err) {
t.Fail()
}

View File

@@ -62,36 +62,6 @@ func MD5(str string) string {
return hex.EncodeToString(hasher.Sum(nil))
}
func loadFromCSV(path string) []map[string]interface{} {
path, err := filepath.Abs(path)
if err != nil {
log.Error().Str("path", path).Err(err).Msg("convert absolute path failed")
panic(err)
}
log.Info().Str("path", path).Msg("load csv file")
file, err := os.ReadFile(path)
if err != nil {
log.Error().Err(err).Msg("load csv file failed")
panic(err)
}
r := csv.NewReader(strings.NewReader(string(file)))
content, err := r.ReadAll()
if err != nil {
log.Error().Err(err).Msg("parse csv file failed")
panic(err)
}
var result []map[string]interface{}
for i := 1; i < len(content); i++ {
row := make(map[string]interface{})
for j := 0; j < len(content[i]); j++ {
row[content[0][j]] = content[i][j]
}
result = append(result, row)
}
return result
}
func Dump2JSON(data interface{}, path string) error {
path, err := filepath.Abs(path)
if err != nil {
@@ -258,3 +228,68 @@ func Interface2Float64(i interface{}) (float64, error) {
}
return 0, errors.New("failed to convert interface to float64")
}
var ErrUnsupportedFileExt = fmt.Errorf("unsupported file extension")
func LoadFile(path string, structObj interface{}) (err error) {
log.Info().Str("path", path).Msg("load file")
file, err := readFile(path)
if err != nil {
log.Error().Err(err).Msg("read file failed")
return err
}
ext := filepath.Ext(path)
switch ext {
case ".json":
decoder := json.NewDecoder(bytes.NewReader(file))
decoder.UseNumber()
err = decoder.Decode(structObj)
case ".yaml", ".yml":
err = yaml.Unmarshal(file, structObj)
default:
err = ErrUnsupportedFileExt
}
return err
}
func loadFromCSV(path string) []map[string]interface{} {
log.Info().Str("path", path).Msg("load csv file")
file, err := readFile(path)
if err != nil {
log.Error().Err(err).Msg("read csv file failed")
panic(err)
}
r := csv.NewReader(strings.NewReader(string(file)))
content, err := r.ReadAll()
if err != nil {
log.Error().Err(err).Msg("parse csv file failed")
panic(err)
}
var result []map[string]interface{}
for i := 1; i < len(content); i++ {
row := make(map[string]interface{})
for j := 0; j < len(content[i]); j++ {
row[content[0][j]] = content[i][j]
}
result = append(result, row)
}
return result
}
func readFile(path string) ([]byte, error) {
var err error
path, err = filepath.Abs(path)
if err != nil {
log.Error().Err(err).Str("path", path).Msg("convert absolute path failed")
return nil, err
}
file, err := os.ReadFile(path)
if err != nil {
log.Error().Err(err).Msg("read file failed")
return nil, err
}
return file, nil
}