Skip to content

Commit 90563bb

Browse files
committed
feat(v2): Add constructors for format-specific parsers
- Add NewParser() constructors for RSS, Atom, and JSON parsers - Update universal parser to use constructors instead of struct literals - Remove MaxItems functionality as it was misleading (still read entire feed) - Update all tests to use constructors Breaking changes: - Direct struct initialization of parsers is discouraged - MaxItems removed from ParseOptions Closes #248
1 parent b97f26e commit 90563bb

File tree

9 files changed

+26
-38
lines changed

9 files changed

+26
-38
lines changed

atom/parser.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ var (
2525
// Parser is an Atom Parser
2626
type Parser struct{}
2727

28+
// NewParser creates a new Atom parser
29+
func NewParser() *Parser {
30+
return &Parser{}
31+
}
32+
2833
// Parse parses an xml feed into an atom.Feed
2934
func (ap *Parser) Parse(feed io.Reader, opts *shared.ParseOptions) (*Feed, error) {
3035
p := xpp.NewXMLPullParser(feed, false, shared.NewReaderLabel)
@@ -154,12 +159,6 @@ func (ap *Parser) parseRoot(p *xpp.XMLPullParser, opts *shared.ParseOptions) (*F
154159
}
155160
categories = append(categories, result)
156161
} else if name == "entry" {
157-
// Check if we've reached the MaxItems limit
158-
if opts != nil && opts.MaxItems > 0 && len(atom.Entries) >= opts.MaxItems {
159-
p.Skip() // Skip this entry
160-
continue
161-
}
162-
163162
result, err := ap.parseEntry(p)
164163
if err != nil {
165164
return nil, err

atom/parser_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ func TestParser_Parse(t *testing.T) {
2828
f, _ := os.ReadFile(ff)
2929

3030
// Parse actual feed
31-
fp := &atom.Parser{}
31+
fp := atom.NewParser()
3232
actual, _ := fp.Parse(bytes.NewReader(f), nil)
3333

3434
// Get json encoded expected feed result

internal/shared/parse_options.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@ type ParseOptions struct {
1616
// Parsing behavior options
1717
StrictnessOptions StrictnessOptions
1818

19-
// Limit the number of items parsed from the feed
20-
MaxItems int
21-
2219
// HTTP request configuration for ParseURL
2320
RequestOptions RequestOptions
2421
}
@@ -50,7 +47,6 @@ func DefaultParseOptions() *ParseOptions {
5047
AllowMissingRequired: true,
5148
AllowUnescapedMarkup: true,
5249
},
53-
MaxItems: 0, // No limit
5450
RequestOptions: RequestOptions{
5551
UserAgent: "gofeed/2.0 (+https://github.com/mmcdole/gofeed)",
5652
Timeout: 60 * time.Second,

json/parser.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ import (
1212
// Parser is an JSON Feed Parser
1313
type Parser struct{}
1414

15+
// NewParser creates a new JSON Feed parser
16+
func NewParser() *Parser {
17+
return &Parser{}
18+
}
19+
1520
// Parse parses an json feed into an json.Feed
1621
func (ap *Parser) Parse(feed io.Reader, opts *shared.ParseOptions) (*Feed, error) {
1722
jsonFeed := &Feed{}
@@ -24,10 +29,5 @@ func (ap *Parser) Parse(feed io.Reader, opts *shared.ParseOptions) (*Feed, error
2429
return nil, err
2530
}
2631

27-
// Apply MaxItems limit after unmarshaling
28-
if opts != nil && opts.MaxItems > 0 && len(jsonFeed.Items) > opts.MaxItems {
29-
jsonFeed.Items = jsonFeed.Items[:opts.MaxItems]
30-
}
31-
3232
return jsonFeed, nil
3333
}

json/parser_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ func TestParser_Parse(t *testing.T) {
3434
f, _ := os.ReadFile(ff)
3535

3636
// Parse actual feed
37-
fp := &jsonParser.Parser{}
37+
fp := jsonParser.NewParser()
3838
actual, _ := fp.Parse(bytes.NewReader(f), nil)
3939

4040
// Get json encoded expected feed result
@@ -64,7 +64,7 @@ func TestParser_ParseInvalidAndStruct(t *testing.T) {
6464
f, _ := os.ReadFile(ff)
6565

6666
// Parse actual feed
67-
fp := &jsonParser.Parser{}
67+
fp := jsonParser.NewParser()
6868
_, err := fp.Parse(bytes.NewReader(f), nil)
6969
assert.Contains(t, err.Error(), "unexpected end of JSON input")
7070

parser.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@ type Auth struct {
5252
// NewParser creates a universal feed parser.
5353
func NewParser() *Parser {
5454
fp := Parser{
55-
rp: &rss.Parser{},
56-
ap: &atom.Parser{},
57-
jp: &json.Parser{},
55+
rp: rss.NewParser(),
56+
ap: atom.NewParser(),
57+
jp: json.NewParser(),
5858
}
5959
return &fp
6060
}

rss/parser.go

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ import (
1313
// Parser is a RSS Parser
1414
type Parser struct{}
1515

16+
// NewParser creates a new RSS parser
17+
func NewParser() *Parser {
18+
return &Parser{}
19+
}
20+
1621
// Parse parses an xml feed into an rss.Feed
1722
func (rp *Parser) Parse(feed io.Reader, opts *shared.ParseOptions) (*Feed, error) {
1823
p := xpp.NewXMLPullParser(feed, false, shared.NewReaderLabel)
@@ -66,12 +71,6 @@ func (rp *Parser) parseRoot(p *xpp.XMLPullParser, opts *shared.ParseOptions) (*F
6671
return nil, err
6772
}
6873
} else if name == "item" {
69-
// Check if we've reached the MaxItems limit
70-
if opts != nil && opts.MaxItems > 0 && len(items) >= opts.MaxItems {
71-
p.Skip() // Skip this item
72-
continue
73-
}
74-
7574
item, err := rp.parseItem(p)
7675
if err != nil {
7776
return nil, err
@@ -254,12 +253,6 @@ func (rp *Parser) parseChannel(p *xpp.XMLPullParser, opts *shared.ParseOptions)
254253
}
255254
rss.SkipDays = result
256255
} else if name == "item" {
257-
// Check if we've reached the MaxItems limit
258-
if opts != nil && opts.MaxItems > 0 && len(rss.Items) >= opts.MaxItems {
259-
p.Skip() // Skip this item
260-
continue
261-
}
262-
263256
result, err := rp.parseItem(p)
264257
if err != nil {
265258
return nil, err

rss/parser_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ func TestParser_Parse(t *testing.T) {
2626
f, _ := os.ReadFile(ff)
2727

2828
// Parse actual feed
29-
fp := &rss.Parser{}
29+
fp := rss.NewParser()
3030
actual, _ := fp.Parse(bytes.NewReader(f), nil)
3131

3232
// Get json encoded expected feed result

translator_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ func TestDefaultRSSTranslator_Translate(t *testing.T) {
3030

3131
// Parse actual feed
3232
translator := &gofeed.DefaultRSSTranslator{}
33-
fp := &rss.Parser{}
33+
fp := rss.NewParser()
3434
rssFeed, _ := fp.Parse(f, nil)
3535
actual, _ := translator.Translate(rssFeed, nil)
3636

@@ -72,7 +72,7 @@ func TestDefaultAtomTranslator_Translate(t *testing.T) {
7272

7373
// Parse actual feed
7474
translator := &gofeed.DefaultAtomTranslator{}
75-
fp := &atom.Parser{}
75+
fp := atom.NewParser()
7676
atomFeed, _ := fp.Parse(f, nil)
7777
actual, _ := translator.Translate(atomFeed, nil)
7878

@@ -118,7 +118,7 @@ func TestDefaultJSONTranslator_Translate(t *testing.T) {
118118

119119
// Parse actual feed
120120
translator := &gofeed.DefaultJSONTranslator{}
121-
fp := json.Parser{}
121+
fp := json.NewParser()
122122
jsonFeed, _ := fp.Parse(f, nil)
123123
actual, _ := translator.Translate(jsonFeed, nil)
124124

@@ -151,7 +151,7 @@ func TestDefaultJSONTranslator_Translate(t *testing.T) {
151151
152152
// Parse actual feed
153153
translator := &gofeed.DefaultJSONTranslator{}
154-
fp := json.Parser{}
154+
fp := json.NewParser()
155155
feed, _ := fp.Parse(bytes.NewReader(f), nil)
156156
actual, _ := translator.Translate(feed, nil)
157157

0 commit comments

Comments
 (0)