1
0
Fork 0
mirror of https://github.com/miniflux/v2.git synced 2025-09-30 19:22:11 +00:00

refactor(config): rewrite config parser

This PR refactors the configuration parser, replacing the old parser implementation with a new, more structured approach that includes validation and improved organization.

Key changes:
- Complete rewrite of the configuration parser using a map-based structure with built-in validation
- Addition of comprehensive validator functions for configuration values
- Renamed numerous configuration getter methods for better consistency
This commit is contained in:
Frédéric Guillot 2025-09-14 10:51:04 -07:00 committed by GitHub
parent 502e7108dd
commit 5e607be86a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
27 changed files with 3615 additions and 3523 deletions

View file

@ -414,7 +414,7 @@ func TestKeeplistRulesBehavior(t *testing.T) {
// Tests for isBlockedGlobally function
func TestIsBlockedGlobally(t *testing.T) {
var err error
config.Opts, err = config.NewParser().ParseEnvironmentVariables()
config.Opts, err = config.NewConfigParser().ParseEnvironmentVariables()
if err != nil {
t.Fatalf(`Parsing failure: %v`, err)
}
@ -429,7 +429,7 @@ func TestIsBlockedGlobally(t *testing.T) {
os.Setenv("FILTER_ENTRY_MAX_AGE_DAYS", "30")
defer os.Clearenv()
config.Opts, err = config.NewParser().ParseEnvironmentVariables()
config.Opts, err = config.NewConfigParser().ParseEnvironmentVariables()
if err != nil {
t.Fatalf(`Parsing failure: %v`, err)
}

View file

@ -31,11 +31,11 @@ func getVideoIDFromYouTubeURL(websiteURL string) string {
}
func shouldFetchYouTubeWatchTimeForSingleEntry(entry *model.Entry) bool {
return config.Opts.FetchYouTubeWatchTime() && config.Opts.YouTubeApiKey() == "" && isYouTubeVideoURL(entry.URL)
return config.Opts.FetchYouTubeWatchTime() && config.Opts.YouTubeAPIKey() == "" && isYouTubeVideoURL(entry.URL)
}
func shouldFetchYouTubeWatchTimeInBulk() bool {
return config.Opts.FetchYouTubeWatchTime() && config.Opts.YouTubeApiKey() != ""
return config.Opts.FetchYouTubeWatchTime() && config.Opts.YouTubeAPIKey() != ""
}
func fetchYouTubeWatchTimeForSingleEntry(websiteURL string) (int, error) {
@ -82,7 +82,7 @@ func fetchYouTubeWatchTimeFromApiInBulk(videoIDs []string) (map[string]time.Dura
apiQuery := url.Values{}
apiQuery.Set("id", strings.Join(videoIDs, ","))
apiQuery.Set("key", config.Opts.YouTubeApiKey())
apiQuery.Set("key", config.Opts.YouTubeAPIKey())
apiQuery.Set("part", "contentDetails")
apiURL := url.URL{

View file

@ -67,7 +67,7 @@ func TestRewriteWithNoMatchingRule(t *testing.T) {
}
func TestRewriteYoutubeVideoLink(t *testing.T) {
config.Opts = config.NewOptions()
config.Opts = config.NewConfigOptions()
controlEntry := &model.Entry{
URL: "https://www.youtube.com/watch?v=1234",
@ -87,7 +87,7 @@ func TestRewriteYoutubeVideoLink(t *testing.T) {
}
func TestRewriteYoutubeShortLink(t *testing.T) {
config.Opts = config.NewOptions()
config.Opts = config.NewConfigOptions()
controlEntry := &model.Entry{
URL: "https://www.youtube.com/shorts/1LUWKWZkPjo",
@ -107,7 +107,7 @@ func TestRewriteYoutubeShortLink(t *testing.T) {
}
func TestRewriteIncorrectYoutubeLink(t *testing.T) {
config.Opts = config.NewOptions()
config.Opts = config.NewConfigOptions()
controlEntry := &model.Entry{
URL: "https://www.youtube.com/some-page",
@ -131,7 +131,7 @@ func TestRewriteYoutubeLinkAndCustomEmbedURL(t *testing.T) {
os.Setenv("YOUTUBE_EMBED_URL_OVERRIDE", "https://invidious.custom/embed/")
var err error
parser := config.NewParser()
parser := config.NewConfigParser()
config.Opts, err = parser.ParseEnvironmentVariables()
if err != nil {
@ -156,7 +156,7 @@ func TestRewriteYoutubeLinkAndCustomEmbedURL(t *testing.T) {
}
func TestRewriteYoutubeVideoLinkUsingInvidious(t *testing.T) {
config.Opts = config.NewOptions()
config.Opts = config.NewConfigOptions()
controlEntry := &model.Entry{
URL: "https://www.youtube.com/watch?v=1234",
Title: `A title`,
@ -176,7 +176,7 @@ func TestRewriteYoutubeVideoLinkUsingInvidious(t *testing.T) {
}
func TestRewriteYoutubeShortLinkUsingInvidious(t *testing.T) {
config.Opts = config.NewOptions()
config.Opts = config.NewConfigOptions()
controlEntry := &model.Entry{
URL: "https://www.youtube.com/shorts/1LUWKWZkPjo",
Title: `A title`,
@ -196,7 +196,7 @@ func TestRewriteYoutubeShortLinkUsingInvidious(t *testing.T) {
}
func TestAddYoutubeVideoFromId(t *testing.T) {
config.Opts = config.NewOptions()
config.Opts = config.NewConfigOptions()
scenarios := map[string]string{
// Test with single YouTube ID
@ -239,7 +239,7 @@ func TestAddYoutubeVideoFromIdWithCustomEmbedURL(t *testing.T) {
os.Setenv("YOUTUBE_EMBED_URL_OVERRIDE", "https://invidious.custom/embed/")
var err error
parser := config.NewParser()
parser := config.NewConfigParser()
config.Opts, err = parser.ParseEnvironmentVariables()
if err != nil {

View file

@ -392,7 +392,7 @@ func TestInvalidNestedTag(t *testing.T) {
}
func TestInvalidIFrame(t *testing.T) {
config.Opts = config.NewOptions()
config.Opts = config.NewConfigOptions()
input := `<iframe src="http://example.org/"></iframe>`
expected := ``
@ -404,7 +404,7 @@ func TestInvalidIFrame(t *testing.T) {
}
func TestSameDomainIFrame(t *testing.T) {
config.Opts = config.NewOptions()
config.Opts = config.NewConfigOptions()
input := `<iframe src="http://example.com/test"></iframe>`
expected := ``
@ -416,7 +416,7 @@ func TestSameDomainIFrame(t *testing.T) {
}
func TestInvidiousIFrame(t *testing.T) {
config.Opts = config.NewOptions()
config.Opts = config.NewConfigOptions()
input := `<iframe src="https://yewtu.be/watch?v=video_id"></iframe>`
expected := `<iframe src="https://yewtu.be/watch?v=video_id" sandbox="allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox" loading="lazy"></iframe>`
@ -432,7 +432,7 @@ func TestCustomYoutubeEmbedURL(t *testing.T) {
defer os.Clearenv()
var err error
if config.Opts, err = config.NewParser().ParseEnvironmentVariables(); err != nil {
if config.Opts, err = config.NewConfigParser().ParseEnvironmentVariables(); err != nil {
t.Fatalf(`Parsing failure: %v`, err)
}
@ -446,7 +446,7 @@ func TestCustomYoutubeEmbedURL(t *testing.T) {
}
func TestIFrameWithChildElements(t *testing.T) {
config.Opts = config.NewOptions()
config.Opts = config.NewConfigOptions()
input := `<iframe src="https://www.youtube.com/"><p>test</p></iframe>`
expected := `<iframe src="https://www.youtube.com/" sandbox="allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox" loading="lazy"></iframe>`
@ -850,7 +850,7 @@ func TestReplaceYoutubeURLWithCustomURL(t *testing.T) {
os.Setenv("YOUTUBE_EMBED_URL_OVERRIDE", "https://invidious.custom/embed/")
var err error
config.Opts, err = config.NewParser().ParseEnvironmentVariables()
config.Opts, err = config.NewConfigParser().ParseEnvironmentVariables()
if err != nil {
t.Fatalf(`Parsing failure: %v`, err)
}