Store cache dir preference in config file and soft fail if cache dir error

pull/71/head
Miguel Mota 4 years ago
parent f82c113ed6
commit 890e1c5704

@ -8,6 +8,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed ### Fixed
- Rank order for low market cap coins - Rank order for low market cap coins
### Added
- Colorschemes directory flag
## [1.5.3] - 2020-08-14 ## [1.5.3] - 2020-08-14
### Fixed ### Fixed
- Build error - Build error

@ -25,7 +25,7 @@ func RootCmd() *cobra.Command {
var apiChoice string var apiChoice string
var colorscheme string var colorscheme string
var perPage = cointop.DefaultPerPage var perPage = cointop.DefaultPerPage
var cacheDir = cointop.DefaultCacheDir var cacheDir string
var colorsDir string var colorsDir string
rootCmd := &cobra.Command{ rootCmd := &cobra.Command{
@ -116,7 +116,7 @@ See git.io/cointop for more info.`,
rootCmd.Flags().StringVarP(&cmcAPIKey, "coinmarketcap-api-key", "", "", "Set the CoinMarketCap API key") rootCmd.Flags().StringVarP(&cmcAPIKey, "coinmarketcap-api-key", "", "", "Set the CoinMarketCap API key")
rootCmd.Flags().StringVarP(&apiChoice, "api", "", "", "API choice. Available choices are \"coinmarketcap\" and \"coingecko\"") rootCmd.Flags().StringVarP(&apiChoice, "api", "", "", "API choice. Available choices are \"coinmarketcap\" and \"coingecko\"")
rootCmd.Flags().StringVarP(&colorscheme, "colorscheme", "", "", fmt.Sprintf("Colorscheme to use (default \"cointop\").\n%s", cointop.ColorschemeHelpString())) rootCmd.Flags().StringVarP(&colorscheme, "colorscheme", "", "", fmt.Sprintf("Colorscheme to use (default \"cointop\").\n%s", cointop.ColorschemeHelpString()))
rootCmd.Flags().StringVarP(&cacheDir, "cache-dir", "", cacheDir, "Cache directory") rootCmd.Flags().StringVarP(&cacheDir, "cache-dir", "", cacheDir, fmt.Sprintf("Cache directory (default %s)", cointop.DefaultCacheDir))
rootCmd.Flags().StringVarP(&colorsDir, "colors-dir", "", colorsDir, "Colorschemes directory") rootCmd.Flags().StringVarP(&colorsDir, "colors-dir", "", colorsDir, "Colorschemes directory")
return rootCmd return rootCmd

@ -42,6 +42,7 @@ type Views struct {
type State struct { type State struct {
allCoins []*Coin allCoins []*Coin
allCoinsSlugMap sync.Map allCoinsSlugMap sync.Map
cacheDir string
coins []*Coin coins []*Coin
chartPoints [][]termui.Cell chartPoints [][]termui.Cell
currencyConversion string currencyConversion string
@ -175,13 +176,6 @@ func NewCointop(config *Config) (*Cointop, error) {
configFilepath = config.ConfigFilepath configFilepath = config.ConfigFilepath
} }
var fcache *filecache.FileCache
if !config.NoCache {
fcache = filecache.NewFileCache(&filecache.Config{
CacheDir: config.CacheDir,
})
}
perPage := DefaultPerPage perPage := DefaultPerPage
if config.PerPage != 0 { if config.PerPage != 0 {
perPage = config.PerPage perPage = config.PerPage
@ -200,9 +194,10 @@ func NewCointop(config *Config) (*Cointop, error) {
debug: debug, debug: debug,
chartRangesMap: ChartRangesMap(), chartRangesMap: ChartRangesMap(),
limiter: time.Tick(2 * time.Second), limiter: time.Tick(2 * time.Second),
filecache: fcache, filecache: nil,
State: &State{ State: &State{
allCoins: []*Coin{}, allCoins: []*Coin{},
cacheDir: DefaultCacheDir,
currencyConversion: "USD", currencyConversion: "USD",
// DEPRECATED: favorites by 'symbol' is deprecated because of collisions. Kept for backward compatibility. // DEPRECATED: favorites by 'symbol' is deprecated because of collisions. Kept for backward compatibility.
favoritesBySymbol: make(map[string]bool), favoritesBySymbol: make(map[string]bool),
@ -258,6 +253,24 @@ func NewCointop(config *Config) (*Cointop, error) {
ct.refreshTicker = time.NewTicker(ct.State.refreshRate) ct.refreshTicker = time.NewTicker(ct.State.refreshRate)
} }
if config.CacheDir != "" {
ct.State.cacheDir = pathutil.NormalizePath(config.CacheDir)
if err := ct.SaveConfig(); err != nil {
return nil, err
}
}
if !config.NoCache {
fcache, err := filecache.NewFileCache(&filecache.Config{
CacheDir: ct.State.cacheDir,
})
if err != nil {
fmt.Printf("error: %s\nproceeding without filecache.", err)
}
ct.filecache = fcache
}
// prompt for CoinMarketCap api key if not found // prompt for CoinMarketCap api key if not found
if config.CoinMarketCapAPIKey != "" { if config.CoinMarketCapAPIKey != "" {
ct.apiKeys.cmc = config.CoinMarketCapAPIKey ct.apiKeys.cmc = config.CoinMarketCapAPIKey
@ -440,7 +453,7 @@ func Clean(config *CleanConfig) error {
cacheDir := DefaultCacheDir cacheDir := DefaultCacheDir
if config.CacheDir != "" { if config.CacheDir != "" {
cacheDir = config.CacheDir cacheDir = pathutil.NormalizePath(config.CacheDir)
} }
if _, err := os.Stat(cacheDir); !os.IsNotExist(err) { if _, err := os.Stat(cacheDir); !os.IsNotExist(err) {

@ -16,7 +16,7 @@ import (
) )
// DefaultCacheDir ... // DefaultCacheDir ...
var DefaultCacheDir = "/tmp" var DefaultCacheDir = "/tmp1"
// FileCache ... // FileCache ...
type FileCache struct { type FileCache struct {
@ -30,7 +30,7 @@ type Config struct {
} }
// NewFileCache ... // NewFileCache ...
func NewFileCache(config *Config) *FileCache { func NewFileCache(config *Config) (*FileCache, error) {
if config == nil { if config == nil {
config = &Config{} config = &Config{}
} }
@ -42,14 +42,14 @@ func NewFileCache(config *Config) *FileCache {
if _, err := os.Stat(cacheDir); os.IsNotExist(err) { if _, err := os.Stat(cacheDir); os.IsNotExist(err) {
if err := os.MkdirAll(cacheDir, 0700); err != nil { if err := os.MkdirAll(cacheDir, 0700); err != nil {
panic(err) return nil, err
} }
} }
return &FileCache{ return &FileCache{
muts: make(map[string]*sync.Mutex), muts: make(map[string]*sync.Mutex),
cacheDir: cacheDir, cacheDir: cacheDir,
} }, nil
} }
// Set writes item to cache // Set writes item to cache

@ -34,6 +34,7 @@ type config struct {
API interface{} `toml:"api"` API interface{} `toml:"api"`
Colorscheme interface{} `toml:"colorscheme"` Colorscheme interface{} `toml:"colorscheme"`
RefreshRate interface{} `toml:"refresh_rate"` RefreshRate interface{} `toml:"refresh_rate"`
CacheDir interface{} `toml:"cache_dir"`
} }
// SetupConfig loads config file // SetupConfig loads config file
@ -69,6 +70,9 @@ func (ct *Cointop) SetupConfig() error {
if err := ct.loadRefreshRateFromConfig(); err != nil { if err := ct.loadRefreshRateFromConfig(); err != nil {
return err return err
} }
if err := ct.loadCacheDirFromConfig(); err != nil {
return err
}
if err := ct.loadPortfolioFromConfig(); err != nil { if err := ct.loadPortfolioFromConfig(); err != nil {
return err return err
} }
@ -217,6 +221,7 @@ func (ct *Cointop) configToToml() ([]byte, error) {
var defaultViewIfc interface{} = ct.State.defaultView var defaultViewIfc interface{} = ct.State.defaultView
var colorschemeIfc interface{} = ct.colorschemeName var colorschemeIfc interface{} = ct.colorschemeName
var refreshRateIfc interface{} = uint(ct.State.refreshRate.Seconds()) var refreshRateIfc interface{} = uint(ct.State.refreshRate.Seconds())
var cacheDirIfc interface{} = ct.State.cacheDir
cmcIfc := map[string]interface{}{ cmcIfc := map[string]interface{}{
"pro_api_key": ct.apiKeys.cmc, "pro_api_key": ct.apiKeys.cmc,
@ -233,6 +238,7 @@ func (ct *Cointop) configToToml() ([]byte, error) {
RefreshRate: refreshRateIfc, RefreshRate: refreshRateIfc,
Shortcuts: shortcutsIfcs, Shortcuts: shortcutsIfcs,
Portfolio: portfolioIfc, Portfolio: portfolioIfc,
CacheDir: cacheDirIfc,
} }
var b bytes.Buffer var b bytes.Buffer
@ -325,6 +331,16 @@ func (ct *Cointop) loadRefreshRateFromConfig() error {
return nil return nil
} }
// LoadCacheDirFromConfig loads cache dir from config file to struct
func (ct *Cointop) loadCacheDirFromConfig() error {
ct.debuglog("loadCacheDirFromConfig()")
if cacheDir, ok := ct.config.CacheDir.(string); ok {
ct.State.cacheDir = cacheDir
}
return nil
}
// GetColorschemeColors loads colors from colorsheme file to struct // GetColorschemeColors loads colors from colorsheme file to struct
func (ct *Cointop) getColorschemeColors() (map[string]interface{}, error) { func (ct *Cointop) getColorschemeColors() (map[string]interface{}, error) {
ct.debuglog("getColorschemeColors()") ct.debuglog("getColorschemeColors()")

Loading…
Cancel
Save