From 4bde50fb3ad3787ff7baf0aebe7053296419d3da Mon Sep 17 00:00:00 2001 From: Quentin McGaw Date: Fri, 27 May 2022 15:49:41 +0000 Subject: [PATCH] chore(all): use casers instead of `strings.Title` - Add `golang.org/x/text` dependency - Update code to use `cases.Title(language.English)` --- go.mod | 1 + go.sum | 2 ++ internal/cli/formatservers.go | 11 +++++++---- internal/storage/read.go | 11 +++++++---- internal/updater/providers/ipvanish/filename.go | 7 ++++--- internal/updater/providers/ipvanish/filename_test.go | 5 ++++- internal/updater/providers/ipvanish/servers.go | 5 ++++- internal/updater/providers/torguard/filename.go | 10 +++++++--- internal/updater/providers/torguard/servers.go | 11 +++++++---- internal/updater/updater.go | 7 +++++-- 10 files changed, 48 insertions(+), 22 deletions(-) diff --git a/go.mod b/go.mod index 1cda38d6..79c64f91 100644 --- a/go.mod +++ b/go.mod @@ -18,6 +18,7 @@ require ( github.com/stretchr/testify v1.7.1 github.com/vishvananda/netlink v1.1.1-0.20211129163951-9ada19101fc5 golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c + golang.org/x/text v0.3.7 golang.zx2c4.com/wireguard v0.0.0-20210805125648-3957e9b9dd19 golang.zx2c4.com/wireguard/wgctrl v0.0.0-20210803171230-4253848d036c inet.af/netaddr v0.0.0-20210718074554-06ca8145d722 diff --git a/go.sum b/go.sum index 325e7eaf..b412b715 100644 --- a/go.sum +++ b/go.sum @@ -222,6 +222,8 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= diff --git a/internal/cli/formatservers.go b/internal/cli/formatservers.go index ae73dbdd..8c236b23 100644 --- a/internal/cli/formatservers.go +++ b/internal/cli/formatservers.go @@ -12,6 +12,8 @@ import ( "github.com/qdm12/gluetun/internal/constants/providers" "github.com/qdm12/gluetun/internal/models" "github.com/qdm12/gluetun/internal/storage" + "golang.org/x/text/cases" + "golang.org/x/text/language" ) type ServersFormatter interface { @@ -24,13 +26,13 @@ var ( ErrMultipleProvidersToFormat = errors.New("more than one VPN provider to format were specified") ) -func addProviderFlag(flagSet *flag.FlagSet, - providerToFormat map[string]*bool, provider string) { +func addProviderFlag(flagSet *flag.FlagSet, providerToFormat map[string]*bool, + provider string, titleCaser cases.Caser) { boolPtr, ok := providerToFormat[provider] if !ok { panic(fmt.Sprintf("unknown provider in format map: %s", provider)) } - flagSet.BoolVar(boolPtr, provider, false, "Format "+strings.Title(provider)+" servers") + flagSet.BoolVar(boolPtr, provider, false, "Format "+titleCaser.String(provider)+" servers") } func (c *CLI) FormatServers(args []string) error { @@ -43,8 +45,9 @@ func (c *CLI) FormatServers(args []string) error { flagSet := flag.NewFlagSet("markdown", flag.ExitOnError) flagSet.StringVar(&format, "format", "markdown", "Format to use which can be: 'markdown'") flagSet.StringVar(&output, "output", "/dev/stdout", "Output file to write the formatted data to") + titleCaser := cases.Title(language.English) for _, provider := range allProviders { - addProviderFlag(flagSet, providersToFormat, provider) + addProviderFlag(flagSet, providersToFormat, provider, titleCaser) } if err := flagSet.Parse(args); err != nil { return err diff --git a/internal/storage/read.go b/internal/storage/read.go index 1bc8122c..c0496594 100644 --- a/internal/storage/read.go +++ b/internal/storage/read.go @@ -6,10 +6,11 @@ import ( "fmt" "io" "os" - "strings" "github.com/qdm12/gluetun/internal/constants/providers" "github.com/qdm12/gluetun/internal/models" + "golang.org/x/text/cases" + "golang.org/x/text/language" ) // readFromFile reads the servers from server.json. @@ -47,6 +48,7 @@ func (s *Storage) extractServersFromBytes(b []byte, hardcoded models.AllServers) allProviders := providers.All() servers.ProviderToServers = make(map[string]models.Servers, len(allProviders)) + titleCaser := cases.Title(language.English) for _, provider := range allProviders { hardcoded, ok := hardcoded.ProviderToServers[provider] if !ok { @@ -62,7 +64,7 @@ func (s *Storage) extractServersFromBytes(b []byte, hardcoded models.AllServers) continue } - mergedServers, versionsMatch, err := s.readServers(provider, hardcoded, rawMessage) + mergedServers, versionsMatch, err := s.readServers(provider, hardcoded, rawMessage, titleCaser) if err != nil { return models.AllServers{}, err } else if !versionsMatch { @@ -81,8 +83,9 @@ var ( ) func (s *Storage) readServers(provider string, hardcoded models.Servers, - rawMessage json.RawMessage) (servers models.Servers, versionsMatch bool, err error) { - provider = strings.Title(provider) + rawMessage json.RawMessage, titleCaser cases.Caser) (servers models.Servers, + versionsMatch bool, err error) { + provider = titleCaser.String(provider) var persistedServers models.Servers err = json.Unmarshal(rawMessage, &persistedServers) diff --git a/internal/updater/providers/ipvanish/filename.go b/internal/updater/providers/ipvanish/filename.go index bf5c5fe9..f87541b9 100644 --- a/internal/updater/providers/ipvanish/filename.go +++ b/internal/updater/providers/ipvanish/filename.go @@ -6,11 +6,12 @@ import ( "strings" "github.com/qdm12/gluetun/internal/constants" + "golang.org/x/text/cases" ) var errCountryCodeUnknown = errors.New("country code is unknown") -func parseFilename(fileName, hostname string) ( +func parseFilename(fileName, hostname string, titleCaser cases.Caser) ( country, city string, err error) { const prefix = "ipvanish-" s := strings.TrimPrefix(fileName, prefix) @@ -28,11 +29,11 @@ func parseFilename(fileName, hostname string) ( if !ok { return "", "", fmt.Errorf("%w: %s", errCountryCodeUnknown, countryCode) } - country = strings.Title(country) + country = titleCaser.String(country) if len(parts) > 1 { city = strings.Join(parts[1:], " ") - city = strings.Title(city) + city = titleCaser.String(city) } return country, city, nil diff --git a/internal/updater/providers/ipvanish/filename_test.go b/internal/updater/providers/ipvanish/filename_test.go index 1a905896..be366cb4 100644 --- a/internal/updater/providers/ipvanish/filename_test.go +++ b/internal/updater/providers/ipvanish/filename_test.go @@ -6,6 +6,8 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "golang.org/x/text/cases" + "golang.org/x/text/language" ) func Test_parseFilename(t *testing.T) { @@ -39,7 +41,8 @@ func Test_parseFilename(t *testing.T) { t.Run(name, func(t *testing.T) { t.Parallel() - country, city, err := parseFilename(testCase.fileName, testCase.hostname) + titleCaser := cases.Title(language.English) + country, city, err := parseFilename(testCase.fileName, testCase.hostname, titleCaser) if testCase.err != nil { require.Error(t, err) diff --git a/internal/updater/providers/ipvanish/servers.go b/internal/updater/providers/ipvanish/servers.go index 3a77e246..e34a14af 100644 --- a/internal/updater/providers/ipvanish/servers.go +++ b/internal/updater/providers/ipvanish/servers.go @@ -12,6 +12,8 @@ import ( "github.com/qdm12/gluetun/internal/updater/openvpn" "github.com/qdm12/gluetun/internal/updater/resolver" "github.com/qdm12/gluetun/internal/updater/unzip" + "golang.org/x/text/cases" + "golang.org/x/text/language" ) var ErrNotEnoughServers = errors.New("not enough servers found") @@ -30,6 +32,7 @@ func GetServers(ctx context.Context, unzipper unzip.Unzipper, hts := make(hostToServer) + titleCaser := cases.Title(language.English) for fileName, content := range contents { if !strings.HasSuffix(fileName, ".ovpn") { continue // not an OpenVPN file @@ -54,7 +57,7 @@ func GetServers(ctx context.Context, unzipper unzip.Unzipper, continue } - country, city, err := parseFilename(fileName, hostname) + country, city, err := parseFilename(fileName, hostname, titleCaser) if err != nil { // treat error as warning and go to next file warning := err.Error() + " in " + fileName diff --git a/internal/updater/providers/torguard/filename.go b/internal/updater/providers/torguard/filename.go index cc59035a..39b5b912 100644 --- a/internal/updater/providers/torguard/filename.go +++ b/internal/updater/providers/torguard/filename.go @@ -1,8 +1,12 @@ package torguard -import "strings" +import ( + "strings" -func parseFilename(fileName string) (country, city string) { + "golang.org/x/text/cases" +) + +func parseFilename(fileName string, titleCaser cases.Caser) (country, city string) { const prefix = "TorGuard." const suffix = ".ovpn" s := strings.TrimPrefix(fileName, prefix) @@ -20,7 +24,7 @@ func parseFilename(fileName string) (country, city string) { s = strings.ReplaceAll(s, "-", " ") s = strings.ReplaceAll(s, ".", " ") s = strings.ToLower(s) - s = strings.Title(s) + s = titleCaser.String(s) city = s default: diff --git a/internal/updater/providers/torguard/servers.go b/internal/updater/providers/torguard/servers.go index ecb56814..b60423f1 100644 --- a/internal/updater/providers/torguard/servers.go +++ b/internal/updater/providers/torguard/servers.go @@ -12,6 +12,8 @@ import ( "github.com/qdm12/gluetun/internal/updater/openvpn" "github.com/qdm12/gluetun/internal/updater/resolver" "github.com/qdm12/gluetun/internal/updater/unzip" + "golang.org/x/text/cases" + "golang.org/x/text/language" ) var ErrNotEnoughServers = errors.New("not enough servers found") @@ -32,16 +34,17 @@ func GetServers(ctx context.Context, unzipper unzip.Unzipper, } hts := make(hostToServer) + titleCaser := cases.Title(language.English) for fileName, content := range tcpContents { const tcp, udp = true, false - newWarnings := addServerFromOvpn(fileName, content, hts, tcp, udp) + newWarnings := addServerFromOvpn(fileName, content, hts, tcp, udp, titleCaser) warnings = append(warnings, newWarnings...) } for fileName, content := range udpContents { const tcp, udp = false, true - newWarnings := addServerFromOvpn(fileName, content, hts, tcp, udp) + newWarnings := addServerFromOvpn(fileName, content, hts, tcp, udp, titleCaser) warnings = append(warnings, newWarnings...) } @@ -72,12 +75,12 @@ func GetServers(ctx context.Context, unzipper unzip.Unzipper, } func addServerFromOvpn(fileName string, content []byte, - hts hostToServer, tcp, udp bool) (warnings []string) { + hts hostToServer, tcp, udp bool, titleCaser cases.Caser) (warnings []string) { if !strings.HasSuffix(fileName, ".ovpn") { return nil // not an OpenVPN file } - country, city := parseFilename(fileName) + country, city := parseFilename(fileName, titleCaser) host, warning, err := openvpn.ExtractHost(content) if warning != "" { diff --git a/internal/updater/updater.go b/internal/updater/updater.go index 2703b892..a806a3ea 100644 --- a/internal/updater/updater.go +++ b/internal/updater/updater.go @@ -4,13 +4,14 @@ package updater import ( "context" "net/http" - "strings" "time" "github.com/qdm12/gluetun/internal/configuration/settings" "github.com/qdm12/gluetun/internal/models" "github.com/qdm12/gluetun/internal/updater/resolver" "github.com/qdm12/gluetun/internal/updater/unzip" + "golang.org/x/text/cases" + "golang.org/x/text/language" ) type Updater interface { @@ -46,9 +47,11 @@ func New(settings settings.Updater, httpClient *http.Client, } } +var caser = cases.Title(language.English) //nolint:gochecknoglobals + func (u *updater) UpdateServers(ctx context.Context) (allServers models.AllServers, err error) { for _, provider := range u.options.Providers { - u.logger.Info("updating " + strings.Title(provider) + " servers...") + u.logger.Info("updating " + caser.String(provider) + " servers...") // TODO support servers offering only TCP or only UDP // for NordVPN and PureVPN warnings, err := u.updateProvider(ctx, provider)