market_beat 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +22 -0
- data/CHANGELOG +2 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +24 -0
- data/LICENSE +22 -0
- data/README.md +173 -0
- data/Rakefile +2 -0
- data/lib/market_beat/google.rb +48 -0
- data/lib/market_beat/version.rb +10 -0
- data/lib/market_beat/yahoo.rb +51 -0
- data/lib/market_beat.rb +31 -0
- data/spec/google_spec.rb +202 -0
- data/spec/market_beat_spec.rb +42 -0
- data/spec/spec_helper.rb +8 -0
- data/spec/yahoo_spec.rb +446 -0
- metadata +75 -0
data/.gitignore
ADDED
data/CHANGELOG
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
market_beat (0.1.0)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: http://rubygems.org/
|
8
|
+
specs:
|
9
|
+
diff-lcs (1.1.2)
|
10
|
+
rspec (2.6.0)
|
11
|
+
rspec-core (~> 2.6.0)
|
12
|
+
rspec-expectations (~> 2.6.0)
|
13
|
+
rspec-mocks (~> 2.6.0)
|
14
|
+
rspec-core (2.6.0)
|
15
|
+
rspec-expectations (2.6.0)
|
16
|
+
diff-lcs (~> 1.1.2)
|
17
|
+
rspec-mocks (2.6.0)
|
18
|
+
|
19
|
+
PLATFORMS
|
20
|
+
ruby
|
21
|
+
|
22
|
+
DEPENDENCIES
|
23
|
+
market_beat!
|
24
|
+
rspec (>= 2.6.0)
|
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2011 Michael Dvorkin
|
2
|
+
twitter.com/mid
|
3
|
+
%w(mike dvorkin.net) * "@" || %w(mike fatfreecrm.com) * "@"
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,173 @@
|
|
1
|
+
## MarketBeat ##
|
2
|
+
Market Beat is a Ruby library that fetches stock quotes and other financial
|
3
|
+
and market indicators from publicly available sources. Currently Google and
|
4
|
+
Yahoo market reporting services are supported.
|
5
|
+
|
6
|
+
### Installation ###
|
7
|
+
# Installing as Ruby gem
|
8
|
+
$ gem install market_beat
|
9
|
+
|
10
|
+
# Cloning the repository
|
11
|
+
$ git clone git://github.com/michaeldv/market_beat.git
|
12
|
+
|
13
|
+
### Usage ###
|
14
|
+
Require "market_beat" gem, then invoke one of the MarketBeat's methods passing
|
15
|
+
stock symbol as a parameter. Stock symbols are case insensitive and could be
|
16
|
+
passed as a symbol or a string.
|
17
|
+
|
18
|
+
For example, to fetch today's opening price and the very latest trade price
|
19
|
+
for the Apple stock (NASDAQ symbol 'AAPL') use the following:
|
20
|
+
|
21
|
+
>> require "market_beat"
|
22
|
+
>> MarketBeat.opening_price :AAPL
|
23
|
+
"396.69"
|
24
|
+
>> MarketBeat.last_trade_real_time :AAPL
|
25
|
+
"397.07"
|
26
|
+
|
27
|
+
Some methods return multiple values:
|
28
|
+
|
29
|
+
>> MarketBeat.change_and_percent_change :IBM
|
30
|
+
["-5.77", "-3.08%"]
|
31
|
+
>> MarketBeat.last_trade_with_time :IBM
|
32
|
+
["4:02pm", "181.47"]
|
33
|
+
|
34
|
+
### Available Methods (Real Time Data) ###
|
35
|
+
|
36
|
+
MarketBeat.after_hours_change_real_time
|
37
|
+
MarketBeat.ask_real_time
|
38
|
+
MarketBeat.bid_real_time
|
39
|
+
MarketBeat.change_percent_real_time
|
40
|
+
MarketBeat.change_real_time
|
41
|
+
MarketBeat.color_code_real_time
|
42
|
+
MarketBeat.days_range_real_time
|
43
|
+
MarketBeat.days_value_change_real_time
|
44
|
+
MarketBeat.holdings_gain_percent_real_time
|
45
|
+
MarketBeat.holdings_gain_real_time
|
46
|
+
MarketBeat.holdings_value_real_time
|
47
|
+
MarketBeat.last_trade_datetime_real_time
|
48
|
+
MarketBeat.last_trade_real_time
|
49
|
+
MarketBeat.last_trade_real_time_with_time
|
50
|
+
MarketBeat.last_trade_time_real_time
|
51
|
+
MarketBeat.market_cap_real_time
|
52
|
+
MarketBeat.order_book_real_time
|
53
|
+
MarketBeat.pe_ratio_real_time
|
54
|
+
MarketBeat.percent_change_real_time
|
55
|
+
|
56
|
+
### Available Methods (Delayed Data) ###
|
57
|
+
|
58
|
+
MarketBeat.annualized_gain
|
59
|
+
MarketBeat.ask
|
60
|
+
MarketBeat.ask_size
|
61
|
+
MarketBeat.average_daily_volume
|
62
|
+
MarketBeat.bid
|
63
|
+
MarketBeat.bid_size
|
64
|
+
MarketBeat.book_value
|
65
|
+
MarketBeat.brut_last
|
66
|
+
MarketBeat.brut_trade_date_utc
|
67
|
+
MarketBeat.brut_trade_time_utc
|
68
|
+
MarketBeat.change
|
69
|
+
MarketBeat.change_and_percent_change
|
70
|
+
MarketBeat.change_from_200_day_moving_average
|
71
|
+
MarketBeat.change_from_50_day_moving_average
|
72
|
+
MarketBeat.change_from_52_week_high
|
73
|
+
MarketBeat.change_from_52_week_low
|
74
|
+
MarketBeat.chart_url
|
75
|
+
MarketBeat.commission
|
76
|
+
MarketBeat.company
|
77
|
+
MarketBeat.currency
|
78
|
+
MarketBeat.current_date_utc
|
79
|
+
MarketBeat.current_time_utc
|
80
|
+
MarketBeat.daylight_savings
|
81
|
+
MarketBeat.days_high
|
82
|
+
MarketBeat.days_low
|
83
|
+
MarketBeat.days_range
|
84
|
+
MarketBeat.days_value_change
|
85
|
+
MarketBeat.delay
|
86
|
+
MarketBeat.disclaimer_url
|
87
|
+
MarketBeat.dividend_pay_date
|
88
|
+
MarketBeat.dividend_to_share
|
89
|
+
MarketBeat.dividend_yield
|
90
|
+
MarketBeat.divisor
|
91
|
+
MarketBeat.earnings_to_share
|
92
|
+
MarketBeat.ebitda
|
93
|
+
MarketBeat.ecn_url
|
94
|
+
MarketBeat.eps_estimate_current_year
|
95
|
+
MarketBeat.eps_estimate_next_quarter
|
96
|
+
MarketBeat.eps_estimate_next_year
|
97
|
+
MarketBeat.error_indication
|
98
|
+
MarketBeat.ex_dividend_date
|
99
|
+
MarketBeat.float_shares
|
100
|
+
MarketBeat.high_52_week
|
101
|
+
MarketBeat.high_limit
|
102
|
+
MarketBeat.holdings_gain
|
103
|
+
MarketBeat.holdings_gain_percent
|
104
|
+
MarketBeat.holdings_value
|
105
|
+
MarketBeat.isld_last
|
106
|
+
MarketBeat.isld_trade_date_utc
|
107
|
+
MarketBeat.isld_trade_time_utc
|
108
|
+
MarketBeat.last_trade
|
109
|
+
MarketBeat.last_trade_date
|
110
|
+
MarketBeat.last_trade_size
|
111
|
+
MarketBeat.last_trade_time
|
112
|
+
MarketBeat.last_trade_with_time
|
113
|
+
MarketBeat.low_52_week
|
114
|
+
MarketBeat.low_limit
|
115
|
+
MarketBeat.market_capitalization
|
116
|
+
MarketBeat.more_info
|
117
|
+
MarketBeat.moving_average_200_day
|
118
|
+
MarketBeat.moving_average_50_day
|
119
|
+
MarketBeat.notes
|
120
|
+
MarketBeat.one_year_target_price
|
121
|
+
MarketBeat.opening_price
|
122
|
+
MarketBeat.pe_ratio
|
123
|
+
MarketBeat.peg_ratio
|
124
|
+
MarketBeat.percent_change
|
125
|
+
MarketBeat.percent_change_from_200_day_moving_average
|
126
|
+
MarketBeat.percent_change_from_50_day_moving_average
|
127
|
+
MarketBeat.percent_change_from_52_week_high
|
128
|
+
MarketBeat.percent_change_from_52_week_low
|
129
|
+
MarketBeat.pretty_symbol
|
130
|
+
MarketBeat.previous_close
|
131
|
+
MarketBeat.price_paid
|
132
|
+
MarketBeat.price_to_book
|
133
|
+
MarketBeat.price_to_eps_estimate_current_year
|
134
|
+
MarketBeat.price_to_eps_estimate_next_year
|
135
|
+
MarketBeat.price_to_sales
|
136
|
+
MarketBeat.range_52_week
|
137
|
+
MarketBeat.shares_owned
|
138
|
+
MarketBeat.short_ratio
|
139
|
+
MarketBeat.stock_exchange
|
140
|
+
MarketBeat.stock_exchange_closing
|
141
|
+
MarketBeat.stock_exchange_timezone
|
142
|
+
MarketBeat.stock_exchange_utc_offset
|
143
|
+
MarketBeat.symbol
|
144
|
+
MarketBeat.symbol_lookup_url
|
145
|
+
MarketBeat.symbol_url
|
146
|
+
MarketBeat.ticker_trend
|
147
|
+
MarketBeat.trade_date
|
148
|
+
MarketBeat.trade_date_utc
|
149
|
+
MarketBeat.trade_time_utc
|
150
|
+
MarketBeat.trade_timestamp
|
151
|
+
MarketBeat.volume
|
152
|
+
|
153
|
+
### Running Specs ###
|
154
|
+
|
155
|
+
$ gem install rspec # RSpec 2.x is the requirement.
|
156
|
+
$ rake spec # Run the entire spec suite.
|
157
|
+
$ rspec spec/google_spec.rb # Run individual spec file.
|
158
|
+
|
159
|
+
### Note on Patches/Pull Requests ###
|
160
|
+
* Fork the project on Github.
|
161
|
+
* Make your feature addition or bug fix.
|
162
|
+
* Add specs for it, making sure $ rake spec is all green.
|
163
|
+
* Commit, do not mess with Rakefile, version, or history.
|
164
|
+
* Send me a pull request.
|
165
|
+
|
166
|
+
### License ###
|
167
|
+
Copyright (c) 2011 Michael Dvorkin
|
168
|
+
|
169
|
+
twitter.com/mid
|
170
|
+
|
171
|
+
%w(mike dvorkin.net) * "@" || %w(mike fatfreecrm.com) * "@"
|
172
|
+
|
173
|
+
Released under the MIT license. See LICENSE file for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
# Copyright (c) 2011 Michael Dvorkin
|
2
|
+
#
|
3
|
+
# Market Beat is freely distributable under the terms of MIT license.
|
4
|
+
# See LICENSE file or http://www.opensource.org/licenses/mit-license.php
|
5
|
+
#------------------------------------------------------------------------------
|
6
|
+
require 'rexml/document'
|
7
|
+
require 'net/http'
|
8
|
+
require 'uri'
|
9
|
+
require 'yaml'
|
10
|
+
|
11
|
+
module MarketBeat
|
12
|
+
class Google
|
13
|
+
URL = 'http://www.google.com/ig/api?stock='.freeze
|
14
|
+
REAL_TIME_URL = 'http://finance.google.com/finance/info?client=ig&q='.freeze
|
15
|
+
|
16
|
+
class << self
|
17
|
+
metrics = YAML.load_file(File.dirname(__FILE__) + '/google.yml')
|
18
|
+
metrics.each do |key, value|
|
19
|
+
if value.to_s !~ /real_time$/
|
20
|
+
define_method value do |ticker|
|
21
|
+
from_xml fetch(ticker), key
|
22
|
+
end
|
23
|
+
else
|
24
|
+
define_method value do |ticker|
|
25
|
+
from_json fetch(ticker, :real_time), key
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
def fetch(ticker, real_time = false)
|
32
|
+
uri = URI.parse("#{real_time ? REAL_TIME_URL : URL}#{ticker}")
|
33
|
+
response = Net::HTTP.get_response(uri)
|
34
|
+
response.body
|
35
|
+
end
|
36
|
+
|
37
|
+
def from_xml(xml, metric)
|
38
|
+
doc = REXML::Document.new(xml)
|
39
|
+
data = doc.elements["//finance/#{metric}"].attributes['data']
|
40
|
+
data.empty? ? nil : data
|
41
|
+
end
|
42
|
+
|
43
|
+
def from_json(json, metric)
|
44
|
+
json =~ /"#{metric}"\s*\:\s*"(.+?)"/ ? $1 : nil
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# Copyright (c) 2011 Michael Dvorkin
|
2
|
+
#
|
3
|
+
# Market Beat is freely distributable under the terms of MIT license.
|
4
|
+
# See LICENSE file or http://www.opensource.org/licenses/mit-license.php
|
5
|
+
#------------------------------------------------------------------------------
|
6
|
+
module MarketBeat
|
7
|
+
def self.version
|
8
|
+
'0.1.0'
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# Copyright (c) 2011 Michael Dvorkin
|
2
|
+
#
|
3
|
+
# Market Beat is freely distributable under the terms of MIT license.
|
4
|
+
# See LICENSE file or http://www.opensource.org/licenses/mit-license.php
|
5
|
+
#------------------------------------------------------------------------------
|
6
|
+
require 'net/http'
|
7
|
+
require 'uri'
|
8
|
+
require 'yaml'
|
9
|
+
|
10
|
+
module MarketBeat
|
11
|
+
class Yahoo
|
12
|
+
URL = 'http://download.finance.yahoo.com/d/quotes.csv?s='.freeze
|
13
|
+
L2N = { 'M' => 1_000_000, 'B' => 1_000_000_000 }.freeze
|
14
|
+
|
15
|
+
class << self
|
16
|
+
metrics = YAML.load_file(File.dirname(__FILE__) + '/yahoo.yml')
|
17
|
+
metrics.each do |key, value|
|
18
|
+
define_method value do |ticker|
|
19
|
+
sanitize fetch(ticker, key)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
def fetch(ticker, metric)
|
25
|
+
uri = URI.parse("#{URL}#{ticker}&f=#{metric}")
|
26
|
+
response = Net::HTTP.get_response(uri)
|
27
|
+
response.body
|
28
|
+
end
|
29
|
+
|
30
|
+
def sanitize(raw)
|
31
|
+
data = raw.strip.gsub(/\r|\n|"|<\/?b>| /, '')
|
32
|
+
min, max = data.split(/\s+\-\s+/)
|
33
|
+
min && max ? [scrub(min), scrub(max)] : scrub(min)
|
34
|
+
end
|
35
|
+
|
36
|
+
def scrub(data)
|
37
|
+
# Convert empty string, '-' or 'N/A' to nil
|
38
|
+
return nil if data =~ /^(?:\s*|N\/A|\-)$/
|
39
|
+
# Normalize numbers:
|
40
|
+
# '1,234.56' => '1234.56'
|
41
|
+
# '1,234.56M' => '1234560000'
|
42
|
+
# '1,234.56B' => '1234560000000'
|
43
|
+
if data =~ /^[\.\d,]+[MB]*$/
|
44
|
+
data.gsub!(',', '')
|
45
|
+
data = (data[0..-2].to_f * L2N[data[-1,1]]).to_i.to_s if L2N[data[-1,1]]
|
46
|
+
end
|
47
|
+
data
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/lib/market_beat.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# Copyright (c) 2011 Michael Dvorkin
|
2
|
+
#
|
3
|
+
# Market Beat is freely distributable under the terms of MIT license.
|
4
|
+
# See LICENSE file or http://www.opensource.org/licenses/mit-license.php
|
5
|
+
#------------------------------------------------------------------------------
|
6
|
+
require File.dirname(__FILE__) + '/market_beat/yahoo'
|
7
|
+
require File.dirname(__FILE__) + '/market_beat/google'
|
8
|
+
require File.dirname(__FILE__) + "/market_beat/version"
|
9
|
+
|
10
|
+
module MarketBeat
|
11
|
+
# Pre-cache available methods so we could use them within
|
12
|
+
# method_missing where respond_to? gives false positives.
|
13
|
+
if RUBY_VERSION < '1.9.0'
|
14
|
+
@@yahoo = (Yahoo.methods - Object.methods).map { |m| m.to_sym }
|
15
|
+
@@google = (Google.methods - Object.methods).map { |m| m.to_sym }
|
16
|
+
else
|
17
|
+
@@yahoo = Yahoo.methods - Object.methods
|
18
|
+
@@google = Google.methods - Object.methods
|
19
|
+
end
|
20
|
+
|
21
|
+
# Proxy MarketBeat methods to either Google or Yahoo providers.
|
22
|
+
def self.method_missing(method, *args, &blk)
|
23
|
+
if @@google.include?(method)
|
24
|
+
Google.send(method, *args)
|
25
|
+
elsif @@yahoo.include?(method)
|
26
|
+
Yahoo.send(method, *args)
|
27
|
+
else
|
28
|
+
super
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/spec/google_spec.rb
ADDED
@@ -0,0 +1,202 @@
|
|
1
|
+
# Copyright (c) 2011 Michael Dvorkin
|
2
|
+
#
|
3
|
+
# Market Beat is freely distributable under the terms of MIT license.
|
4
|
+
# See LICENSE file or http://www.opensource.org/licenses/mit-license.php
|
5
|
+
#------------------------------------------------------------------------------
|
6
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
7
|
+
|
8
|
+
describe "MarketBeat::Google Delayed" do
|
9
|
+
before(:all) do
|
10
|
+
@ibm = File.read(File.dirname(__FILE__) + '/fixtures/IBM.xml')
|
11
|
+
end
|
12
|
+
|
13
|
+
def ibm(metric)
|
14
|
+
response = mock(:body => @ibm)
|
15
|
+
Net::HTTP.should_receive(:get_response).once.and_return(response)
|
16
|
+
MarketBeat::Google.send(metric, :ibm)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "average_daily_volume" do
|
20
|
+
ibm(:average_daily_volume).should == '5084'
|
21
|
+
end
|
22
|
+
|
23
|
+
it "brut_last" do
|
24
|
+
ibm(:brut_last).should == nil
|
25
|
+
end
|
26
|
+
|
27
|
+
it "brut_trade_date_utc" do
|
28
|
+
ibm(:brut_trade_date_utc).should == nil
|
29
|
+
end
|
30
|
+
|
31
|
+
it "brut_trade_time_utc" do
|
32
|
+
ibm(:brut_trade_time_utc).should == nil
|
33
|
+
end
|
34
|
+
|
35
|
+
it "change" do
|
36
|
+
ibm(:change).should == '-2.32'
|
37
|
+
end
|
38
|
+
|
39
|
+
it "chart_url" do
|
40
|
+
ibm(:chart_url).should == '/finance/chart?q=NYSE:IBM&tlf=12'
|
41
|
+
end
|
42
|
+
|
43
|
+
it "currency" do
|
44
|
+
ibm(:currency).should == 'USD'
|
45
|
+
end
|
46
|
+
|
47
|
+
it "current_date_utc" do
|
48
|
+
ibm(:current_date_utc).should == '20110515'
|
49
|
+
end
|
50
|
+
|
51
|
+
it "current_time_utc" do
|
52
|
+
ibm(:current_time_utc).should == '001456'
|
53
|
+
end
|
54
|
+
|
55
|
+
it "daylight_savings" do
|
56
|
+
ibm(:daylight_savings).should == 'true'
|
57
|
+
end
|
58
|
+
|
59
|
+
it "days_high" do
|
60
|
+
ibm(:days_high).should == '172.15'
|
61
|
+
end
|
62
|
+
|
63
|
+
it "days_low" do
|
64
|
+
ibm(:days_low).should == '169.44'
|
65
|
+
end
|
66
|
+
|
67
|
+
it "delay" do
|
68
|
+
ibm(:delay).should == '0'
|
69
|
+
end
|
70
|
+
|
71
|
+
it "disclaimer_url" do
|
72
|
+
ibm(:disclaimer_url).should == '/help/stock_disclaimer.html'
|
73
|
+
end
|
74
|
+
|
75
|
+
it "divisor" do
|
76
|
+
ibm(:divisor).should == '2'
|
77
|
+
end
|
78
|
+
|
79
|
+
it "ecn_url" do
|
80
|
+
ibm(:ecn_url).should == nil
|
81
|
+
end
|
82
|
+
|
83
|
+
it "isld_last" do
|
84
|
+
ibm(:isld_last).should == nil
|
85
|
+
end
|
86
|
+
|
87
|
+
it "isld_trade_date_utc" do
|
88
|
+
ibm(:isld_trade_date_utc).should == nil
|
89
|
+
end
|
90
|
+
|
91
|
+
it "isld_trade_time_utc" do
|
92
|
+
ibm(:isld_trade_time_utc).should == nil
|
93
|
+
end
|
94
|
+
|
95
|
+
it "last_trade" do
|
96
|
+
ibm(:last_trade).should == '169.92'
|
97
|
+
end
|
98
|
+
|
99
|
+
it "market_capitalization" do
|
100
|
+
ibm(:market_capitalization).should == '207223.55'
|
101
|
+
end
|
102
|
+
|
103
|
+
it "company" do
|
104
|
+
ibm(:company).should == 'International Business Machines Corp.'
|
105
|
+
end
|
106
|
+
|
107
|
+
it "opening_price" do
|
108
|
+
ibm(:opening_price).should == '171.70'
|
109
|
+
end
|
110
|
+
|
111
|
+
it "percent_change" do
|
112
|
+
ibm(:percent_change).should == '-1.35'
|
113
|
+
end
|
114
|
+
|
115
|
+
it "pretty_symbol" do
|
116
|
+
ibm(:pretty_symbol).should == 'IBM'
|
117
|
+
end
|
118
|
+
|
119
|
+
it "previous_close" do
|
120
|
+
ibm(:previous_close).should == '172.24'
|
121
|
+
end
|
122
|
+
|
123
|
+
it "stock_exchange" do
|
124
|
+
ibm(:stock_exchange).should == 'NYSE'
|
125
|
+
end
|
126
|
+
|
127
|
+
it "stock_exchange_closing" do
|
128
|
+
ibm(:stock_exchange_closing).should == '960'
|
129
|
+
end
|
130
|
+
|
131
|
+
it "stock_exchange_timezone" do
|
132
|
+
ibm(:stock_exchange_timezone).should == 'ET'
|
133
|
+
end
|
134
|
+
|
135
|
+
it "stock_exchange_utc_offset" do
|
136
|
+
ibm(:stock_exchange_utc_offset).should == '+05:00'
|
137
|
+
end
|
138
|
+
|
139
|
+
it "symbol" do
|
140
|
+
ibm(:symbol).should == 'IBM'
|
141
|
+
end
|
142
|
+
|
143
|
+
it "symbol_lookup_url" do
|
144
|
+
ibm(:symbol_lookup_url).should == '/finance?client=ig&q=IBM'
|
145
|
+
end
|
146
|
+
|
147
|
+
it "symbol_url" do
|
148
|
+
ibm(:symbol_url).should == '/finance?client=ig&q=IBM'
|
149
|
+
end
|
150
|
+
|
151
|
+
it "trade_date_utc" do
|
152
|
+
ibm(:trade_date_utc).should == '20110513'
|
153
|
+
end
|
154
|
+
|
155
|
+
it "trade_time_utc" do
|
156
|
+
ibm(:trade_time_utc).should == '200138'
|
157
|
+
end
|
158
|
+
|
159
|
+
it "trade_timestamp" do
|
160
|
+
ibm(:trade_timestamp).should == 'May 13, 2011'
|
161
|
+
end
|
162
|
+
|
163
|
+
it "volume" do
|
164
|
+
ibm(:volume).should == '5168995'
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
describe "MarketBeat::Google Real Time" do
|
169
|
+
before(:all) do
|
170
|
+
@citibank = File.read(File.dirname(__FILE__) + '/fixtures/C.json')
|
171
|
+
end
|
172
|
+
|
173
|
+
def citibank(metric)
|
174
|
+
response = mock(:body => @citibank)
|
175
|
+
Net::HTTP.should_receive(:get_response).once.and_return(response)
|
176
|
+
MarketBeat::Google.send(metric, :c)
|
177
|
+
end
|
178
|
+
|
179
|
+
it "change_real_time" do
|
180
|
+
citibank(:change_real_time).should == '-0.89'
|
181
|
+
end
|
182
|
+
|
183
|
+
it "color_code" do
|
184
|
+
citibank(:color_code_real_time).should == 'chr'
|
185
|
+
end
|
186
|
+
|
187
|
+
it "last_trade_datetime_real_time" do
|
188
|
+
citibank(:last_trade_datetime_real_time).should == 'May 13, 4:00PM EDT'
|
189
|
+
end
|
190
|
+
|
191
|
+
it "last_trade_real_time" do
|
192
|
+
citibank(:last_trade_real_time).should == '41.53'
|
193
|
+
end
|
194
|
+
|
195
|
+
it "last_trade_time_real_time" do
|
196
|
+
citibank(:last_trade_time_real_time).should == '4:00PM EDT'
|
197
|
+
end
|
198
|
+
|
199
|
+
it "percent_change_real_time" do
|
200
|
+
citibank(:percent_change_real_time).should == '-2.10'
|
201
|
+
end
|
202
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# Copyright (c) 2011 Michael Dvorkin
|
2
|
+
#
|
3
|
+
# Market Beat is freely distributable under the terms of MIT license.
|
4
|
+
# See LICENSE file or http://www.opensource.org/licenses/mit-license.php
|
5
|
+
#------------------------------------------------------------------------------
|
6
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
7
|
+
require 'yaml'
|
8
|
+
|
9
|
+
describe "MarketBeat Google Proxy" do
|
10
|
+
metrics = YAML.load_file(File.dirname(__FILE__) + '/../lib/market_beat/google.yml')
|
11
|
+
metrics.values.each do |method|
|
12
|
+
it "Google.#{method}" do
|
13
|
+
MarketBeat::Google.should_receive(method).once
|
14
|
+
MarketBeat::Yahoo.should_not_receive(method)
|
15
|
+
MarketBeat.send(method, :msft)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "MarketBeat Yahoo Proxy" do
|
21
|
+
yahoo_metrics = YAML.load_file(File.dirname(__FILE__) + '/../lib/market_beat/yahoo.yml')
|
22
|
+
google_metrics = YAML.load_file(File.dirname(__FILE__) + '/../lib/market_beat/google.yml')
|
23
|
+
yahoo_metrics.values.each do |method|
|
24
|
+
it "Yahoo.#{method}" do # If Yahoo and Google have the same method Google takes precedence.
|
25
|
+
if google_metrics.values.include?(method)
|
26
|
+
MarketBeat::Google.should_receive(method).once
|
27
|
+
MarketBeat::Yahoo.should_not_receive(method)
|
28
|
+
else
|
29
|
+
MarketBeat::Google.should_not_receive(method)
|
30
|
+
MarketBeat::Yahoo.should_receive(method).once
|
31
|
+
end
|
32
|
+
MarketBeat.send(method, :msft)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "MarketBeat super passthrough" do
|
38
|
+
it "unknown method invokes super" do
|
39
|
+
lambda { MarketBeat.hello_world! }.should raise_error(NoMethodError)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
# Copyright (c) 2011 Michael Dvorkin
|
2
|
+
#
|
3
|
+
# Market Beat is freely distributable under the terms of MIT license.
|
4
|
+
# See LICENSE file or http://www.opensource.org/licenses/mit-license.php
|
5
|
+
#------------------------------------------------------------------------------
|
6
|
+
$:.unshift(File.dirname(__FILE__))
|
7
|
+
$:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
8
|
+
require 'market_beat'
|
data/spec/yahoo_spec.rb
ADDED
@@ -0,0 +1,446 @@
|
|
1
|
+
# Copyright (c) 2011 Michael Dvorkin
|
2
|
+
#
|
3
|
+
# Market Beat is freely distributable under the terms of MIT license.
|
4
|
+
# See LICENSE file or http://www.opensource.org/licenses/mit-license.php
|
5
|
+
#------------------------------------------------------------------------------
|
6
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
7
|
+
require 'yaml'
|
8
|
+
|
9
|
+
describe "MarketBeat::Yahoo" do
|
10
|
+
before(:all) do
|
11
|
+
@apple = YAML.load_file(File.dirname(__FILE__) + '/fixtures/AAPL.yml')
|
12
|
+
@google = YAML.load_file(File.dirname(__FILE__) + '/fixtures/GOOG.yml')
|
13
|
+
end
|
14
|
+
|
15
|
+
def apple(metric)
|
16
|
+
response = mock(:body => @apple[metric])
|
17
|
+
Net::HTTP.should_receive(:get_response).once.and_return(response)
|
18
|
+
MarketBeat::Yahoo.send(metric, 'AAPL')
|
19
|
+
end
|
20
|
+
|
21
|
+
def google(metric)
|
22
|
+
response = mock(:body => @google[metric])
|
23
|
+
Net::HTTP.should_receive(:get_response).once.and_return(response)
|
24
|
+
MarketBeat::Yahoo.send(metric, 'GOOG')
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'after_hours_change_real_time' do
|
28
|
+
apple(:after_hours_change_real_time).should == [ nil, nil ]
|
29
|
+
google(:after_hours_change_real_time).should == [ nil, nil ]
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'annualized_gain' do
|
33
|
+
apple(:annualized_gain).should == nil
|
34
|
+
google(:annualized_gain).should == nil
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'ask' do
|
38
|
+
apple(:ask).should == '340.50'
|
39
|
+
google(:ask).should == '529.98'
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'ask_real_time' do
|
43
|
+
apple(:ask_real_time).should == '340.50'
|
44
|
+
google(:ask_real_time).should == '529.98'
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'ask_size' do
|
48
|
+
apple(:ask_size).should == '100'
|
49
|
+
google(:ask_size).should == '100'
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'average_daily_volume' do
|
53
|
+
apple(:average_daily_volume).should == '16464000'
|
54
|
+
google(:average_daily_volume).should == '2773170'
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'bid' do
|
58
|
+
apple(:bid).should == '340.23'
|
59
|
+
google(:bid).should == nil
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'bid_real_time' do
|
63
|
+
apple(:bid_real_time).should == '340.23'
|
64
|
+
google(:bid_real_time).should == '0.00'
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'bid_size' do
|
68
|
+
apple(:bid_size).should == '200'
|
69
|
+
google(:bid_size).should == nil
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'book_value' do
|
73
|
+
apple(:book_value).should == '66.485'
|
74
|
+
google(:book_value).should == '153.49'
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'change' do
|
78
|
+
apple(:change).should == '-6.07'
|
79
|
+
google(:change).should == '-5.50'
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'change_and_percent_change' do
|
83
|
+
apple(:change_and_percent_change).should == [ '-6.07', '-1.75%' ]
|
84
|
+
google(:change_and_percent_change).should == [ '-5.50', '-1.03%' ]
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'change_from_200_day_moving_average' do
|
88
|
+
apple(:change_from_200_day_moving_average).should == '+5.811'
|
89
|
+
google(:change_from_200_day_moving_average).should == '-60.526'
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'change_from_50_day_moving_average' do
|
93
|
+
apple(:change_from_50_day_moving_average).should == '-3.171'
|
94
|
+
google(:change_from_50_day_moving_average).should == '-24.389'
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'change_from_52_week_high' do
|
98
|
+
apple(:change_from_52_week_high).should == '-24.40'
|
99
|
+
google(:change_from_52_week_high).should == '-113.41'
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'change_from_52_week_low' do
|
103
|
+
apple(:change_from_52_week_low).should == '+109.15'
|
104
|
+
google(:change_from_52_week_low).should == '+95.92'
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'percent_change' do
|
108
|
+
apple(:percent_change).should == '-1.75%'
|
109
|
+
google(:percent_change).should == '-1.03%'
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'change_percent_real_time' do
|
113
|
+
apple(:change_percent_real_time).should == [ nil, '-1.75%' ]
|
114
|
+
google(:change_percent_real_time).should == [ nil, '-1.03%' ]
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'change_real_time' do
|
118
|
+
apple(:change_real_time).should == '-6.07'
|
119
|
+
google(:change_real_time).should == '-5.50'
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'commission' do
|
123
|
+
apple(:commission).should == nil
|
124
|
+
google(:commission).should == nil
|
125
|
+
end
|
126
|
+
|
127
|
+
it 'days_high' do
|
128
|
+
apple(:days_high).should == '346.25'
|
129
|
+
google(:days_high).should == '535.92'
|
130
|
+
end
|
131
|
+
|
132
|
+
it 'days_low' do
|
133
|
+
apple(:days_low).should == '340.35'
|
134
|
+
google(:days_low).should == '529.05'
|
135
|
+
end
|
136
|
+
|
137
|
+
it 'days_range' do
|
138
|
+
apple(:days_range).should == [ '340.35', '346.25' ]
|
139
|
+
google(:days_range).should == [ '529.05', '535.92' ]
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'days_range_real_time' do
|
143
|
+
apple(:days_range_real_time).should == [ nil, nil ]
|
144
|
+
google(:days_range_real_time).should == [ nil, nil ]
|
145
|
+
end
|
146
|
+
|
147
|
+
it 'days_value_change' do
|
148
|
+
apple(:days_value_change).should == [ nil, '-1.75%' ]
|
149
|
+
google(:days_value_change).should == [ nil, '-1.03%' ]
|
150
|
+
end
|
151
|
+
|
152
|
+
it 'days_value_change_real_time' do
|
153
|
+
apple(:days_value_change_real_time).should == [ nil, nil ]
|
154
|
+
google(:days_value_change_real_time).should == [ nil, nil ]
|
155
|
+
end
|
156
|
+
|
157
|
+
it 'dividend_pay_date' do
|
158
|
+
apple(:dividend_pay_date).should == nil
|
159
|
+
google(:dividend_pay_date).should == nil
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'dividend_to_share' do
|
163
|
+
apple(:dividend_to_share).should == '0.00'
|
164
|
+
google(:dividend_to_share).should == '0.00'
|
165
|
+
end
|
166
|
+
|
167
|
+
it 'dividend_yield' do
|
168
|
+
apple(:dividend_yield).should == nil
|
169
|
+
google(:dividend_yield).should == nil
|
170
|
+
end
|
171
|
+
|
172
|
+
it 'earnings_to_share' do
|
173
|
+
apple(:earnings_to_share).should == '20.992'
|
174
|
+
google(:earnings_to_share).should == '27.291'
|
175
|
+
end
|
176
|
+
|
177
|
+
it 'ebitda' do
|
178
|
+
apple(:ebitda).should == '26726000000' # '26.726B'
|
179
|
+
google(:ebitda).should == '12155000000' # '12.155B'
|
180
|
+
end
|
181
|
+
|
182
|
+
it 'eps_estimate_current_year' do
|
183
|
+
apple(:eps_estimate_current_year).should == '24.63'
|
184
|
+
google(:eps_estimate_current_year).should == '33.94'
|
185
|
+
end
|
186
|
+
|
187
|
+
it 'eps_estimate_next_quarter' do
|
188
|
+
apple(:eps_estimate_next_quarter).should == '6.36'
|
189
|
+
google(:eps_estimate_next_quarter).should == '8.31'
|
190
|
+
end
|
191
|
+
|
192
|
+
it 'eps_estimate_next_year' do
|
193
|
+
apple(:eps_estimate_next_year).should == '28.51'
|
194
|
+
google(:eps_estimate_next_year).should == '39.55'
|
195
|
+
end
|
196
|
+
|
197
|
+
it 'error_indication' do
|
198
|
+
apple(:error_indication).should == nil
|
199
|
+
google(:error_indication).should == nil
|
200
|
+
end
|
201
|
+
|
202
|
+
it 'ex_dividend_date' do
|
203
|
+
apple(:ex_dividend_date).should == '21-Nov-95'
|
204
|
+
google(:ex_dividend_date).should == nil
|
205
|
+
end
|
206
|
+
|
207
|
+
it 'float_shares' do
|
208
|
+
apple(:float_shares).should == '918706000'
|
209
|
+
google(:float_shares).should == '251385000'
|
210
|
+
end
|
211
|
+
|
212
|
+
it 'high_52_week' do
|
213
|
+
apple(:high_52_week).should == '364.90'
|
214
|
+
google(:high_52_week).should == '642.96'
|
215
|
+
end
|
216
|
+
|
217
|
+
it 'high_limit' do
|
218
|
+
apple(:high_limit).should == nil
|
219
|
+
google(:high_limit).should == nil
|
220
|
+
end
|
221
|
+
|
222
|
+
it 'holdings_gain' do
|
223
|
+
apple(:holdings_gain).should == nil
|
224
|
+
google(:holdings_gain).should == nil
|
225
|
+
end
|
226
|
+
|
227
|
+
it 'holdings_gain_percent' do
|
228
|
+
apple(:holdings_gain_percent).should == [ nil, nil ]
|
229
|
+
google(:holdings_gain_percent).should == [ nil, nil ]
|
230
|
+
end
|
231
|
+
|
232
|
+
it 'holdings_gain_percent_real_time' do
|
233
|
+
apple(:holdings_gain_percent_real_time).should == [ nil, nil ]
|
234
|
+
google(:holdings_gain_percent_real_time).should == [ nil, nil ]
|
235
|
+
end
|
236
|
+
|
237
|
+
it 'holdings_gain_real_time' do
|
238
|
+
apple(:holdings_gain_real_time).should == nil
|
239
|
+
google(:holdings_gain_real_time).should == nil
|
240
|
+
end
|
241
|
+
|
242
|
+
it 'holdings_value' do
|
243
|
+
apple(:holdings_value).should == nil
|
244
|
+
google(:holdings_value).should == nil
|
245
|
+
end
|
246
|
+
|
247
|
+
it 'holdings_value_real_time' do
|
248
|
+
apple(:holdings_value_real_time).should == nil
|
249
|
+
google(:holdings_value_real_time).should == nil
|
250
|
+
end
|
251
|
+
|
252
|
+
it 'last_trade_date' do
|
253
|
+
apple(:last_trade_date).should == '5/13/2011'
|
254
|
+
google(:last_trade_date).should == '5/13/2011'
|
255
|
+
end
|
256
|
+
|
257
|
+
it 'last_trade_price_only' do
|
258
|
+
apple(:last_trade).should == '340.50'
|
259
|
+
google(:last_trade).should == '529.55'
|
260
|
+
end
|
261
|
+
|
262
|
+
it 'last_trade_real_time_with_time' do
|
263
|
+
apple(:last_trade_real_time_with_time).should == [ nil, '340.50' ]
|
264
|
+
google(:last_trade_real_time_with_time).should == [ nil, '529.55' ]
|
265
|
+
end
|
266
|
+
|
267
|
+
it 'last_trade_size' do
|
268
|
+
apple(:last_trade_size).should == '3570'
|
269
|
+
google(:last_trade_size).should == '980'
|
270
|
+
end
|
271
|
+
|
272
|
+
it 'last_trade_time' do
|
273
|
+
apple(:last_trade_time).should == '4:00pm'
|
274
|
+
google(:last_trade_time).should == '4:00pm'
|
275
|
+
end
|
276
|
+
|
277
|
+
it 'last_trade_with_time' do
|
278
|
+
apple(:last_trade_with_time).should == [ 'May 13', '340.50' ]
|
279
|
+
google(:last_trade_with_time).should == [ 'May 13', '529.55' ]
|
280
|
+
end
|
281
|
+
|
282
|
+
it 'low_52_week' do
|
283
|
+
apple(:low_52_week).should == '231.35'
|
284
|
+
google(:low_52_week).should == '433.63'
|
285
|
+
end
|
286
|
+
|
287
|
+
it 'low_limit' do
|
288
|
+
apple(:low_limit).should == nil
|
289
|
+
google(:low_limit).should == nil
|
290
|
+
end
|
291
|
+
|
292
|
+
it 'market_cap_real_time' do
|
293
|
+
apple(:market_cap_real_time).should == nil
|
294
|
+
google(:market_cap_real_time).should == nil
|
295
|
+
end
|
296
|
+
|
297
|
+
it 'market_capitalization' do
|
298
|
+
apple(:market_capitalization).should == '314900000000' # '314.9B'
|
299
|
+
google(:market_capitalization).should == '170300000000' # '170.3B'
|
300
|
+
end
|
301
|
+
|
302
|
+
it 'more_info' do
|
303
|
+
apple(:more_info).should == 'cnsprmiIed'
|
304
|
+
google(:more_info).should == 'cnprmiIed'
|
305
|
+
end
|
306
|
+
|
307
|
+
it 'moving_average_200_day' do
|
308
|
+
apple(:moving_average_200_day).should == '334.689'
|
309
|
+
google(:moving_average_200_day).should == '590.076'
|
310
|
+
end
|
311
|
+
|
312
|
+
it 'moving_average_50_day' do
|
313
|
+
apple(:moving_average_50_day).should == '343.671'
|
314
|
+
google(:moving_average_50_day).should == '553.939'
|
315
|
+
end
|
316
|
+
|
317
|
+
it 'company' do
|
318
|
+
apple(:company).should == 'Apple Inc.'
|
319
|
+
google(:company).should == 'Google Inc.'
|
320
|
+
end
|
321
|
+
|
322
|
+
it 'notes' do
|
323
|
+
apple(:notes).should == nil
|
324
|
+
google(:notes).should == nil
|
325
|
+
end
|
326
|
+
|
327
|
+
it 'one_year_target_price' do
|
328
|
+
apple(:one_year_target_price).should == '446.87'
|
329
|
+
google(:one_year_target_price).should == '701.54'
|
330
|
+
end
|
331
|
+
|
332
|
+
it 'opening_price' do
|
333
|
+
apple(:opening_price).should == '345.79'
|
334
|
+
google(:opening_price).should == '534.51'
|
335
|
+
end
|
336
|
+
|
337
|
+
it 'order_book_real_time' do
|
338
|
+
apple(:order_book_real_time).should == nil
|
339
|
+
google(:order_book_real_time).should == nil
|
340
|
+
end
|
341
|
+
|
342
|
+
it 'pe_ratio' do
|
343
|
+
apple(:pe_ratio).should == '16.51'
|
344
|
+
google(:pe_ratio).should == '19.61'
|
345
|
+
end
|
346
|
+
|
347
|
+
it 'pe_ratio_real_time' do
|
348
|
+
apple(:pe_ratio_real_time).should == nil
|
349
|
+
google(:pe_ratio_real_time).should == nil
|
350
|
+
end
|
351
|
+
|
352
|
+
it 'peg_ratio' do
|
353
|
+
apple(:peg_ratio).should == '0.67'
|
354
|
+
google(:peg_ratio).should == '0.89'
|
355
|
+
end
|
356
|
+
|
357
|
+
it 'percent_change_from_200_day_moving_average' do
|
358
|
+
apple(:percent_change_from_200_day_moving_average).should == '+1.74%'
|
359
|
+
google(:percent_change_from_200_day_moving_average).should == '-10.26%'
|
360
|
+
end
|
361
|
+
|
362
|
+
it 'percent_change_from_50_day_moving_average' do
|
363
|
+
apple(:percent_change_from_50_day_moving_average).should == '-0.92%'
|
364
|
+
google(:percent_change_from_50_day_moving_average).should == '-4.40%'
|
365
|
+
end
|
366
|
+
|
367
|
+
it 'percent_change_from_52_week_high' do
|
368
|
+
apple(:percent_change_from_52_week_high).should == '-6.69%'
|
369
|
+
google(:percent_change_from_52_week_high).should == '-17.64%'
|
370
|
+
end
|
371
|
+
|
372
|
+
it 'percent_change_from_52_week_low' do
|
373
|
+
apple(:percent_change_from_52_week_low).should == '+47.18%'
|
374
|
+
google(:percent_change_from_52_week_low).should == '+22.12%'
|
375
|
+
end
|
376
|
+
|
377
|
+
it 'previous_close' do
|
378
|
+
apple(:previous_close).should == '346.57'
|
379
|
+
google(:previous_close).should == '535.05'
|
380
|
+
end
|
381
|
+
|
382
|
+
it 'price_paid' do
|
383
|
+
apple(:price_paid).should == nil
|
384
|
+
google(:price_paid).should == nil
|
385
|
+
end
|
386
|
+
|
387
|
+
it 'price_to_book' do
|
388
|
+
apple(:price_to_book).should == '5.21'
|
389
|
+
google(:price_to_book).should == '3.49'
|
390
|
+
end
|
391
|
+
|
392
|
+
it 'price_to_eps_estimate_current_year' do
|
393
|
+
apple(:price_to_eps_estimate_current_year).should == '14.07'
|
394
|
+
google(:price_to_eps_estimate_current_year).should == '15.76'
|
395
|
+
end
|
396
|
+
|
397
|
+
it 'price_to_eps_estimate_next_year' do
|
398
|
+
apple(:price_to_eps_estimate_next_year).should == '12.16'
|
399
|
+
google(:price_to_eps_estimate_next_year).should == '13.53'
|
400
|
+
end
|
401
|
+
|
402
|
+
it 'price_to_sales' do
|
403
|
+
apple(:price_to_sales).should == '3.66'
|
404
|
+
google(:price_to_sales).should == '5.53'
|
405
|
+
end
|
406
|
+
|
407
|
+
it 'range_52_week' do
|
408
|
+
apple(:range_52_week).should == [ '231.35', '364.90' ]
|
409
|
+
google(:range_52_week).should == [ '433.63', '642.96' ]
|
410
|
+
end
|
411
|
+
|
412
|
+
it 'shares_owned' do
|
413
|
+
apple(:shares_owned).should == nil
|
414
|
+
google(:shares_owned).should == nil
|
415
|
+
end
|
416
|
+
|
417
|
+
it 'short_ratio' do
|
418
|
+
apple(:short_ratio).should == '0.80'
|
419
|
+
google(:short_ratio).should == '1.20'
|
420
|
+
end
|
421
|
+
|
422
|
+
it 'stock_exchange' do
|
423
|
+
apple(:stock_exchange).should == 'NasdaqNM'
|
424
|
+
google(:stock_exchange).should == 'NasdaqNM'
|
425
|
+
end
|
426
|
+
|
427
|
+
it 'symbol' do
|
428
|
+
apple(:symbol).should == 'AAPL'
|
429
|
+
google(:symbol).should == 'GOOG'
|
430
|
+
end
|
431
|
+
|
432
|
+
it 'ticker_trend' do
|
433
|
+
apple(:ticker_trend).should == '======'
|
434
|
+
google(:ticker_trend).should == '======'
|
435
|
+
end
|
436
|
+
|
437
|
+
it 'trade_date' do
|
438
|
+
apple(:trade_date).should == nil
|
439
|
+
google(:trade_date).should == nil
|
440
|
+
end
|
441
|
+
|
442
|
+
it 'volume' do
|
443
|
+
apple(:volume).should == '11649708'
|
444
|
+
google(:volume).should == '2107641'
|
445
|
+
end
|
446
|
+
end
|
metadata
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: market_beat
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Michael Dvorkin
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-12-21 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: &70263207751320 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 2.6.0
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70263207751320
|
25
|
+
description: Fetch real-time and delayed stock quotes and 100+ other financial and
|
26
|
+
market indicaors from publicly available sources.
|
27
|
+
email: mike@dvorkin.net
|
28
|
+
executables: []
|
29
|
+
extensions: []
|
30
|
+
extra_rdoc_files: []
|
31
|
+
files:
|
32
|
+
- CHANGELOG
|
33
|
+
- Gemfile
|
34
|
+
- Gemfile.lock
|
35
|
+
- LICENSE
|
36
|
+
- Rakefile
|
37
|
+
- README.md
|
38
|
+
- lib/market_beat/google.rb
|
39
|
+
- lib/market_beat/version.rb
|
40
|
+
- lib/market_beat/yahoo.rb
|
41
|
+
- lib/market_beat.rb
|
42
|
+
- spec/google_spec.rb
|
43
|
+
- spec/market_beat_spec.rb
|
44
|
+
- spec/spec_helper.rb
|
45
|
+
- spec/yahoo_spec.rb
|
46
|
+
- .gitignore
|
47
|
+
homepage: http://github.com/michaeldv/market_beat
|
48
|
+
licenses: []
|
49
|
+
post_install_message:
|
50
|
+
rdoc_options: []
|
51
|
+
require_paths:
|
52
|
+
- lib
|
53
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ! '>='
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: '0'
|
59
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
|
+
none: false
|
61
|
+
requirements:
|
62
|
+
- - ! '>='
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0'
|
65
|
+
requirements: []
|
66
|
+
rubyforge_project: market_beat
|
67
|
+
rubygems_version: 1.8.11
|
68
|
+
signing_key:
|
69
|
+
specification_version: 3
|
70
|
+
summary: Fetch up-to-date stock quotes and 100+ financial and market indicators.
|
71
|
+
test_files:
|
72
|
+
- spec/google_spec.rb
|
73
|
+
- spec/market_beat_spec.rb
|
74
|
+
- spec/spec_helper.rb
|
75
|
+
- spec/yahoo_spec.rb
|