Skip to content

Commit d94b28d

Browse files
Add method in Rows type
1 parent 7bad41a commit d94b28d

File tree

12 files changed

+296
-141
lines changed

12 files changed

+296
-141
lines changed

.github/workflows/lint.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ jobs:
1414
name: lint
1515
runs-on: ubuntu-latest
1616
steps:
17+
- uses: actions/checkout@v3
1718
- uses: actions/setup-go@v3
1819
with:
19-
go-version: ^1.18
20-
- uses: actions/checkout@v3
20+
go-version-file: 'go.mod'
2121
- name: golangci-lint
2222
uses: golangci/golangci-lint-action@v3
2323
with:

.github/workflows/vulns.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ jobs:
1212
- uses: actions/checkout@v2
1313
- uses: actions/setup-go@v2
1414
with:
15-
go-version: ^1.18
15+
go-version: ^1.19
1616
- name: WriteGoList
1717
run: go list -json -m all > go.list
1818
- name: Nancy

Taskfile.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ tasks:
1313
cmds:
1414
- go mod verify
1515
- go test -shuffle on ./...
16-
- docker run --rm -v $(pwd):/app -w /app golangci/golangci-lint:v1.45.2 golangci-lint run --enable gosec --timeout 3m0s ./...
16+
- docker run --rm -v $(pwd):/app -w /app golangci/golangci-lint:v1.49.0 golangci-lint run --enable gosec --timeout 3m0s ./...
1717
sources:
1818
- ./go.mod
1919
- '**/*.go'
@@ -32,7 +32,7 @@ tasks:
3232
- rm -f ./go.sum
3333
- go clean -cache
3434
- go clean -modcache
35-
- go mod tidy -v -go=1.18
35+
- go mod tidy -v -go=1.19
3636

3737
graph:
3838
desc: Make grapth of dependency modules.

calcdata/calcdata.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ import (
99
"github.com/knieriem/odf/ods"
1010
)
1111

12-
//Reader is class of LibreOffice Calc data
12+
// Reader is class of LibreOffice Calc data
1313
type Reader struct {
1414
table *ods.Table
1515
offset, repeat int
1616
}
1717

1818
var _ csvdata.RowsReader = (*Reader)(nil) //Reader is compatible with csvdata.RowsReader interface
1919

