From d3b3b80d17a0c659e34a94fe4b90ce53343c4f42 Mon Sep 17 00:00:00 2001 From: debugtalk Date: Sat, 26 Mar 2022 09:09:02 +0800 Subject: [PATCH] refactor: move load json/yaml functions to internal --- hrp/convert.go | 67 +--------------------- hrp/convert_test.go | 6 +- hrp/internal/builtin/function.go | 95 ++++++++++++++++++++++---------- 3 files changed, 72 insertions(+), 96 deletions(-) diff --git a/hrp/convert.go b/hrp/convert.go index 94bd3328..af0048b5 100644 --- a/hrp/convert.go +++ b/hrp/convert.go @@ -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 } diff --git a/hrp/convert_test.go b/hrp/convert_test.go index 4e7ed7c2..7c922d7e 100644 --- a/hrp/convert_test.go +++ b/hrp/convert_test.go @@ -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() } diff --git a/hrp/internal/builtin/function.go b/hrp/internal/builtin/function.go index f95d01c7..40a676a2 100644 --- a/hrp/internal/builtin/function.go +++ b/hrp/internal/builtin/function.go @@ -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 +}