From a63708a82bbff6a851491e193dde82a250e5404d Mon Sep 17 00:00:00 2001 From: Michael Dvorkin Date: Thu, 18 Jul 2013 15:16:29 -0700 Subject: [PATCH] Some cleanup --- lib/format.go | 96 +++++++++---------- lib/line_editor.go | 13 ++- lib/profile.go | 20 ++-- lib/screen.go | 50 +++++----- lib/yahoo_market.go | 72 +++++++------- lib/yahoo_quotes.go | 223 +++----------------------------------------- 6 files changed, 137 insertions(+), 337 deletions(-) diff --git a/lib/format.go b/lib/format.go index 171b744..7e8fe64 100644 --- a/lib/format.go +++ b/lib/format.go @@ -3,30 +3,30 @@ package mop import ( - "bytes" - "fmt" - "regexp" - "strings" - "text/template" - "time" + `bytes` + `fmt` + `regexp` + `strings` + `text/template` + `time` ) //----------------------------------------------------------------------------- func FormatMarket(m Market) string { markup := `{{.Dow.name}}: ` - if m.Dow[`change`][0:1] != "-" { + if m.Dow[`change`][0:1] != `-` { markup += `{{.Dow.change}} ({{.Dow.percent}}) at {{.Dow.latest}}, ` } else { markup += `"{{.Dow.change}}" ({{.Dow.percent}}) at {{.Dow.latest}}, ` } markup += `{{.Sp500.name}}: ` - if m.Sp500[`change`][0:1] != "-" { + if m.Sp500[`change`][0:1] != `-` { markup += `{{.Sp500.change}} ({{.Sp500.percent}}) at {{.Sp500.latest}}, ` } else { markup += `{{.Sp500.change}} ({{.Sp500.percent}}) at {{.Sp500.latest}}, ` } markup += `{{.Nasdaq.name}}: ` - if m.Nasdaq[`change`][0:1] != "-" { + if m.Nasdaq[`change`][0:1] != `-` { markup += `{{.Nasdaq.change}} ({{.Nasdaq.percent}}) at {{.Nasdaq.latest}}` } else { markup += `{{.Nasdaq.change}} ({{.Nasdaq.percent}}) at {{.Nasdaq.latest}}` @@ -37,7 +37,7 @@ func FormatMarket(m Market) string { 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.` - template, err := template.New("market").Parse(markup) + template, err := template.New(`market`).Parse(markup) if err != nil { panic(err) } @@ -58,7 +58,7 @@ func FormatQuotes(quotes Quotes) string { Header string Stocks Quotes }{ - time.Now().Format("3:04:05pm PST"), + time.Now().Format(`3:04:05pm PST`), header(), prettify(quotes), } @@ -71,7 +71,7 @@ func FormatQuotes(quotes Quotes) string { {{range .Stocks}}{{.Color}}{{.Ticker}} {{.LastTrade}} {{.Change}} {{.ChangePercent}} {{.Open}} {{.Low}} {{.High}} {{.Low52}} {{.High52}} {{.Volume}} {{.AvgVolume}} {{.PeRatio}} {{.Dividend}} {{.Yield}} {{.MarketCap}} {{end}}` - template, err := template.New("quotes").Parse(markup) + template, err := template.New(`quotes`).Parse(markup) if err != nil { panic(err) } @@ -86,21 +86,21 @@ func FormatQuotes(quotes Quotes) string { } func header() string { - str := fmt.Sprintf("%-7s ", "Ticker") - str += fmt.Sprintf("%9s ", "Last") - str += fmt.Sprintf("%9s ", "Change") - str += fmt.Sprintf("%9s ", "%Change") - str += fmt.Sprintf("%9s ", "Open") - str += fmt.Sprintf("%9s ", "Low") - str += fmt.Sprintf("%9s ", "High") - str += fmt.Sprintf("%9s ", "52w Low") - str += fmt.Sprintf("%9s ", "52w High") - str += fmt.Sprintf("%10s ", "Volume") - str += fmt.Sprintf("%10s ", "AvgVolume") - str += fmt.Sprintf("%9s ", "P/E") - str += fmt.Sprintf("%9s ", "Dividend") - str += fmt.Sprintf("%9s ", "Yield") - str += fmt.Sprintf("%10s", "MktCap") + str := fmt.Sprintf(`%-7s `, `Ticker`) + str += fmt.Sprintf(`%9s `, `Last`) + str += fmt.Sprintf(`%9s `, `Change`) + str += fmt.Sprintf(`%9s `, `%Change`) + str += fmt.Sprintf(`%9s `, `Open`) + str += fmt.Sprintf(`%9s `, `Low`) + str += fmt.Sprintf(`%9s `, `High`) + str += fmt.Sprintf(`%9s `, `52w Low`) + str += fmt.Sprintf(`%9s `, `52w High`) + str += fmt.Sprintf(`%10s `, `Volume`) + str += fmt.Sprintf(`%10s `, `AvgVolume`) + str += fmt.Sprintf(`%9s `, `P/E`) + str += fmt.Sprintf(`%9s `, `Dividend`) + str += fmt.Sprintf(`%9s `, `Yield`) + str += fmt.Sprintf(`%10s`, `MktCap`) return str } @@ -128,15 +128,15 @@ func prettify(quotes Quotes) Quotes { } func nullify(str string) string { - if len(str) == 3 && str[0:3] == "N/A" { - return "-" + if len(str) == 3 && str[0:3] == `N/A` { + return `-` } else { return str } } func last_of_pair(str string) string { - if len(str) >= 6 && str[0:6] != "N/A - " { + if len(str) >= 6 && str[0:6] != `N/A - ` { return str } else { return str[6:] @@ -144,41 +144,41 @@ func last_of_pair(str string) string { } func with_currency(str string) string { - if str == "N/A" || str == "0.00" { - return "-" + if str == `N/A` || str == `0.00` { + return `-` } else { switch str[0:1] { - case "+", "-": - return str[0:1] + "$" + str[1:] + case `+`, `-`: + return str[0:1] + `$` + str[1:] default: - return "$" + str + return `$` + str } } } func with_percent(str string) string { - if str == "N/A" { - return "-" + if str == `N/A` { + return `-` } else { - return str + "%" + return str + `%` } } func colorize(str string) string { - if str == "N/A" { - return "-" - } else if str[0:1] == "-" { - return "" + str + "" + if str == `N/A` { + return `-` + } else if str[0:1] == `-` { + return `` + str + `` } else { - return "" + str + "" + return `` + str + `` } } func ticker(str string, change string) string { - if change[0:1] == "-" { - return "" + str + "" + if change[0:1] == `-` { + return `` + str + `` } else { - return "" + str + "" + return `` + str + `` } } @@ -188,11 +188,11 @@ func pad(str string, width int) string { if len(match) > 0 { switch len(match[1]) { case 2: - str = strings.Replace(str, match[1], match[1]+"0", 1) + str = strings.Replace(str, match[1], match[1] + `0`, 1) case 4, 5: str = strings.Replace(str, match[1], match[1][0:3], 1) } } - return fmt.Sprintf("%*s", width, str) + return fmt.Sprintf(`%*s`, width, str) } diff --git a/lib/line_editor.go b/lib/line_editor.go index 3ace27e..c182ac3 100644 --- a/lib/line_editor.go +++ b/lib/line_editor.go @@ -3,10 +3,9 @@ package mop import ( - "fmt" - "regexp" - "strings" - "github.com/nsf/termbox-go" + `regexp` + `strings` + `github.com/nsf/termbox-go` ) type LineEditor struct { @@ -25,7 +24,7 @@ func (self *LineEditor) Prompt(command rune, profile *Profile) { self.command = command self.profile = profile - DrawLine(0, 3, ""+self.prompt+"") + DrawLine(0, 3, `` + self.prompt + ``) termbox.SetCursor(len(self.prompt), 3) termbox.Flush() } @@ -68,7 +67,7 @@ func (self *LineEditor) Handle(ev termbox.Event) bool { self.insert_character(ev.Ch) } } - DrawLine(20,20, fmt.Sprintf("cursor: %02d [%s] %08d", self.cursor, self.input, ev.Ch)) + //DrawLine(20,20, fmt.Sprintf(`cursor: %02d [%s] %08d`, self.cursor, self.input, ev.Ch)) return false } @@ -82,7 +81,7 @@ func (self *LineEditor) delete_previous_character() { // Remove last input character. self.input = self.input[ : len(self.input)-1] } - DrawLine(len(self.prompt), 3, self.input + " ") // Erase last character. + DrawLine(len(self.prompt), 3, self.input + ` `) // Erase last character. self.move_left() } } diff --git a/lib/profile.go b/lib/profile.go index 397cc12..5fa4702 100644 --- a/lib/profile.go +++ b/lib/profile.go @@ -3,14 +3,14 @@ package mop import ( - "sort" - "encoding/json" - "io/ioutil" - "os/user" - "strings" + `sort` + `encoding/json` + `io/ioutil` + `os/user` + `strings` ) -const moprc = "/.moprc" +const moprc = `/.moprc` type Profile struct { MarketRefresh int @@ -27,9 +27,9 @@ func (self *Profile) Initialize() *Profile { // Set default values. self.MarketRefresh = 12 self.QuotesRefresh = 5 - self.Tickers = []string{"AAPL", "C", "GOOG", "IBM", "KO", "ORCL", "V"} - self.SortBy = "Ticker" - self.SortOrder = "Desc" + self.Tickers = []string{`AAPL`, `C`, `GOOG`, `IBM`, `KO`, `ORCL`, `V`} + self.SortBy = `Ticker` + self.SortOrder = `Desc` self.Save() } else { json.Unmarshal(data, self) @@ -48,7 +48,7 @@ func (self *Profile) Save() error { //----------------------------------------------------------------------------- func (self *Profile) Quotes() string { - return strings.Join(self.Tickers, "+") + return strings.Join(self.Tickers, `+`) } //----------------------------------------------------------------------------- diff --git a/lib/screen.go b/lib/screen.go index b924c24..d5808f4 100644 --- a/lib/screen.go +++ b/lib/screen.go @@ -3,11 +3,11 @@ package mop import ( - "github.com/michaeldv/just" - "github.com/nsf/termbox-go" - "regexp" - "strings" - "time" + `github.com/michaeldv/just` + `github.com/nsf/termbox-go` + `regexp` + `strings` + `time` ) // Can combine attributes and a single color using bitwise OR. @@ -17,15 +17,15 @@ import ( // AttrReverse // var tags = map[string]termbox.Attribute{ - "black": termbox.ColorBlack, - "red": termbox.ColorRed, - "green": termbox.ColorGreen, - "yellow": termbox.ColorYellow, - "blue": termbox.ColorBlue, - "magenta": termbox.ColorMagenta, - "cyan": termbox.ColorCyan, - "white": termbox.ColorWhite, - "right": termbox.ColorDefault, + `black`: termbox.ColorBlack, + `red`: termbox.ColorRed, + `green`: termbox.ColorGreen, + `yellow`: termbox.ColorYellow, + `blue`: termbox.ColorBlue, + `magenta`: termbox.ColorMagenta, + `cyan`: termbox.ColorCyan, + `white`: termbox.ColorWhite, + `right`: termbox.ColorDefault, } //----------------------------------------------------------------------------- @@ -42,8 +42,8 @@ func DrawQuotes(stocks string) { //----------------------------------------------------------------------------- func DrawTime() { - now := time.Now().Format("3:04:05pm PST") - DrawLine(0, 0, ""+now+"") + now := time.Now().Format(`3:04:05pm PST`) + DrawLine(0, 0, `` + now + ``) } //----------------------------------------------------------------------------- @@ -63,9 +63,9 @@ func DrawLine(x int, y int, str string) { if tag, open := isTag(token); tag { key := tagName(token) if value, ok := tags[key]; ok { - token = "" + token = `` switch key { - case "right": + case `right`: right = open default: if open { @@ -105,28 +105,28 @@ func tagsRegexp() *regexp.Regexp { arr := []string{} for tag, _ := range tags { - arr = append(arr, "") + arr = append(arr, ``) } - return regexp.MustCompile(strings.Join(arr, "|")) + return regexp.MustCompile(strings.Join(arr, `|`)) } // // Return true if a string looks like a tag. //----------------------------------------------------------------------------- func isTag(str string) (is bool, open bool) { - is = (len(str) > 3 && str[0:1] == "<" && str[len(str)-1:] == ">") - open = (is && str[1:2] != "/") + is = (len(str) > 3 && str[0:1] == `<` && str[len(str)-1:] == `>`) + open = (is && str[1:2] != `/`) return } // -// Extract tag name from the given tag, i.e. "" => "hello" +// Extract tag name from the given tag, i.e. `` => `hello` //----------------------------------------------------------------------------- func tagName(str string) string { if len(str) < 3 { - return "" - } else if str[1:2] != "/" { + return `` + } else if str[1:2] != `/` { return str[1 : len(str)-1] } else { return str[2 : len(str)-1] diff --git a/lib/yahoo_market.go b/lib/yahoo_market.go index 2b67e04..b3c5066 100644 --- a/lib/yahoo_market.go +++ b/lib/yahoo_market.go @@ -3,11 +3,11 @@ package mop import ( - "bytes" - "io/ioutil" - "net/http" - "regexp" - "strings" + `bytes` + `io/ioutil` + `net/http` + `regexp` + `strings` ) type Market struct { @@ -40,10 +40,10 @@ func GetMarket() Market { } func trim(body []byte) []byte { - start := bytes.Index(body, []byte(" 0 { @@ -76,7 +76,7 @@ func extract(snippet []byte) Market { // fmt.Printf("%d) [%s]\n", i, str) // } // } else { - // println("No matches") + // println(`No matches`) // } m := Market{ @@ -94,12 +94,12 @@ func extract(snippet []byte) Market { m.Dow[`latest`] = matches[0][2] m.Dow[`change`] = matches[0][4] switch matches[0][3] { - case "008800": - m.Dow[`change`] = "+" + matches[0][4] - m.Dow[`percent`] = "+" + matches[0][5] - case "cc0000": - m.Dow[`change`] = "-" + matches[0][4] - m.Dow[`percent`] = "-" + matches[0][5] + case `008800`: + m.Dow[`change`] = `+` + matches[0][4] + m.Dow[`percent`] = `+` + matches[0][5] + case `cc0000`: + m.Dow[`change`] = `-` + matches[0][4] + m.Dow[`percent`] = `-` + matches[0][5] default: m.Dow[`change`] = matches[0][4] m.Dow[`percent`] = matches[0][5] @@ -108,12 +108,12 @@ func extract(snippet []byte) Market { m.Nasdaq[`name`] = matches[0][6] m.Nasdaq[`latest`] = matches[0][7] switch matches[0][8] { - case "008800": - m.Nasdaq[`change`] = "+" + matches[0][9] - m.Nasdaq[`percent`] = "+" + matches[0][10] - case "cc0000": - m.Nasdaq[`change`] = "-" + matches[0][9] - m.Nasdaq[`percent`] = "-" + matches[0][10] + case `008800`: + m.Nasdaq[`change`] = `+` + matches[0][9] + m.Nasdaq[`percent`] = `+` + matches[0][10] + case `cc0000`: + m.Nasdaq[`change`] = `-` + matches[0][9] + m.Nasdaq[`percent`] = `-` + matches[0][10] default: m.Nasdaq[`change`] = matches[0][9] m.Nasdaq[`percent`] = matches[0][10] @@ -122,12 +122,12 @@ func extract(snippet []byte) Market { m.Sp500[`name`] = matches[0][11] m.Sp500[`latest`] = matches[0][12] switch matches[0][13] { - case "008800": - m.Sp500[`change`] = "+" + matches[0][14] - m.Sp500[`percent`] = "+" + matches[0][15] - case "cc0000": - m.Sp500[`change`] = "-" + matches[0][14] - m.Sp500[`percent`] = "-" + matches[0][15] + case `008800`: + m.Sp500[`change`] = `+` + matches[0][14] + m.Sp500[`percent`] = `+` + matches[0][15] + case `cc0000`: + m.Sp500[`change`] = `-` + matches[0][14] + m.Sp500[`percent`] = `-` + matches[0][15] default: m.Sp500[`change`] = matches[0][14] m.Sp500[`percent`] = matches[0][15] diff --git a/lib/yahoo_quotes.go b/lib/yahoo_quotes.go index 7f0f324..2d5e0a4 100644 --- a/lib/yahoo_quotes.go +++ b/lib/yahoo_quotes.go @@ -3,14 +3,19 @@ package mop import ( - "bytes" - "fmt" - "io/ioutil" - "net/http" - "strings" + `bytes` + `fmt` + `io/ioutil` + `net/http` + `strings` ) // See http://www.gummy-stuff.org/Yahoo-data.htm +// Also http://query.yahooapis.com/v1/public/yql +// ?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in(%22ALU%22,%22AAPL%22) +// &env=http%3A%2F%2Fdatatables.org%2Falltables.env +// &format=json' +// // Current, Change, Open, High, Low, 52-W High, 52-W Low, Volume, AvgVolume, P/E, Yield, Market Cap. // l1: last trade // c6: change rt @@ -31,11 +36,6 @@ import ( const yahoo_quotes_url = `http://download.finance.yahoo.com/d/quotes.csv?s=%s&f=,l1c6k2oghjkva2r2rdyj3j1` -// "AAPL", 417.42, "-3.38", "N/A - -0.80%", 420.33, 415.35, 423.29, 385.10, 705.07, 9788680, 15181900, N/A, 10.04, 11.00, 2.61, N/A, 391.8B -// "ALU", 1.83, "+0.07", "N/A - +3.98%", 1.77, 1.75, 1.83, 0.91, 2.01, 7957103, 11640700, N/A, N/A, 0.00, N/A, N/A, 4.156B -// "IBM", 194.93, "+1.68", "N/A - +0.87%", 192.83, 192.3501, 195.16, 181.85, 215.90, 2407971, 4376120, N/A, 13.33, 3.50, 1.81, N/A, 216.1B -// "TSLA", 120.09, "+4.85", "N/A - +4.21%", 118.75, 115.70, 120.28, 25.52, 121.89, 6827497, 9464530, N/A, N/A, 0.00, N/A, N/A, 13.877B - type Quote struct { Ticker string LastTrade string @@ -60,7 +60,6 @@ type Quotes []Quote func GetQuotes(tickers string) Quotes { // Format the URL and send the request. - // url := fmt.Sprintf(yahoo_quotes_url, strings.Join(tickers, "+")) url := fmt.Sprintf(yahoo_quotes_url, tickers) response, err := http.Get(url) if err != nil { @@ -79,9 +78,9 @@ func GetQuotes(tickers string) Quotes { func (q *Quote) Color() string { if strings.Index(q.Change, "-") == -1 { - return "" + return `` } else { - return "" // "" + return `` // `` } } @@ -122,201 +121,3 @@ func parse_line(line []byte, quote *Quote) { quote.MarketCap = string(columns[15]) quote.MarketCapX = string(columns[16]) } - -// func (quotes Quotes) Format() string { -// str := time.Now().Format("3:04:05pm PST\n") -// -// for _, q := range quotes { -// str += fmt.Sprintf("%s - %s - %s - %s\n", q.Ticker, q.Ask, q.Change, q.ChangePercent) -// } -// return str -// } - -// -// http://query.yahooapis.com/v1/public/yql -// ?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in(%22ALU%22,%22AAPL%22) -// &env=http%3A%2F%2Fdatatables.org%2Falltables.env -// &format=json' -// -// ^IXIC NASDAQ composite -// ^GSPC S&P 500 -// -// { -// "query": { -// "count": 2, -// "created": "2013-06-28T03:28:19Z", -// "lang": "en-US", -// "results": { -// "quote": [ -// { -// "AfterHoursChangeRealtime": "N/A - N/A", -// "AnnualizedGain": null, -// "Ask": null, -// "AskRealtime": "1.91", -// "AverageDailyVolume": "11692300", -// "Bid": null, -// "BidRealtime": "1.86", -// "BookValue": "1.249", -// "Change": "+0.12", -// "ChangeFromFiftydayMovingAverage": "+0.1626", -// "ChangeFromTwoHundreddayMovingAverage": "+0.321", -// "ChangeFromYearHigh": "-0.16", -// "ChangeFromYearLow": "+0.94", -// "ChangePercentRealtime": "N/A - +6.94%", -// "ChangeRealtime": "+0.12", -// "Change_PercentChange": "+0.12 - +6.94%", -// "ChangeinPercent": "+6.94%", -// "Commission": null, -// "DaysHigh": "1.92", -// "DaysLow": "1.79", -// "DaysRange": "1.79 - 1.92", -// "DaysRangeRealtime": "N/A - N/A", -// "DaysValueChange": "- - +6.94%", -// "DaysValueChangeRealtime": "N/A - N/A", -// "DividendPayDate": "29-Jun-07", -// "DividendShare": "0.00", -// "DividendYield": null, -// "EBITDA": "802.7M", -// "EPSEstimateCurrentYear": "-0.30", -// "EPSEstimateNextQuarter": "-0.05", -// "EPSEstimateNextYear": "-0.07", -// "EarningsShare": "-1.213", -// "ErrorIndicationreturnedforsymbolchangedinvalid": null, -// "ExDividendDate": "31-May-07", -// "FiftydayMovingAverage": "1.6874", -// "HighLimit": null, -// "HoldingsGain": null, -// "HoldingsGainPercent": "- - -", -// "HoldingsGainPercentRealtime": "N/A - N/A", -// "HoldingsGainRealtime": null, -// "HoldingsValue": null, -// "HoldingsValueRealtime": null, -// "LastTradeDate": "6/27/2013", -// "LastTradePriceOnly": "1.85", -// "LastTradeRealtimeWithTime": "N/A - 1.85", -// "LastTradeTime": "4:00pm", -// "LastTradeWithTime": "Jun 27 - 1.85", -// "LowLimit": null, -// "MarketCapRealtime": null, -// "MarketCapitalization": "4.202B", -// "MoreInfo": "cnprmIed", -// "Name": "Alcatel-Lucent Co", -// "Notes": null, -// "OneyrTargetPrice": "2.16", -// "Open": "1.81", -// "OrderBookRealtime": null, -// "PEGRatio": "0.22", -// "PERatio": null, -// "PERatioRealtime": null, -// "PercebtChangeFromYearHigh": "-7.96%", -// "PercentChange": "+6.94%", -// "PercentChangeFromFiftydayMovingAverage": "+9.63%", -// "PercentChangeFromTwoHundreddayMovingAverage": "+20.99%", -// "PercentChangeFromYearLow": "+103.30%", -// "PreviousClose": "1.73", -// "PriceBook": "1.39", -// "PriceEPSEstimateCurrentYear": null, -// "PriceEPSEstimateNextYear": null, -// "PricePaid": null, -// "PriceSales": "0.21", -// "SharesOwned": null, -// "ShortRatio": "0.90", -// "StockExchange": "NYSE", -// "Symbol": "ALU", -// "TickerTrend": " +=-=+- ", -// "TradeDate": null, -// "TwoHundreddayMovingAverage": "1.529", -// "Volume": "34193168", -// "YearHigh": "2.01", -// "YearLow": "0.91", -// "YearRange": "0.91 - 2.01", -// "symbol": "ALU" -// }, -// { -// "AfterHoursChangeRealtime": "N/A - N/A", -// "AnnualizedGain": null, -// "Ask": "393.45", -// "AskRealtime": "393.45", -// "AverageDailyVolume": "17939600", -// "Bid": "393.32", -// "BidRealtime": "393.32", -// "BookValue": "144.124", -// "Change": "-4.29", -// "ChangeFromFiftydayMovingAverage": "-37.81", -// "ChangeFromTwoHundreddayMovingAverage": "-111.877", -// "ChangeFromYearHigh": "-311.29", -// "ChangeFromYearLow": "+8.68", -// "ChangePercentRealtime": "N/A - -1.08%", -// "ChangeRealtime": "-4.29", -// "Change_PercentChange": "-4.29 - -1.08%", -// "ChangeinPercent": "-1.08%", -// "Commission": null, -// "DaysHigh": "401.39", -// "DaysLow": "393.54", -// "DaysRange": "393.54 - 401.39", -// "DaysRangeRealtime": "N/A - N/A", -// "DaysValueChange": "- - -1.08%", -// "DaysValueChangeRealtime": "N/A - N/A", -// "DividendPayDate": "May 16", -// "DividendShare": "7.95", -// "DividendYield": "2.00", -// "EBITDA": "57.381B", -// "EPSEstimateCurrentYear": "39.57", -// "EPSEstimateNextQuarter": "8.21", -// "EPSEstimateNextYear": "43.71", -// "EarningsShare": "41.896", -// "ErrorIndicationreturnedforsymbolchangedinvalid": null, -// "ExDividendDate": "Feb 7", -// "FiftydayMovingAverage": "431.59", -// "HighLimit": null, -// "HoldingsGain": null, -// "HoldingsGainPercent": "- - -", -// "HoldingsGainPercentRealtime": "N/A - N/A", -// "HoldingsGainRealtime": null, -// "HoldingsValue": null, -// "HoldingsValueRealtime": null, -// "LastTradeDate": "6/27/2013", -// "LastTradePriceOnly": "393.78", -// "LastTradeRealtimeWithTime": "N/A - 393.78", -// "LastTradeTime": "4:00pm", -// "LastTradeWithTime": "Jun 27 - 393.78", -// "LowLimit": null, -// "MarketCapRealtime": null, -// "MarketCapitalization": "369.6B", -// "MoreInfo": "cnsprmiIed", -// "Name": "Apple Inc.", -// "Notes": null, -// "OneyrTargetPrice": "539.54", -// "Open": "399.01", -// "OrderBookRealtime": null, -// "PEGRatio": "0.48", -// "PERatio": "9.50", -// "PERatioRealtime": null, -// "PercebtChangeFromYearHigh": "-44.15%", -// "PercentChange": "-1.08%", -// "PercentChangeFromFiftydayMovingAverage": "-8.76%", -// "PercentChangeFromTwoHundreddayMovingAverage": "-22.13%", -// "PercentChangeFromYearLow": "+2.25%", -// "PreviousClose": "398.07", -// "PriceBook": "2.76", -// "PriceEPSEstimateCurrentYear": "10.06", -// "PriceEPSEstimateNextYear": "9.11", -// "PricePaid": null, -// "PriceSales": "2.21", -// "SharesOwned": null, -// "ShortRatio": "1.50", -// "StockExchange": "NasdaqNM", -// "Symbol": "AAPL", -// "TickerTrend": " +--=== ", -// "TradeDate": null, -// "TwoHundreddayMovingAverage": "505.657", -// "Volume": "12050007", -// "YearHigh": "705.07", -// "YearLow": "385.10", -// "YearRange": "385.10 - 705.07", -// "symbol": "AAPL" -// } -// ] -// } -// } -// }