From 233e5122d65d707d6ece093b0e1890ab38162b78 Mon Sep 17 00:00:00 2001 From: Michael Dvorkin Date: Tue, 23 Jul 2013 16:49:58 -0700 Subject: [PATCH] Don't bother fetching quotes if the market is closed --- lib/format.go | 3 +++ lib/line_editor.go | 10 +++++----- lib/profile.go | 14 ++++++++++---- lib/yahoo_market.go | 11 +++++++++++ lib/yahoo_quotes.go | 47 +++++++++++++++++++++++++++++++-------------- 5 files changed, 62 insertions(+), 23 deletions(-) diff --git a/lib/format.go b/lib/format.go index 253369f..aba5c89 100644 --- a/lib/format.go +++ b/lib/format.go @@ -47,6 +47,9 @@ func (self *Formatter) format_market(m *Market) string { markup += "\n" markup += `{{.Advances.name}}: {{.Advances.nyse}} ({{.Advances.nysep}}) on NYSE and {{.Advances.nasdaq}} ({{.Advances.nasdaqp}}) on Nasdaq. ` markup += `{{.Declines.name}}: {{.Declines.nyse}} ({{.Declines.nysep}}) on NYSE and {{.Declines.nasdaq}} ({{.Declines.nasdaqp}}) on Nasdaq` + if !m.Open { + markup += `U.S. markets closed` + } markup += "\n" markup += `New highs: {{.Highs.nyse}} on NYSE and {{.Highs.nasdaq}} on Nasdaq. ` markup += `New lows: {{.Lows.nyse}} on NYSE and {{.Lows.nasdaq}} on Nasdaq.` diff --git a/lib/line_editor.go b/lib/line_editor.go index 0af7a11..039ed59 100644 --- a/lib/line_editor.go +++ b/lib/line_editor.go @@ -147,17 +147,17 @@ func (self *LineEditor) execute() { case '+': tickers := self.tokenize() if len(tickers) > 0 { - self.quotes.profile.AddTickers(tickers) - self.screen.Draw(self.quotes) + if added,_ := self.quotes.AddTickers(tickers); added > 0 { + self.screen.Draw(self.quotes) + } } case '-': tickers := self.tokenize() if len(tickers) > 0 { before := len(self.quotes.profile.Tickers) - self.quotes.profile.RemoveTickers(tickers) - after := len(self.quotes.profile.Tickers) - if after < before { + if removed,_ := self.quotes.RemoveTickers(tickers); removed > 0 { self.screen.Draw(self.quotes) + after := before - removed for i := before; i > after; i-- { self.screen.ClearLine(0, i + 4) } diff --git a/lib/profile.go b/lib/profile.go index 96b14bc..136d222 100644 --- a/lib/profile.go +++ b/lib/profile.go @@ -52,7 +52,8 @@ func (self *Profile) ListOfTickers() string { } //----------------------------------------------------------------------------- -func (self *Profile) AddTickers(tickers []string) { +func (self *Profile) AddTickers(tickers []string) (added int, err error) { + added = 0 existing := make(map[string]bool) for _, ticker := range self.Tickers { @@ -62,22 +63,27 @@ func (self *Profile) AddTickers(tickers []string) { for _, ticker := range tickers { if _, found := existing[ticker]; !found { self.Tickers = append(self.Tickers, ticker) + added++ } } sort.Strings(self.Tickers) - self.Save() + err = self.Save() + return } //----------------------------------------------------------------------------- -func (self *Profile) RemoveTickers(tickers []string) { +func (self *Profile) RemoveTickers(tickers []string) (removed int, err error) { + removed = 0 for _, ticker := range tickers { for i, existing := range self.Tickers { if ticker == existing { // Requested ticker is there: remove i-th slice item. self.Tickers = append(self.Tickers[:i], self.Tickers[i+1:]...) + removed++ } } } - self.Save() + err = self.Save() + return } // private diff --git a/lib/yahoo_market.go b/lib/yahoo_market.go index 4b49727..1930989 100644 --- a/lib/yahoo_market.go +++ b/lib/yahoo_market.go @@ -51,6 +51,7 @@ func (self *Market) Fetch() *Market { panic(err) } + body = self.check_if_market_open(body) return self.extract(self.trim(body)) } @@ -59,6 +60,16 @@ func (self *Market) Format() string { return new(Formatter).Format(self) } +// private +//----------------------------------------------------------------------------- +func (self *Market) check_if_market_open(body []byte) []byte { + start := bytes.Index(body, []byte(`id="yfs_market_time"`)) + finish := start + bytes.Index(body[start:], []byte(``)) + self.Open = !bytes.Contains(body[start:finish], []byte(`closed`)) + + return body[finish:] +} + //----------------------------------------------------------------------------- func (self *Market) trim(body []byte) []byte { start := bytes.Index(body, []byte(` 0 { + self.stocks = nil // Force fetch. + } + return +} + +//----------------------------------------------------------------------------- +func (self *Quotes) RemoveTickers(tickers []string) (removed int, err error) { + if removed, err = self.profile.RemoveTickers(tickers); removed > 0 { + self.stocks = nil // Force fetch. + } + return +} + //----------------------------------------------------------------------------- func (self *Quotes) parse(body []byte) *Quotes { lines := bytes.Split(body, []byte{'\n'})