20-
//OpenFile returns Calc file instance.
20+
// OpenFile returns Calc file instance.
2121
func OpenFile(path string) (*ods.Doc, error) {
2222
doc, err := openFile(path)
2323
if err != nil {
@@ -26,7 +26,7 @@ func OpenFile(path string) (*ods.Doc, error) {
2626
return doc, nil
2727
}
2828

29-
//New function creates a new Reader instance.
29+
// New function creates a new Reader instance.
3030
func New(doc *ods.Doc, sheetName string) (*Reader, error) {
3131
index := sheetIndex(doc, sheetName)
3232
if index < 0 {
@@ -35,6 +35,11 @@ func New(doc *ods.Doc, sheetName string) (*Reader, error) {
3535
return &Reader{table: &doc.Table[index]}, nil
3636
}
3737

38+
// LazyQuotes returns true.
39+
func (r *Reader) LazyQuotes() bool {
40+
return true
41+
}
42+
3843
func (r *Reader) Read() ([]string, error) {
3944
if r == nil || r.table == nil {
4045
return nil, errs.Wrap(csvdata.ErrNullPointer)
@@ -80,7 +85,7 @@ func sheetIndex(doc *ods.Doc, s string) int {
8085
return -1
8186
}
8287

83-
//Close method is dummy.
88+
// Close method is dummy.
8489
func (r *Reader) Close() error {
8590
return nil
8691
}

csvdata.go

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ import (
88
"github.com/goark/errs"
99
)
1010

11-
//Reader is class of CSV reader
11+
// Reader is class of CSV reader
1212
type Reader struct {
1313
reader *csv.Reader
1414
closer func() error
1515
}
1616

1717
var _ RowsReader = (*Reader)(nil) //Reader is compatible with RowsReader interface
1818

19-
//OpenFile returns CSV file Reader.
19+
// OpenFile returns CSV file Reader.
2020
func OpenFile(path string) (*os.File, error) {
2121
file, err := os.Open(path)
2222
if err != nil {
@@ -25,7 +25,7 @@ func OpenFile(path string) (*os.File, error) {
2525
return file, nil
2626
}
2727

28-
//New function creates a new Reader instance.
28+
// New function creates a new Reader instance.
2929
func New(r io.Reader) *Reader {
3030
cr := csv.NewReader(r)
3131
cr.Comma = ','
@@ -38,7 +38,12 @@ func New(r io.Reader) *Reader {
3838
return &Reader{reader: cr, closer: closer}
3939
}
4040

41-
//WithComma method sets Comma property.
41+
// LazyQuotes returns LazyQuotes option.
42+
func (r *Reader) LazyQuotes() bool {
43+
return r.reader.LazyQuotes
44+
}
45+
46+
// WithComma method sets Comma property.
4247
func (r *Reader) WithComma(c rune) *Reader {
4348
if r == nil {
4449
return nil
@@ -47,7 +52,25 @@ func (r *Reader) WithComma(c rune) *Reader {
4752
return r
4853
}
4954

50-
//WithFieldsPerRecord method sets FieldsPerRecord property.
55+
// WithLazyQuotes method sets LazyQuotes property.
56+
func (r *Reader) WithLazyQuotes(mode bool) *Reader {
57+
if r == nil {
58+
return nil
59+
}
60+
r.reader.LazyQuotes = mode
61+
return r
62+
}
63+
64+
// WithTrimLeadingSpace method sets TrimLeadingSpace property.
65+
func (r *Reader) WithTrimLeadingSpace(mode bool) *Reader {
66+
if r == nil {
67+
return nil
68+
}
69+
r.reader.TrimLeadingSpace = mode
70+
return r
71+
}
72+
73+
// WithFieldsPerRecord method sets FieldsPerRecord property.
5174
func (r *Reader) WithFieldsPerRecord(size int) *Reader {
5275
if r == nil {
5376
return nil
@@ -56,7 +79,7 @@ func (r *Reader) WithFieldsPerRecord(size int) *Reader {
5679
return r
5780
}
5881

59-
//Read method returns next row data.
82+
// Read method returns next row data.
6083
func (r *Reader) Read() ([]string, error) {
6184
if r == nil {
6285
return nil, errs.Wrap(ErrNullPointer)

csvdata_test.go

Lines changed: 51 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ const (
2727
)
2828

2929
func TestWithNil(t *testing.T) {
30-
r := csvdata.NewRows((*csvdata.Reader)(nil).WithComma(',').WithFieldsPerRecord(1), true)
30+
r := csvdata.NewRows((*csvdata.Reader)(nil).WithComma(',').WithLazyQuotes(true).WithTrimLeadingSpace(true).WithFieldsPerRecord(1), true)
3131
defer r.Close() //dummy
3232
if err := r.Next(); !errors.Is(err, csvdata.ErrNullPointer) {
3333
t.Errorf("Next() is \"%+v\", want \"%+v\".", err, csvdata.ErrNullPointer)
@@ -65,7 +65,7 @@ func TestWithNil(t *testing.T) {
6565

6666
func TestErrReader(t *testing.T) {
6767
errtest := errors.New("test")
68-
r := csvdata.NewRows(csvdata.New(iotest.ErrReader(errtest)).WithComma(',').WithFieldsPerRecord(1), true)
68+
r := csvdata.NewRows(csvdata.New(iotest.ErrReader(errtest)).WithComma(',').WithLazyQuotes(true).WithTrimLeadingSpace(true).WithFieldsPerRecord(1), true)
6969
defer r.Close() //dummy
7070
if err := r.Next(); !errors.Is(err, errtest) {
7171
t.Errorf("Next() is \"%+v\", want \"%+v\".", err, errtest)
@@ -95,7 +95,7 @@ func TestNormal(t *testing.T) {
9595
flagBool sql.NullBool
9696
mass float64
9797
massFloat64 sql.NullFloat64
98-
order int64
98+
order int8
9999
orderByte sql.NullByte
100100
orderInt16 sql.NullInt16
101101
orderInt32 sql.NullInt32
@@ -107,7 +107,7 @@ func TestNormal(t *testing.T) {
107107
}
108108

109109
for _, tc := range testCases {
110-
rc := csvdata.NewRows(csvdata.New(tc.inp).WithComma(tc.sep).WithFieldsPerRecord(tc.size), tc.headerFlag)
110+
rc := csvdata.NewRows(csvdata.New(tc.inp).WithComma(tc.sep).WithLazyQuotes(true).WithTrimLeadingSpace(true).WithFieldsPerRecord(tc.size), tc.headerFlag)
111111
if err := rc.Next(); err != nil {
112112
t.Errorf("Next() is \"%+v\", want nil.", err)
113113
} else {
@@ -140,7 +140,7 @@ func TestNormal(t *testing.T) {
140140
t.Errorf("Column() is \"%v\", want \"%v\".", name, tc.name2)
141141
}
142142
//bool
143-
if _, err = rc.GetBool(5); !errors.Is(err, csvdata.ErrNullPointer) {
143+
if _, err = rc.GetBool(5); !errors.Is(err, csvdata.ErrNullValue) {
144144
t.Errorf("GetBool() is \"%+v\", want \"%+v\".", err, strconv.ErrSyntax)
145145
}
146146
if _, err = rc.ColumnBool("name"); !errors.Is(err, strconv.ErrSyntax) && !errors.Is(err, tc.err) {
@@ -161,7 +161,7 @@ func TestNormal(t *testing.T) {
161161
t.Errorf("ColumnBool() is \"%+v\", want \"%+v\".", flagBool, tc.flagBool)
162162
}
163163
//float
164-
if _, err = rc.GetFloat64(5); !errors.Is(err, csvdata.ErrNullPointer) {
164+
if _, err = rc.GetFloat64(5); !errors.Is(err, csvdata.ErrNullValue) {
165165
t.Errorf("GetFloat() is \"%+v\", want \"%+v\".", err, strconv.ErrSyntax)
166166
}
167167
if _, err = rc.ColumnFloat64("name"); !errors.Is(err, strconv.ErrSyntax) && !errors.Is(err, tc.err) {
@@ -176,52 +176,80 @@ func TestNormal(t *testing.T) {
176176
}
177177
massFloat64, err := rc.ColumnNullFloat64("mass")
178178
if !errors.Is(err, tc.err) {
179-
t.Errorf("ColumnFloat() is \"%+v\", want \"%+v\".", err, tc.err)
179+
t.Errorf("ColumnNullFloat64() is \"%+v\", want \"%+v\".", err, tc.err)
180180
}
181181
if err == nil && massFloat64 != tc.massFloat64 {
182-
t.Errorf("ColumnFloat() is \"%+v\", want \"%+v\".", massFloat64, tc.massFloat64)
182+
t.Errorf("ColumnNullFloat64() is \"%+v\", want \"%+v\".", massFloat64, tc.massFloat64)
183183
}
184184
//int
185-
if _, err = rc.GetInt64(5, 10); !errors.Is(err, csvdata.ErrNullPointer) {
186-
t.Errorf("GetFloat() is \"%+v\", want \"%+v\".", err, strconv.ErrSyntax)
185+
if _, err = rc.GetInt64(5, 10); !errors.Is(err, csvdata.ErrNullValue) {
186+
t.Errorf("GetInt64() is \"%+v\", want \"%+v\".", err, strconv.ErrSyntax)
187187
}
188188
if _, err = rc.ColumnInt64("name", 10); !errors.Is(err, strconv.ErrSyntax) && !errors.Is(err, tc.err) {
189-
t.Errorf("ColumnFloat() is \"%+v\", want \"%+v\".", err, strconv.ErrSyntax)
189+
t.Errorf("ColumnInt64() is \"%+v\", want \"%+v\".", err, strconv.ErrSyntax)
190190
}
191-
order, err := rc.ColumnInt64("order", 10)
191+
order64, err := rc.ColumnInt64("order", 10)
192192
if !errors.Is(err, tc.err) {
193-
t.Errorf("ColumnFloat() is \"%+v\", want \"%+v\".", err, tc.err)
193+
t.Errorf("ColumnInt64() is \"%+v\", want \"%+v\".", err, tc.err)
194+
}
195+
if err == nil && order64 != int64(tc.order) {
196+
t.Errorf("ColumnInt64() is \"%+v\", want \"%+v\".", order64, tc.order)
197+
}
198+
order32, err := rc.ColumnInt32("order", 10)
199+
if !errors.Is(err, tc.err) {
200+
t.Errorf("ColumnInt32() is \"%+v\", want \"%+v\".", err, tc.err)
201+
}
202+
if err == nil && order32 != int32(tc.order) {
203+
t.Errorf("ColumnInt32() is \"%+v\", want \"%+v\".", order32, tc.order)
204+
}
205+
order16, err := rc.ColumnInt16("order", 10)
206+
if !errors.Is(err, tc.err) {
207+
t.Errorf("ColumnInt16() is \"%+v\", want \"%+v\".", err, tc.err)
194208
}
195-
if err == nil && order != tc.order {
196-
t.Errorf("ColumnFloat() is \"%+v\", want \"%+v\".", order, tc.order)
209+
if err == nil && order16 != int16(tc.order) {
210+
t.Errorf("ColumnInt16() is \"%+v\", want \"%+v\".", order16, tc.order)
211+
}
212+
order8, err := rc.ColumnInt8("order", 10)
213+
if !errors.Is(err, tc.err) {
214+
t.Errorf("ColumnInt8() is \"%+v\", want \"%+v\".", err, tc.err)
215+
}
216+
if err == nil && order8 != tc.order {
217+
t.Errorf("ColumnInt8() is \"%+v\", want \"%+v\".", order8, tc.order)
218+
}
219+
orderB, err := rc.ColumnByte("order", 10)
220+
if !errors.Is(err, tc.err) {
221+
t.Errorf("ColumnByte() is \"%+v\", want \"%+v\".", err, tc.err)
222+
}
223+
if err == nil && orderB != byte(tc.order) {
224+
t.Errorf("ColumnByte() is \"%+v\", want \"%+v\".", orderB, tc.order)
197225
}
198226
orderByte, err := rc.ColumnNullByte("order", 10)
199227
if !errors.Is(err, tc.err) {
200-
t.Errorf("ColumnFloat() is \"%+v\", want \"%+v\".", err, tc.err)
228+
t.Errorf("ColumnNullByte() is \"%+v\", want \"%+v\".", err, tc.err)
201229
}
202230
if err == nil && orderByte != tc.orderByte {
203-
t.Errorf("ColumnFloat() is \"%+v\", want \"%+v\".", orderByte, tc.orderByte)
231+
t.Errorf("ColumnNullByte() is \"%+v\", want \"%+v\".", orderByte, tc.orderByte)
204232
}
205233
orderInt16, err := rc.ColumnNullInt16("order", 10)
206234
if !errors.Is(err, tc.err) {
207-
t.Errorf("ColumnFloat() is \"%+v\", want \"%+v\".", err, tc.err)
235+
t.Errorf("ColumnNullInt16() is \"%+v\", want \"%+v\".", err, tc.err)
208236
}
209237
if err == nil && orderInt16 != tc.orderInt16 {
210-
t.Errorf("ColumnFloat() is \"%+v\", want \"%+v\".", orderInt16, tc.orderInt16)
238+
t.Errorf("ColumnNullInt16() is \"%+v\", want \"%+v\".", orderInt16, tc.orderInt16)
211239
}
212240
orderInt32, err := rc.ColumnNullInt32("order", 10)
213241
if !errors.Is(err, tc.err) {
214-
t.Errorf("ColumnFloat() is \"%+v\", want \"%+v\".", err, tc.err)
242+
t.Errorf("ColumnNullInt32() is \"%+v\", want \"%+v\".", err, tc.err)
215243
}
216244
if err == nil && orderInt32 != tc.orderInt32 {
217-
t.Errorf("ColumnFloat() is \"%+v\", want \"%+v\".", orderInt32, tc.orderInt32)
245+
t.Errorf("ColumnNullInt32() is \"%+v\", want \"%+v\".", orderInt32, tc.orderInt32)
218246
}
219247
orderInt64, err := rc.ColumnNullInt64("order", 10)
220248
if !errors.Is(err, tc.err) {
221-
t.Errorf("ColumnFloat() is \"%+v\", want \"%+v\".", err, tc.err)
249+
t.Errorf("ColumnNullInt64() is \"%+v\", want \"%+v\".", err, tc.err)
222250
}
223251
if err == nil && orderInt64 != tc.orderInt64 {
224-
t.Errorf("ColumnFloat() is \"%+v\", want \"%+v\".", orderInt64, tc.orderInt64)
252+
t.Errorf("ColumnNullInt64() is \"%+v\", want \"%+v\".", orderInt64, tc.orderInt64)
225253
}
226254
}
227255
}

dependency.png

312 Bytes
Loading

errors.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import "errors"
44

55
var (
66
ErrNullPointer = errors.New("null reference instance")
7-
ErrNoData = errors.New("no data")
7+
ErrNullValue = errors.New("null value")
88
ErrInvalidRecord = errors.New("invalid record")
99
ErrOutOfIndex = errors.New("out of index")
1010
ErrInvalidSheetName = errors.New("invalid sheet name in Excel data")

exceldata/exceldata.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@ import (
88
"github.com/xuri/excelize/v2"
99
)
1010

11-
//Reader is class of Excel data
11+
// Reader is class of Excel data
1212
type Reader struct {
1313
rows *excelize.Rows
1414
}
1515

1616
var _ csvdata.RowsReader = (*Reader)(nil) //Reader is compatible with csvdata.RowsReader interface
1717

18-
//OpenFile returns Excel file instance.
18+
// OpenFile returns Excel file instance.
1919
func OpenFile(path, password string) (*excelize.File, error) {
2020
xlsx, err := excelize.OpenFile(path, excelize.Options{Password: password})
2121
if err != nil {
@@ -24,7 +24,7 @@ func OpenFile(path, password string) (*excelize.File, error) {
2424
return xlsx, nil
2525
}
2626

27-
//New function creates a new Reader instance.
27+
// New function creates a new Reader instance.
2828
func New(xlsx *excelize.File, sheetName string) (*Reader, error) {
2929
if len(sheetName) == 0 {
3030
sheetName = xlsx.GetSheetName(0)
@@ -40,7 +40,12 @@ func New(xlsx *excelize.File, sheetName string) (*Reader, error) {
4040
return &Reader{rows}, nil
4141
}
4242

43-
//Read method returns next row data.
43+
// LazyQuotes returns true.
44+
func (r *Reader) LazyQuotes() bool {
45+
return true
46+
}
47+
48+
// Read method returns next row data.
4449
func (r *Reader) Read() ([]string, error) {
4550
if r == nil {
4651
return nil, errs.Wrap(csvdata.ErrNullPointer)
@@ -58,7 +63,7 @@ func (r *Reader) Read() ([]string, error) {
5863
return nil, errs.Wrap(io.EOF)
5964
}
6065

61-
//Close method is dummy.
66+
// Close method is dummy.
6267
func (r *Reader) Close() error {
6368
return nil
6469
}

0 commit comments

Comments
 (0)