chore(all): use casers instead of strings.Title

- Add `golang.org/x/text` dependency
- Update code to use `cases.Title(language.English)`
This commit is contained in:
Quentin McGaw
2022-05-27 15:49:41 +00:00
parent bd0868d764
commit 4bde50fb3a
10 changed files with 48 additions and 22 deletions

1
go.mod
View File

@@ -18,6 +18,7 @@ require (
github.com/stretchr/testify v1.7.1 github.com/stretchr/testify v1.7.1
github.com/vishvananda/netlink v1.1.1-0.20211129163951-9ada19101fc5 github.com/vishvananda/netlink v1.1.1-0.20211129163951-9ada19101fc5
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c 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 v0.0.0-20210805125648-3957e9b9dd19
golang.zx2c4.com/wireguard/wgctrl v0.0.0-20210803171230-4253848d036c golang.zx2c4.com/wireguard/wgctrl v0.0.0-20210803171230-4253848d036c
inet.af/netaddr v0.0.0-20210718074554-06ca8145d722 inet.af/netaddr v0.0.0-20210718074554-06ca8145d722

2
go.sum
View File

@@ -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.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.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/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-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-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=

View File

@@ -12,6 +12,8 @@ import (
"github.com/qdm12/gluetun/internal/constants/providers" "github.com/qdm12/gluetun/internal/constants/providers"
"github.com/qdm12/gluetun/internal/models" "github.com/qdm12/gluetun/internal/models"
"github.com/qdm12/gluetun/internal/storage" "github.com/qdm12/gluetun/internal/storage"
"golang.org/x/text/cases"
"golang.org/x/text/language"
) )
type ServersFormatter interface { type ServersFormatter interface {
@@ -24,13 +26,13 @@ var (
ErrMultipleProvidersToFormat = errors.New("more than one VPN provider to format were specified") ErrMultipleProvidersToFormat = errors.New("more than one VPN provider to format were specified")
) )
func addProviderFlag(flagSet *flag.FlagSet, func addProviderFlag(flagSet *flag.FlagSet, providerToFormat map[string]*bool,
providerToFormat map[string]*bool, provider string) { provider string, titleCaser cases.Caser) {
boolPtr, ok := providerToFormat[provider] boolPtr, ok := providerToFormat[provider]
if !ok { if !ok {
panic(fmt.Sprintf("unknown provider in format map: %s", provider)) 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 { 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 := flag.NewFlagSet("markdown", flag.ExitOnError)
flagSet.StringVar(&format, "format", "markdown", "Format to use which can be: 'markdown'") 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") flagSet.StringVar(&output, "output", "/dev/stdout", "Output file to write the formatted data to")
titleCaser := cases.Title(language.English)
for _, provider := range allProviders { for _, provider := range allProviders {
addProviderFlag(flagSet, providersToFormat, provider) addProviderFlag(flagSet, providersToFormat, provider, titleCaser)
} }
if err := flagSet.Parse(args); err != nil { if err := flagSet.Parse(args); err != nil {
return err return err

View File

@@ -6,10 +6,11 @@ import (
"fmt" "fmt"
"io" "io"
"os" "os"
"strings"
"github.com/qdm12/gluetun/internal/constants/providers" "github.com/qdm12/gluetun/internal/constants/providers"
"github.com/qdm12/gluetun/internal/models" "github.com/qdm12/gluetun/internal/models"
"golang.org/x/text/cases"
"golang.org/x/text/language"
) )
// readFromFile reads the servers from server.json. // readFromFile reads the servers from server.json.
@@ -47,6 +48,7 @@ func (s *Storage) extractServersFromBytes(b []byte, hardcoded models.AllServers)
allProviders := providers.All() allProviders := providers.All()
servers.ProviderToServers = make(map[string]models.Servers, len(allProviders)) servers.ProviderToServers = make(map[string]models.Servers, len(allProviders))
titleCaser := cases.Title(language.English)
for _, provider := range allProviders { for _, provider := range allProviders {
hardcoded, ok := hardcoded.ProviderToServers[provider] hardcoded, ok := hardcoded.ProviderToServers[provider]
if !ok { if !ok {
@@ -62,7 +64,7 @@ func (s *Storage) extractServersFromBytes(b []byte, hardcoded models.AllServers)
continue continue
} }
mergedServers, versionsMatch, err := s.readServers(provider, hardcoded, rawMessage) mergedServers, versionsMatch, err := s.readServers(provider, hardcoded, rawMessage, titleCaser)
if err != nil { if err != nil {
return models.AllServers{}, err return models.AllServers{}, err
} else if !versionsMatch { } else if !versionsMatch {
@@ -81,8 +83,9 @@ var (
) )
func (s *Storage) readServers(provider string, hardcoded models.Servers, func (s *Storage) readServers(provider string, hardcoded models.Servers,
rawMessage json.RawMessage) (servers models.Servers, versionsMatch bool, err error) { rawMessage json.RawMessage, titleCaser cases.Caser) (servers models.Servers,
provider = strings.Title(provider) versionsMatch bool, err error) {
provider = titleCaser.String(provider)
var persistedServers models.Servers var persistedServers models.Servers
err = json.Unmarshal(rawMessage, &persistedServers) err = json.Unmarshal(rawMessage, &persistedServers)

View File

@@ -6,11 +6,12 @@ import (
"strings" "strings"
"github.com/qdm12/gluetun/internal/constants" "github.com/qdm12/gluetun/internal/constants"
"golang.org/x/text/cases"
) )
var errCountryCodeUnknown = errors.New("country code is unknown") 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) { country, city string, err error) {
const prefix = "ipvanish-" const prefix = "ipvanish-"
s := strings.TrimPrefix(fileName, prefix) s := strings.TrimPrefix(fileName, prefix)
@@ -28,11 +29,11 @@ func parseFilename(fileName, hostname string) (
if !ok { if !ok {
return "", "", fmt.Errorf("%w: %s", errCountryCodeUnknown, countryCode) return "", "", fmt.Errorf("%w: %s", errCountryCodeUnknown, countryCode)
} }
country = strings.Title(country) country = titleCaser.String(country)
if len(parts) > 1 { if len(parts) > 1 {
city = strings.Join(parts[1:], " ") city = strings.Join(parts[1:], " ")
city = strings.Title(city) city = titleCaser.String(city)
} }
return country, city, nil return country, city, nil

View File

@@ -6,6 +6,8 @@ import (
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"golang.org/x/text/cases"
"golang.org/x/text/language"
) )
func Test_parseFilename(t *testing.T) { func Test_parseFilename(t *testing.T) {
@@ -39,7 +41,8 @@ func Test_parseFilename(t *testing.T) {
t.Run(name, func(t *testing.T) { t.Run(name, func(t *testing.T) {
t.Parallel() 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 { if testCase.err != nil {
require.Error(t, err) require.Error(t, err)

View File

@@ -12,6 +12,8 @@ import (
"github.com/qdm12/gluetun/internal/updater/openvpn" "github.com/qdm12/gluetun/internal/updater/openvpn"
"github.com/qdm12/gluetun/internal/updater/resolver" "github.com/qdm12/gluetun/internal/updater/resolver"
"github.com/qdm12/gluetun/internal/updater/unzip" "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") var ErrNotEnoughServers = errors.New("not enough servers found")
@@ -30,6 +32,7 @@ func GetServers(ctx context.Context, unzipper unzip.Unzipper,
hts := make(hostToServer) hts := make(hostToServer)
titleCaser := cases.Title(language.English)
for fileName, content := range contents { for fileName, content := range contents {
if !strings.HasSuffix(fileName, ".ovpn") { if !strings.HasSuffix(fileName, ".ovpn") {
continue // not an OpenVPN file continue // not an OpenVPN file
@@ -54,7 +57,7 @@ func GetServers(ctx context.Context, unzipper unzip.Unzipper,
continue continue
} }
country, city, err := parseFilename(fileName, hostname) country, city, err := parseFilename(fileName, hostname, titleCaser)
if err != nil { if err != nil {
// treat error as warning and go to next file // treat error as warning and go to next file
warning := err.Error() + " in " + fileName warning := err.Error() + " in " + fileName

View File

@@ -1,8 +1,12 @@
package torguard 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 prefix = "TorGuard."
const suffix = ".ovpn" const suffix = ".ovpn"
s := strings.TrimPrefix(fileName, prefix) 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.ReplaceAll(s, ".", " ") s = strings.ReplaceAll(s, ".", " ")
s = strings.ToLower(s) s = strings.ToLower(s)
s = strings.Title(s) s = titleCaser.String(s)
city = s city = s
default: default:

View File

@@ -12,6 +12,8 @@ import (
"github.com/qdm12/gluetun/internal/updater/openvpn" "github.com/qdm12/gluetun/internal/updater/openvpn"
"github.com/qdm12/gluetun/internal/updater/resolver" "github.com/qdm12/gluetun/internal/updater/resolver"
"github.com/qdm12/gluetun/internal/updater/unzip" "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") var ErrNotEnoughServers = errors.New("not enough servers found")
@@ -32,16 +34,17 @@ func GetServers(ctx context.Context, unzipper unzip.Unzipper,
} }
hts := make(hostToServer) hts := make(hostToServer)
titleCaser := cases.Title(language.English)
for fileName, content := range tcpContents { for fileName, content := range tcpContents {
const tcp, udp = true, false const tcp, udp = true, false
newWarnings := addServerFromOvpn(fileName, content, hts, tcp, udp) newWarnings := addServerFromOvpn(fileName, content, hts, tcp, udp, titleCaser)
warnings = append(warnings, newWarnings...) warnings = append(warnings, newWarnings...)
} }
for fileName, content := range udpContents { for fileName, content := range udpContents {
const tcp, udp = false, true const tcp, udp = false, true
newWarnings := addServerFromOvpn(fileName, content, hts, tcp, udp) newWarnings := addServerFromOvpn(fileName, content, hts, tcp, udp, titleCaser)
warnings = append(warnings, newWarnings...) warnings = append(warnings, newWarnings...)
} }
@@ -72,12 +75,12 @@ func GetServers(ctx context.Context, unzipper unzip.Unzipper,
} }
func addServerFromOvpn(fileName string, content []byte, 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") { if !strings.HasSuffix(fileName, ".ovpn") {
return nil // not an OpenVPN file return nil // not an OpenVPN file
} }
country, city := parseFilename(fileName) country, city := parseFilename(fileName, titleCaser)
host, warning, err := openvpn.ExtractHost(content) host, warning, err := openvpn.ExtractHost(content)
if warning != "" { if warning != "" {

View File

@@ -4,13 +4,14 @@ package updater
import ( import (
"context" "context"
"net/http" "net/http"
"strings"
"time" "time"
"github.com/qdm12/gluetun/internal/configuration/settings" "github.com/qdm12/gluetun/internal/configuration/settings"
"github.com/qdm12/gluetun/internal/models" "github.com/qdm12/gluetun/internal/models"
"github.com/qdm12/gluetun/internal/updater/resolver" "github.com/qdm12/gluetun/internal/updater/resolver"
"github.com/qdm12/gluetun/internal/updater/unzip" "github.com/qdm12/gluetun/internal/updater/unzip"
"golang.org/x/text/cases"
"golang.org/x/text/language"
) )
type Updater interface { 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) { func (u *updater) UpdateServers(ctx context.Context) (allServers models.AllServers, err error) {
for _, provider := range u.options.Providers { 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 // TODO support servers offering only TCP or only UDP
// for NordVPN and PureVPN // for NordVPN and PureVPN
warnings, err := u.updateProvider(ctx, provider) warnings, err := u.updateProvider(ctx, provider)