google-finance-ruby-client 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 463be825564f209ff8cec24ec5578bd4d9bdfcf2
4
- data.tar.gz: aa5cf58b7ddbcf96b4e54c60c5a6ed08acc8840b
3
+ metadata.gz: 6b43a8f6bffc4ab128fcd6dad74ae82ff2684ecb
4
+ data.tar.gz: 8ddc90677f6cfc479e7e10f6cb50c177c1bab040
5
5
  SHA512:
6
- metadata.gz: e062d6d86755af3769280155d65d81207417511a96d0cc19c6fe9c0252635c166a7d9ae91c8fb1bc31156115906d967d88e26b0f4948a4825c094fbf8449131e
7
- data.tar.gz: 3a16a1a953473207ee55ce8149aeac605797d8af54013fb252094be6b1dc834c4c9a810fbeca6f5c257c34eeba0dc2483b1ccd2081901e00bcc0767c91087dd5
6
+ metadata.gz: d406664a6436ac69a23e660dd7e194c1263fb5a7653a72d6ed6c69af43e7141322815f43c5941492ed5f6ddf24710aa7d4adf330f1bb6a5e695dccc817fcd4cf
7
+ data.tar.gz: 0c102d2c49609785c9adf28de80fe6d3e7e1e03a785aa6b14efda1779c30589501f1d9252cef288b1e886692f6ac4db8d0d925f282b8d74b49d621eacb5659da
@@ -1,6 +1,6 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2017-12-28 15:14:15 -0500 using RuboCop version 0.51.0.
3
+ # on 2017-12-30 14:48:53 -0500 using RuboCop version 0.51.0.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
@@ -24,14 +24,14 @@ Lint/EndAlignment:
24
24
  Exclude:
25
25
  - 'lib/google-finance/prices.rb'
26
26
 
27
- # Offense count: 3
27
+ # Offense count: 4
28
28
  Metrics/AbcSize:
29
29
  Max: 77
30
30
 
31
- # Offense count: 5
31
+ # Offense count: 6
32
32
  # Configuration parameters: CountComments, ExcludedMethods.
33
33
  Metrics/BlockLength:
34
- Max: 83
34
+ Max: 97
35
35
 
36
36
  # Offense count: 1
37
37
  # Configuration parameters: CountBlocks.
@@ -42,13 +42,13 @@ Metrics/BlockNesting:
42
42
  Metrics/CyclomaticComplexity:
43
43
  Max: 29
44
44
 
45
- # Offense count: 26
45
+ # Offense count: 33
46
46
  # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
47
47
  # URISchemes: http, https
48
48
  Metrics/LineLength:
49
49
  Max: 153
50
50
 
51
- # Offense count: 4
51
+ # Offense count: 5
52
52
  # Configuration parameters: CountComments.
53
53
  Metrics/MethodLength:
54
54
  Max: 77
@@ -64,16 +64,18 @@ Naming/FileName:
64
64
  Exclude:
65
65
  - 'lib/google-finance-ruby-client.rb'
66
66
 
67
- # Offense count: 9
67
+ # Offense count: 11
68
68
  Style/Documentation:
69
69
  Exclude:
70
70
  - 'spec/**/*'
71
71
  - 'test/**/*'
72
72
  - 'lib/google-finance/api/get_prices.rb'
73
+ - 'lib/google-finance/api/historical.rb'
73
74
  - 'lib/google-finance/api/index.rb'
74
75
  - 'lib/google-finance/errors/symbol_not_found_error.rb'
75
76
  - 'lib/google-finance/errors/symbols_not_found_error.rb'
76
77
  - 'lib/google-finance/faraday_middleware/preprocessor.rb'
78
+ - 'lib/google-finance/history.rb'
77
79
  - 'lib/google-finance/price.rb'
78
80
  - 'lib/google-finance/prices.rb'
79
81
  - 'lib/google-finance/quote.rb'
@@ -1,6 +1,10 @@
1
+ ### 0.2.1 (2017/12/30)
2
+
3
+ * [#5](https://github.com/dblock/google-finance-ruby-client/issues/5): Added support for interday historical price data - [@dblock](https://github.com/dblock).
4
+
1
5
  ### 0.2.0 (2017/12/28)
2
6
 
3
- * [#1](https://github.com/dblock/google-finance-ruby-client/issues/1): Retrieve history of prices - [@dblock](https://github.com/dblock).
7
+ * [#1](https://github.com/dblock/google-finance-ruby-client/issues/1): Added support for intraday historical price data - [@dblock](https://github.com/dblock).
4
8
 
5
9
  ### 0.1.0 (2017/12/02)
6
10
 
data/README.md CHANGED
@@ -4,7 +4,7 @@ Google Finance Ruby Client
4
4
  [![Gem Version](https://badge.fury.io/rb/google-finance-ruby-client.svg)](https://badge.fury.io/rb/google-finance-ruby-client)
5
5
  [![Build Status](https://travis-ci.org/dblock/google-finance-ruby-client.svg?branch=master)](https://travis-ci.org/dblock/google-finance-ruby-client)
6
6
 
7
- A Ruby client for the undocumented Google Finance web API that attempts to make sense of the data.
7
+ A Ruby client for the undocumented Google Finance web API. Supports stock quotes and historical prices. Attempts to make sense of, coerce and structure the data.
8
8
 
9
9
  <a href='http://finance.google.com/finance'>![](google-finance.png)</a>
10
10
 
@@ -24,6 +24,8 @@ Run `bundle install`.
24
24
 
25
25
  ### Get a Quote
26
26
 
27
+ Fetches stock quotes via [https://finance.google.com/finance](lib/google-finance/api/index.rb).
28
+
27
29
  ```ruby
28
30
  quote = GoogleFinance::Quote.get('MSFT')
29
31
 
@@ -54,7 +56,40 @@ If one of the symbols cannot be found a [GoogleFinance::Errors::SymbolsNotFound]
54
56
 
55
57
  ### Get Price History
56
58
 
57
- Fetches price history for a ticker.
59
+ #### Daily Price History
60
+
61
+ Fetches price history for a ticker via [https://finance.google.com/finance/historical](lib/google-finance/api/historical.rb).
62
+
63
+ ```ruby
64
+ prices = GoogleFinance::History.get('MSFT')
65
+
66
+ # prices for the last year of open markets
67
+ prices.count # 251
68
+
69
+ # prices appear in reverse chronological order
70
+ prices.first # #<GoogleFinance::Price close=85.54 date=#<Date: 2017-12-29> high=86.05 low=85.5 open=85.63 volume=18717406>
71
+ prices[1] # #<GoogleFinance::Price close=85.72 date=#<Date: 2017-12-28> high=85.93 low=85.55 open=85.9 volume=10594344>
72
+ ```
73
+
74
+ If a symbol cannot be found a [GoogleFinance::Errors::SymbolNotFound](lib/google-finance/errors/symbol_not_found_error.rb) is raised.
75
+
76
+ The following options are supported.
77
+
78
+ * `start_date`: date to start retrieving from
79
+ * `end_date`: date to retrieve data up to
80
+
81
+ Retrieve prices in the first trading week of 2016. No trading on the week-end or during holidays.
82
+
83
+ ```ruby
84
+ prices = GoogleFinance::History.get('MSFT', start_date: Date.parse('2016-01-03'), end_date: Date.parse('2016-01-10'))
85
+
86
+ prices.count # 5
87
+ prices.first # #<GoogleFinance::Price close=52.33 date=#<Date: 2016-01-08> high=53.28 low=52.15 open=52.37 volume=48753969>
88
+ ```
89
+
90
+ #### Intraday Price History
91
+
92
+ Fetches price history, including at intraday intervals, for a ticker via [https://finance.google.com/finance/getprices](lib/google-finance/api/get_prices.rb).
58
93
 
59
94
  ```ruby
60
95
  prices = GoogleFinance::Prices.get('MSFT')
@@ -86,12 +121,14 @@ The following options are supported.
86
121
  * `low`: low price
87
122
  * `high`: high price
88
123
 
89
- Retrieve prices for a year in 1 hour intervals.
124
+ Retrieve intraday prices in 1 hour intervals.
90
125
 
91
126
  ```ruby
92
- prices = GoogleFinance::Prices.get('GOOG', interval: 60 * 60, period: '1Y', fields: [:date, :close, :volume, :open, :high, :low])
127
+ prices = GoogleFinance::Prices.get('GOOG', interval: 60 * 60, period: '1d')
128
+
129
+ prices.count # 7
93
130
 
94
- prices.count # 1755
131
+ prices # array of GoogleFinance::Price, date=2017-12-29 10:00AM, 11:00AM, etc.
95
132
  ```
96
133
 
97
134
  Retrieve only prices at market close.
@@ -14,7 +14,7 @@ Gem::Specification.new do |s|
14
14
  s.require_paths = ['lib']
15
15
  s.homepage = 'http://github.com/dblock/google-finance-ruby-client'
16
16
  s.licenses = ['MIT']
17
- s.summary = 'Google Finance web API ruby client.'
17
+ s.summary = 'Google Finance web API ruby client with support for retrieving stock quotes and historical prices.'
18
18
  s.add_dependency 'faraday', '>= 0.9'
19
19
  s.add_dependency 'faraday_middleware'
20
20
  s.add_dependency 'hashie'
@@ -2,6 +2,7 @@ require 'faraday'
2
2
  require 'faraday_middleware'
3
3
  require 'faraday_middleware/response_middleware'
4
4
  require 'hashie'
5
+ require 'csv'
5
6
  require_relative 'google-finance/version'
6
7
  require_relative 'google-finance/faraday_middleware/preprocessor'
7
8
  require_relative 'google-finance/errors'
@@ -11,3 +12,4 @@ require_relative 'google-finance/quote'
11
12
  require_relative 'google-finance/quotes'
12
13
  require_relative 'google-finance/price'
13
14
  require_relative 'google-finance/prices'
15
+ require_relative 'google-finance/history'
@@ -1,2 +1,3 @@
1
1
  require_relative 'api/index'
2
2
  require_relative 'api/get_prices'
3
+ require_relative 'api/historical'
@@ -17,8 +17,10 @@ module GoogleFinance
17
17
  # v: volume
18
18
  # l: low
19
19
  # o: open
20
- # df: ?, eg. cpct
21
- # auto: ?
20
+ # df: difference
21
+ # cpct: change in percent
22
+ # auto:
23
+ # 1 : ?
22
24
  # ei: ?
23
25
  # ts: starting timetamp in unix format, default to today
24
26
  #
@@ -0,0 +1,24 @@
1
+ module GoogleFinance
2
+ module Api
3
+ module Historical
4
+ def self.fetch(params)
5
+ connection.get do |c|
6
+ c.params[:output] = :csv
7
+ c.params.merge!(params)
8
+ end.body
9
+ end
10
+
11
+ def self.connection
12
+ Faraday.new(
13
+ url: 'https://finance.google.com/finance/historical',
14
+ request: {
15
+ params_encoder: Faraday::FlatParamsEncoder
16
+ }
17
+ ) do |c|
18
+ c.use Faraday::Response::RaiseError
19
+ c.use Faraday::Adapter::NetHttp
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,35 @@
1
+ module GoogleFinance
2
+ module History
3
+ def self.get(symbol, params = {})
4
+ query = {}
5
+ params.each_pair do |k, v|
6
+ case k
7
+ when :startdate, :start_date then
8
+ query[:startdate] = v.strftime('%-d-%b-%Y')
9
+ when :enddate, :end_date then
10
+ query[:enddate] = v.strftime('%-d-%b-%Y')
11
+ else
12
+ raise ArgumentError, "Invalid parameter: #{k}."
13
+ end
14
+ end
15
+ data = CSV.parse(GoogleFinance::Api::Historical.fetch(
16
+ { q: symbol }.merge(query)
17
+ ).force_encoding('UTF-8'), headers: true, header_converters: :symbol)
18
+ data.map do |row|
19
+ Price.new(
20
+ 'date' => Date.parse(row[:date]),
21
+ 'open' => row[:open].to_f,
22
+ 'close' => row[:close].to_f,
23
+ 'high' => row[:high].to_f,
24
+ 'low' => row[:low].to_f,
25
+ 'volume' => row[:volume].to_i
26
+ )
27
+ end
28
+ rescue Faraday::ClientError => e
29
+ raise GoogleFinance::Errors::SymbolNotFoundError.new(symbol, e.response) if
30
+ e.response[:status] == 400 &&
31
+ e.response[:body].include?('The requested URL was not found on this server.')
32
+ raise e
33
+ end
34
+ end
35
+ end
@@ -2,7 +2,7 @@ module GoogleFinance
2
2
  class Prices < Array
3
3
  extend Forwardable
4
4
 
5
- def_delegators :@headers, :exchange, :market_open_minute, :market_close_minute, :interval, :columns, :timezone_offset
5
+ def_delegators :@headers, :exchange, :market_open_minute, :market_close_minute, :interval, :columns
6
6
 
7
7
  def initialize(headers, values = [])
8
8
  @headers = OpenStruct.new(headers)
@@ -1,3 +1,3 @@
1
1
  module GoogleFinance
2
- VERSION = '0.2.0'.freeze
2
+ VERSION = '0.2.1'.freeze
3
3
  end
@@ -0,0 +1,68 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://finance.google.com/finance/getprices?f=d,c,v,k,o,h,l&i=3600&p=1d&q=GOOG
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.13.1
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - "*/*"
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Content-Type:
22
+ - text/plain; charset=ISO-8859-1
23
+ Cache-Control:
24
+ - private,max-age=60
25
+ Vary:
26
+ - Accept-Encoding
27
+ X-Content-Type-Options:
28
+ - nosniff
29
+ P3p:
30
+ - CP="This is not a P3P policy! See g.co/p3phelp for more info."
31
+ Date:
32
+ - Sat, 30 Dec 2017 19:42:11 GMT
33
+ X-Frame-Options:
34
+ - SAMEORIGIN
35
+ X-Xss-Protection:
36
+ - 1; mode=block
37
+ Server:
38
+ - GSE
39
+ Set-Cookie:
40
+ - NID=120=nxsT8eBe-SnVh1kccfjLdsriT3TdgJp9IGndHlw6QAAhAXH5uN-4ldTNRytwbtDS6QIrLKoBRDPZKaIAscEpGaDn9DQauWybMNP615ogd0_f5Vjao3H27FLY_El2dZPd;Domain=.google.com;Path=/;Expires=Sun,
41
+ 01-Jul-2018 19:42:11 GMT;HttpOnly
42
+ Alt-Svc:
43
+ - hq=":443"; ma=2592000; quic=51303431; quic=51303339; quic=51303338; quic=51303337;
44
+ quic=51303335,quic=":443"; ma=2592000; v="41,39,38,37,35"
45
+ Expires:
46
+ - Sat, 30 Dec 2017 19:42:11 GMT
47
+ Transfer-Encoding:
48
+ - chunked
49
+ body:
50
+ encoding: ASCII-8BIT
51
+ string: |
52
+ EXCHANGE%3DNASDAQ
53
+ MARKET_OPEN_MINUTE=570
54
+ MARKET_CLOSE_MINUTE=960
55
+ INTERVAL=3600
56
+ COLUMNS=DATE,CLOSE,HIGH,LOW,OPEN,VOLUME,CDAYS
57
+ DATA=
58
+ TIMEZONE_OFFSET=-300
59
+ a1514559600,1048.59,1049.7,1045.925,1046.72,68954,0
60
+ 1,1046.5,1049.26,1045,1047.88,57153,0
61
+ 2,1047.685,1047.88,1045.53,1046.82,36472,0
62
+ 3,1046,1047.85,1045.57,1047.78,24568,0
63
+ 4,1044.9,1046.15,1044.9,1045.68,36805,0
64
+ 5,1046.84,1047.06,1045,1045.53,28693,0
65
+ 6,1046.4,1049.14,1045.49,1046.7,301059,0
66
+ http_version:
67
+ recorded_at: Sat, 30 Dec 2017 19:42:11 GMT
68
+ recorded_with: VCR 3.0.3
@@ -0,0 +1,53 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://finance.google.com/finance/historical?output=csv&q=INVALID
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.13.1
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - "*/*"
16
+ response:
17
+ status:
18
+ code: 400
19
+ message: Bad Request
20
+ headers:
21
+ Cache-Control:
22
+ - no-cache, no-store, max-age=0, must-revalidate
23
+ Pragma:
24
+ - no-cache
25
+ Expires:
26
+ - Mon, 01 Jan 1990 00:00:00 GMT
27
+ Date:
28
+ - Sat, 30 Dec 2017 19:36:58 GMT
29
+ Content-Type:
30
+ - text/html; charset=utf-8
31
+ P3p:
32
+ - CP="This is not a P3P policy! See g.co/p3phelp for more info."
33
+ X-Content-Type-Options:
34
+ - nosniff
35
+ X-Xss-Protection:
36
+ - 1; mode=block
37
+ Server:
38
+ - GSE
39
+ Set-Cookie:
40
+ - NID=120=YGp3I9EcoLyPDxtMsmDytVlleg3kXgq3LkK0i21eVhtbFSWHSBvMpRjLOBoeGvwMqi3oUnttHcFwRZSWdfSUs4Qo1-U02qOLLCpCVrpA3D5ou5_YWTb5pcNIIR_K-1FL;Domain=.google.com;Path=/;Expires=Sun,
41
+ 01-Jul-2018 19:36:58 GMT;HttpOnly
42
+ Alt-Svc:
43
+ - hq=":443"; ma=2592000; quic=51303431; quic=51303339; quic=51303338; quic=51303337;
44
+ quic=51303335,quic=":443"; ma=2592000; v="41,39,38,37,35"
45
+ Transfer-Encoding:
46
+ - chunked
47
+ body:
48
+ encoding: ASCII-8BIT
49
+ string: !binary |-
50
+ PCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz1lbj48bWV0YSBjaGFyc2V0PXV0Zi04PjxtZXRhIG5hbWU9dmlld3BvcnQgY29udGVudD0iaW5pdGlhbC1zY2FsZT0xLCBtaW5pbXVtLXNjYWxlPTEsIHdpZHRoPWRldmljZS13aWR0aCI+PHRpdGxlPkVycm9yIDQwMCAoTm90IEZvdW5kKSEhMTwvdGl0bGU+PHN0eWxlPip7bWFyZ2luOjA7cGFkZGluZzowfWh0bWwsY29kZXtmb250OjE1cHgvMjJweCBhcmlhbCxzYW5zLXNlcmlmfWh0bWx7YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMjI7cGFkZGluZzoxNXB4fWJvZHl7Y29sb3I6IzIyMjt0ZXh0LWFsaWduOnVuc2V0O21hcmdpbjo3JSBhdXRvIDA7bWF4LXdpZHRoOjM5MHB4O21pbi1oZWlnaHQ6MTgwcHg7cGFkZGluZzozMHB4IDAgMTVweDt9KiA+IGJvZHl7YmFja2dyb3VuZDp1cmwoLy93d3cuZ29vZ2xlLmNvbS9pbWFnZXMvZXJyb3JzL3JvYm90LnBuZykgMTAwJSA1cHggbm8tcmVwZWF0O3BhZGRpbmctcmlnaHQ6MjA1cHh9cHttYXJnaW46MTFweCAwIDIycHg7b3ZlcmZsb3c6aGlkZGVufXByZXt3aGl0ZS1zcGFjZTpwcmUtd3JhcDt9aW5ze2NvbG9yOiM3Nzc7dGV4dC1kZWNvcmF0aW9uOm5vbmV9YSBpbWd7Ym9yZGVyOjB9QG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NzJweCl7Ym9keXtiYWNrZ3JvdW5kOm5vbmU7bWFyZ2luLXRvcDowO21heC13aWR0aDpub25lO3BhZGRpbmctcmlnaHQ6MH19I2xvZ297YmFja2dyb3VuZDp1cmwoLy93d3cuZ29vZ2xlLmNvbS9pbWFnZXMvYnJhbmRpbmcvZ29vZ2xlbG9nby8xeC9nb29nbGVsb2dvX2NvbG9yXzE1MHg1NGRwLnBuZykgbm8tcmVwZWF0O21hcmdpbi1sZWZ0Oi01cHh9QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246MTkyZHBpKXsjbG9nb3tiYWNrZ3JvdW5kOnVybCgvL3d3dy5nb29nbGUuY29tL2ltYWdlcy9icmFuZGluZy9nb29nbGVsb2dvLzJ4L2dvb2dsZWxvZ29fY29sb3JfMTUweDU0ZHAucG5nKSBuby1yZXBlYXQgMCUgMCUvMTAwJSAxMDAlOy1tb3otYm9yZGVyLWltYWdlOnVybCgvL3d3dy5nb29nbGUuY29tL2ltYWdlcy9icmFuZGluZy9nb29nbGVsb2dvLzJ4L2dvb2dsZWxvZ29fY29sb3JfMTUweDU0ZHAucG5nKSAwfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kICgtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86Mil7I2xvZ297YmFja2dyb3VuZDp1cmwoLy93d3cuZ29vZ2xlLmNvbS9pbWFnZXMvYnJhbmRpbmcvZ29vZ2xlbG9nby8yeC9nb29nbGVsb2dvX2NvbG9yXzE1MHg1NGRwLnBuZykgbm8tcmVwZWF0Oy13ZWJraXQtYmFja2dyb3VuZC1zaXplOjEwMCUgMTAwJX19I2xvZ297ZGlzcGxheTppbmxpbmUtYmxvY2s7aGVpZ2h0OjU0cHg7d2lkdGg6MTUwcHh9PC9zdHlsZT48ZGl2IGlkPSJhZi1lcnJvci1jb250YWluZXIiPjxhIGhyZWY9Ly93d3cuZ29vZ2xlLmNvbT48c3BhbiBpZD1sb2dvIGFyaWEtbGFiZWw9R29vZ2xlPjwvc3Bhbj48L2E+PHA+PGI+NDAwLjwvYj4gPGlucz5UaGF04oCZcyBhbiBlcnJvci48L2lucz48cD5UaGUgcmVxdWVzdGVkIFVSTCB3YXMgbm90IGZvdW5kIG9uIHRoaXMgc2VydmVyLiA8aW5zPlRoYXTigJlzIGFsbCB3ZSBrbm93LjwvaW5zPjwvZGl2Pg==
51
+ http_version:
52
+ recorded_at: Sat, 30 Dec 2017 19:36:58 GMT
53
+ recorded_with: VCR 3.0.3
@@ -0,0 +1,56 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://finance.google.com/finance/historical?output=csv&q=MSFT
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.13.1
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - "*/*"
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Content-Type:
22
+ - application/vnd.ms-excel
23
+ Date:
24
+ - Sat, 30 Dec 2017 19:35:33 GMT
25
+ Expires:
26
+ - Sat, 30 Dec 2017 19:35:33 GMT
27
+ Cache-Control:
28
+ - private, max-age=0
29
+ Content-Disposition:
30
+ - attachment; filename="msft.csv"
31
+ X-Content-Type-Options:
32
+ - nosniff
33
+ P3p:
34
+ - CP="This is not a P3P policy! See g.co/p3phelp for more info."
35
+ Transfer-Encoding:
36
+ - chunked
37
+ X-Frame-Options:
38
+ - SAMEORIGIN
39
+ X-Xss-Protection:
40
+ - 1; mode=block
41
+ Server:
42
+ - GSE
43
+ Set-Cookie:
44
+ - NID=120=p1LFxknN8Kx_K5AdB3Zsodv-396dWy7uo2IgP3_6d5veK4KKRTQq5FQZj6zrTpF9a2ne8hL18_GqqDWmBnm0VJmOQaOpdmA2oyV0zsD848nqbHtVmueNtdD7pcrHZDG2;Domain=.google.com;Path=/;Expires=Sun,
45
+ 01-Jul-2018 19:35:33 GMT;HttpOnly
46
+ - SC=RV=:ED=us; expires=Sun, 01-Jul-2018 19:35:33 GMT; path=/finance; domain=.google.com
47
+ Alt-Svc:
48
+ - hq=":443"; ma=2592000; quic=51303431; quic=51303339; quic=51303338; quic=51303337;
49
+ quic=51303335,quic=":443"; ma=2592000; v="41,39,38,37,35"
50
+ body:
51
+ encoding: ASCII-8BIT
52
+ string: !binary |-
53
+ 77u/RGF0ZSxPcGVuLEhpZ2gsTG93LENsb3NlLFZvbHVtZQoyOS1EZWMtMTcsODUuNjMsODYuMDUsODUuNTAsODUuNTQsMTg3MTc0MDYKMjgtRGVjLTE3LDg1LjkwLDg1LjkzLDg1LjU1LDg1LjcyLDEwNTk0MzQ0CjI3LURlYy0xNyw4NS42NSw4NS45OCw4NS4yMiw4NS43MSwxNDY3ODAyNQoyNi1EZWMtMTcsODUuMzEsODUuNTMsODUuMDMsODUuNDAsOTg5MTIzNwoyMi1EZWMtMTcsODUuNDAsODUuNjMsODQuOTIsODUuNTEsMTQxNDU4NDEKMjEtRGVjLTE3LDg2LjA1LDg2LjEwLDg1LjQwLDg1LjUwLDE3OTkwNzQ1CjIwLURlYy0xNyw4Ni4yMCw4Ni4zMCw4NC43MSw4NS41MiwyMzY3NDkzMQoxOS1EZWMtMTcsODYuMzUsODYuMzUsODUuMjcsODUuODMsMjM1MjQ3ODcKMTgtRGVjLTE3LDg3LjEyLDg3LjUwLDg2LjIzLDg2LjM4LDIyMjgzNzUyCjE1LURlYy0xNyw4NS4yNiw4Ny4wOSw4NC44OCw4Ni44NSw1MzkzNjY4NwoxNC1EZWMtMTcsODUuNDMsODUuODcsODQuNTMsODQuNjksMTkzMDU5NjEKMTMtRGVjLTE3LDg1Ljc0LDg2LjAwLDg1LjE3LDg1LjM1LDIyMDYyNjc5CjEyLURlYy0xNyw4NS4zMSw4Ni4wNSw4NS4wOCw4NS41OCwyMzkyNDEwNQoxMS1EZWMtMTcsODQuMjksODUuMzcsODQuMTIsODUuMjMsMjI4NTc4NTQKOC1EZWMtMTcsODMuNjMsODQuNTgsODMuMzMsODQuMTYsMjQ0ODkxMDYKNy1EZWMtMTcsODIuNTQsODIuODAsODIuMDAsODIuNDksMjMxODQ1NDcKNi1EZWMtMTcsODEuNTUsODMuMTQsODEuNDMsODIuNzgsMjYxNjIwNTQKNS1EZWMtMTcsODEuMzQsODIuNjgsODAuOTgsODEuNTksMjYxNTIyNjEKNC1EZWMtMTcsODQuNDIsODQuNDMsODAuNzAsODEuMDgsMzkwOTQ4ODAKMS1EZWMtMTcsODMuNjAsODQuODEsODMuMjIsODQuMjYsMjk1MzIxMzIKMzAtTm92LTE3LDgzLjUxLDg0LjUyLDgzLjM0LDg0LjE3LDMzMDU0NjQ3CjI5LU5vdi0xNyw4NC43MSw4NC45Miw4My4xOCw4My4zNCwyNzM4MTEwOQoyOC1Ob3YtMTcsODQuMDcsODUuMDYsODQuMDIsODQuODgsMjE5MjU5NTkKMjctTm92LTE3LDgzLjMxLDgzLjk4LDgzLjMwLDgzLjg3LDE4MjY1MjQyCjI0LU5vdi0xNyw4My4wMSw4My40Myw4Mi43OCw4My4yNiw3NDI1NjAzCjIyLU5vdi0xNyw4My44Myw4My45MCw4My4wNCw4My4xMSwyMDU1MzA4OQoyMS1Ob3YtMTcsODIuNzQsODMuODQsODIuNzQsODMuNzIsMjEyMzc0NTQKMjAtTm92LTE3LDgyLjQwLDgyLjU5LDgyLjI1LDgyLjUzLDE2MzE0OTc4CjE3LU5vdi0xNyw4My4xMiw4My4xMiw4Mi4yNCw4Mi40MCwyMjA3ODk5MwoxNi1Ob3YtMTcsODMuMTAsODMuNDIsODIuOTQsODMuMjAsMjA5NjI3NTAKMTUtTm92LTE3LDgzLjQ3LDgzLjY5LDgyLjY5LDgyLjk4LDE5MzgzMTAyCjE0LU5vdi0xNyw4My41MCw4NC4xMCw4Mi45OCw4NC4wNSwxODgwMTI4MAoxMy1Ob3YtMTcsODMuNjYsODMuOTQsODMuNDYsODMuOTMsMTQxOTY4OTYKMTAtTm92LTE3LDgzLjc5LDg0LjEwLDgzLjIzLDgzLjg3LDE5Mzk3NzkzCjktTm92LTE3LDg0LjExLDg0LjI3LDgyLjkwLDg0LjA5LDIxMTc4MzU2CjgtTm92LTE3LDg0LjE0LDg0LjYxLDgzLjgzLDg0LjU2LDE4MDM0MTcwCjctTm92LTE3LDg0Ljc3LDg0LjkwLDgzLjkzLDg0LjI3LDE3OTM5NzI3CjYtTm92LTE3LDg0LjIwLDg0LjcwLDg0LjA4LDg0LjQ3LDE5ODYwODUyCjMtTm92LTE3LDg0LjA4LDg0LjU0LDgzLjQwLDg0LjE0LDE3NjMzNTQzCjItTm92LTE3LDgzLjM1LDg0LjQ2LDgzLjEyLDg0LjA1LDIzOTkyOTQ1CjEtTm92LTE3LDgzLjY4LDgzLjc2LDgyLjg4LDgzLjE4LDIyMzA3MzcxCjMxLU9jdC0xNyw4NC4zNiw4NC4zNiw4My4xMSw4My4xOCwyNzA4NjU3NQozMC1PY3QtMTcsODMuNzAsODQuMzIsODMuMTAsODMuODksMzE3NTY2NTMKMjctT2N0LTE3LDg0LjM3LDg2LjIwLDgzLjYxLDgzLjgxLDcxMDY2NzI5CjI2LU9jdC0xNyw3OS4yMCw3OS40Miw3OC43NSw3OC43NiwzMjEyMDcxNwoyNS1PY3QtMTcsNzguNTgsNzkuMTAsNzguMDEsNzguNjMsMjA0MTA4MDgKMjQtT2N0LTE3LDc4LjkwLDc5LjIwLDc4LjQ2LDc4Ljg2LDE3NTE3MTgyCjIzLU9jdC0xNyw3OC45OSw3OS4zNCw3OC43Niw3OC44MywyMDYyNzE3MwoyMC1PY3QtMTcsNzguMzIsNzguOTcsNzguMjIsNzguODEsMjI4NjY0MjYKMTktT2N0LTE3LDc3LjU3LDc3LjkzLDc3LjM1LDc3LjkxLDE1MDkyNzU4CjE4LU9jdC0xNyw3Ny42Nyw3Ny44NSw3Ny4zNyw3Ny42MSwxMzMwMDcwMQoxNy1PY3QtMTcsNzcuNDcsNzcuNjIsNzcuMjUsNzcuNTksMTY4MjM5ODkKMTYtT2N0LTE3LDc3LjQyLDc3LjgxLDc3LjM1LDc3LjY1LDEyMzgwMDkzCjEzLU9jdC0xNyw3Ny41OSw3Ny44Nyw3Ny4yOSw3Ny40OSwxNTMzNTc0MgoxMi1PY3QtMTcsNzYuNDksNzcuMjksNzYuMzcsNzcuMTIsMTY4NzY1MzgKMTEtT2N0LTE3LDc2LjM2LDc2LjQ2LDc1Ljk1LDc2LjQyLDE1Mzg4ODk4CjEwLU9jdC0xNyw3Ni4zMyw3Ni42Myw3Ni4xNCw3Ni4yOSwxMzk0NDU0NQo5LU9jdC0xNyw3NS45Nyw3Ni41NSw3NS44Niw3Ni4yOSwxMTM4NjUwMgo2LU9jdC0xNyw3NS42Nyw3Ni4wMyw3NS41NCw3Ni4wMCwxMzk1OTgxNAo1LU9jdC0xNyw3NS4yMiw3Ni4xMiw3NC45Niw3NS45NywyMTE5NTI2MQo0LU9jdC0xNyw3NC4wOSw3NC43Miw3My43MSw3NC42OSwxMzMxNzY4MQozLU9jdC0xNyw3NC42Nyw3NC44OCw3NC4yMCw3NC4yNiwxMjE5MDQwMwoyLU9jdC0xNyw3NC43MSw3NS4wMSw3NC4zMCw3NC42MSwxNTMwNDc2MgoyOS1TZXAtMTcsNzMuOTQsNzQuNTQsNzMuODgsNzQuNDksMTcwNzkxMTQKMjgtU2VwLTE3LDczLjU0LDczLjk3LDczLjMxLDczLjg3LDEwODgzNzg3CjI3LVNlcC0xNyw3My41NSw3NC4xNyw3My4xNyw3My44NSwxOTM3NTA5OQoyNi1TZXAtMTcsNzMuNjcsNzMuODEsNzIuOTksNzMuMjYsMTgwMTk1NzcKMjUtU2VwLTE3LDc0LjA5LDc0LjI1LDcyLjkyLDczLjI2LDI0MTQ5MTYzCjIyLVNlcC0xNyw3My45OSw3NC41MSw3My44NSw3NC40MSwxNDExMTM2NQoyMS1TZXAtMTcsNzUuMTEsNzUuMjQsNzQuMTEsNzQuMjEsMTkxODYxNDAKMjAtU2VwLTE3LDc1LjM1LDc1LjU1LDc0LjMxLDc0Ljk0LDIxNTg3ODc4CjE5LVNlcC0xNyw3NS4yMSw3NS43MSw3NS4wMSw3NS40NCwxNjA5MzM0NAoxOC1TZXAtMTcsNzUuMjMsNzUuOTcsNzUuMDQsNzUuMTYsMjMzMDY5NTkKMTUtU2VwLTE3LDc0LjgzLDc1LjM5LDc0LjA3LDc1LjMxLDM4NTc4NDQxCjE0LVNlcC0xNyw3NS4wMCw3NS40OSw3NC41Miw3NC43NywxNTczMzkxNAoxMy1TZXAtMTcsNzQuOTMsNzUuMjMsNzQuNTUsNzUuMjEsMTMzODA4MDIKMTItU2VwLTE3LDc0Ljc2LDc1LjI0LDc0LjM3LDc0LjY4LDE0Mzk0ODUwCjExLVNlcC0xNyw3NC4zMSw3NC45NCw3NC4zMSw3NC43NiwxNzkxMDM4Mwo4LVNlcC0xNyw3NC4zMyw3NC40NCw3My44NCw3My45OCwxNDcwMzgxNgo3LVNlcC0xNyw3My42OCw3NC42MCw3My42MCw3NC4zNCwxNzQ3MTIwMAo2LVNlcC0xNyw3My43NCw3NC4wNCw3My4zNSw3My40MCwxNjUzNTc4NQo1LVNlcC0xNyw3My4zNCw3My44OSw3Mi45OCw3My42MSwyMjI0MjM4NAoxLVNlcC0xNyw3NC43MSw3NC43NCw3My42NCw3My45NCwyMTczNjE2MQozMS1BdWctMTcsNzQuMDMsNzQuOTYsNzMuODAsNzQuNzcsMjc2NTI4MTEKMzAtQXVnLTE3LDczLjAxLDc0LjIxLDcyLjgzLDc0LjAxLDE2ODk3ODAxCjI5LUF1Zy0xNyw3Mi4yNSw3My4xNiw3Mi4wNSw3My4wNSwxMTQ3ODM4MgoyOC1BdWctMTcsNzMuMDYsNzMuMDksNzIuNTUsNzIuODMsMTQ1Njk3MTUKMjUtQXVnLTE3LDcyLjg2LDczLjM1LDcyLjQ4LDcyLjgyLDEyNzk0MzAxCjI0LUF1Zy0xNyw3Mi43NCw3Mi44Niw3Mi4wNyw3Mi42OSwxNzA5ODI4MgoyMy1BdWctMTcsNzIuOTYsNzMuMTUsNzIuNTMsNzIuNzIsMTM3NjY1MDcKMjItQXVnLTE3LDcyLjM1LDczLjI0LDcyLjM1LDczLjE2LDE0MzQzNjc0CjIxLUF1Zy0xNyw3Mi40Nyw3Mi40OCw3MS43MCw3Mi4xNSwxNzczNDc2NwoxOC1BdWctMTcsNzIuMjcsNzIuODQsNzEuOTMsNzIuNDksMTg3NjE0OTEKMTctQXVnLTE3LDczLjU4LDczLjg3LDcyLjQwLDcyLjQwLDIyOTc3NTE5CjE2LUF1Zy0xNyw3My4zNCw3NC4xMCw3My4xNyw3My42NSwxODE1MDQwMgoxNS1BdWctMTcsNzMuNTksNzMuNTksNzMuMDQsNzMuMjIsMTkxODE0MDIKMTQtQXVnLTE3LDczLjA2LDczLjcyLDcyLjk1LDczLjU5LDIwMDk2NTkyCjExLUF1Zy0xNyw3MS42MSw3Mi43MCw3MS4yOCw3Mi41MCwyMTQ0MzY3NQoxMC1BdWctMTcsNzEuOTAsNzIuMTksNzEuMzUsNzEuNDEsMjQ3MzQ0NjEKOS1BdWctMTcsNzIuMjUsNzIuNTEsNzIuMDUsNzIuNDcsMjIyMTM0MTAKOC1BdWctMTcsNzIuMDksNzMuMTMsNzEuNzUsNzIuNzksMjIwNDQ1ODcKNy1BdWctMTcsNzIuODAsNzIuOTAsNzIuMjYsNzIuNDAsMTg3MDU2ODEKNC1BdWctMTcsNzIuNDAsNzMuMDQsNzIuMjQsNzIuNjgsMjI1Nzg5NTIKMy1BdWctMTcsNzIuMTksNzIuNDQsNzEuODQsNzIuMTUsMTgyMTQ0MjQKMi1BdWctMTcsNzIuNTUsNzIuNTYsNzEuNDQsNzIuMjYsMjY0OTkxNTgKMS1BdWctMTcsNzMuMTAsNzMuNDIsNzIuNDksNzIuNTgsMjA4MjM4OTAKMzEtSnVsLTE3LDczLjMwLDczLjQ0LDcyLjQxLDcyLjcwLDIzNjAwMDU0CjI4LUp1bC0xNyw3Mi42Nyw3My4zMSw3Mi41NCw3My4wNCwxODMwNjY4MAoyNy1KdWwtMTcsNzMuNzYsNzQuNDIsNzIuMzIsNzMuMTYsMzY4NDQyMjAKMjYtSnVsLTE3LDc0LjM0LDc0LjM4LDczLjgxLDc0LjA1LDE2MjUyMjMzCjI1LUp1bC0xNyw3My44MCw3NC4zMSw3My41MCw3NC4xOSwyMjAxODY4MQoyNC1KdWwtMTcsNzMuNTMsNzMuNzUsNzMuMTMsNzMuNjAsMjEzOTQ4MjYKMjEtSnVsLTE3LDczLjQ1LDc0LjI5LDczLjE3LDczLjc5LDQ2NzE3MDgyCjIwLUp1bC0xNyw3NC4xOCw3NC4zMCw3My4yOCw3NC4yMiw0MjM2MTAyNQoxOS1KdWwtMTcsNzMuNTAsNzQuMDQsNzMuNDUsNzMuODYsMjI0MTYyMjIKMTgtSnVsLTE3LDczLjA5LDczLjM5LDcyLjY2LDczLjMwLDI2NDM1Mjk2CjE3LUp1bC0xNyw3Mi44MCw3My40NSw3Mi43Miw3My4zNSwyMTgwMzkwNwoxNC1KdWwtMTcsNzIuMjQsNzMuMjcsNzEuOTYsNzIuNzgsMjU4NjgwODYKMTMtSnVsLTE3LDcxLjUwLDcyLjA0LDcxLjMxLDcxLjc3LDIwMjY5ODE2CjEyLUp1bC0xNyw3MC42OSw3MS4yOCw3MC41NSw3MS4xNSwxNzc1MDkyNQoxMS1KdWwtMTcsNzAuMTEsNzAuNjgsNjkuNzUsNjkuOTksMTc0NjAwMjIKMTAtSnVsLTE3LDY5LjQ2LDcwLjI1LDY5LjIwLDY5Ljk4LDE1MDE0NTAzCjctSnVsLTE3LDY4LjcwLDY5Ljg0LDY4LjcwLDY5LjQ2LDE2ODc4MzE3CjYtSnVsLTE3LDY4LjI3LDY4Ljc4LDY4LjEyLDY4LjU3LDIxMTE3NTcyCjUtSnVsLTE3LDY4LjI2LDY5LjQ0LDY4LjIyLDY5LjA4LDIxMTc2MjcyCjMtSnVsLTE3LDY5LjMzLDY5LjYwLDY4LjAyLDY4LjE3LDE2MTY1NTM4CjMwLUp1bi0xNyw2OC43OCw2OS4zOCw2OC43NCw2OC45MywyNDE2MTA2OAoyOS1KdW4tMTcsNjkuMzgsNjkuNDksNjguMDksNjguNDksMjg5MTg3MTUKMjgtSnVuLTE3LDY5LjIxLDY5Ljg0LDY4Ljc5LDY5LjgwLDI1ODA2MjAwCjI3LUp1bi0xNyw3MC4xMSw3MC4xOCw2OS4xOCw2OS4yMSwyNTIxNTEyOAoyNi1KdW4tMTcsNzEuNDAsNzEuNzEsNzAuNDQsNzAuNTMsMTk2MDY5NzQKMjMtSnVuLTE3LDcwLjA5LDcxLjI1LDY5LjkyLDcxLjIxLDI3NjE3MjkxCjIyLUp1bi0xNyw3MC41NCw3MC41OSw2OS43MSw3MC4yNiwyMjk2NTczOAoyMS1KdW4tMTcsNzAuMjEsNzAuNjIsNjkuOTQsNzAuMjcsMTk4OTEwNTEKMjAtSnVuLTE3LDcwLjgyLDcwLjg3LDY5Ljg3LDY5LjkxLDIxNTEyMjMxCjE5LUp1bi0xNyw3MC41MCw3MC45NCw3MC4zNSw3MC44NywyMzc5ODI2OAoxNi1KdW4tMTcsNjkuNzMsNzAuMDMsNjkuMjIsNzAuMDAsNDgzNDUwODUKMTUtSnVuLTE3LDY5LjI3LDcwLjIxLDY4LjgwLDY5LjkwLDI2MDY4NzA5CjE0LUp1bi0xNyw3MC45MSw3MS4xMCw2OS40Myw3MC4yNywyNTUxMDY4NQoxMy1KdW4tMTcsNzAuMDIsNzAuODIsNjkuOTYsNzAuNjUsMjUyNTg2MTQKMTItSnVuLTE3LDY5LjI1LDY5Ljk0LDY4LjEzLDY5Ljc4LDQ3NzYxNzQzCjktSnVuLTE3LDcyLjA0LDcyLjA4LDY4LjU5LDcwLjMyLDQ5MTg3Mzk2CjgtSnVuLTE3LDcyLjUxLDcyLjUyLDcxLjUwLDcxLjk1LDI0NTg4MjcwCjctSnVuLTE3LDcyLjY0LDcyLjc3LDcxLjk1LDcyLjM5LDIyMzAxNzY1CjYtSnVuLTE3LDcyLjMwLDcyLjYyLDcyLjI3LDcyLjUyLDMxNTExMDY1CjUtSnVuLTE3LDcxLjk3LDcyLjg5LDcxLjgxLDcyLjI4LDMzMzE2NzYwCjItSnVuLTE3LDcwLjQ0LDcxLjg2LDcwLjI0LDcxLjc2LDM0NzcwMjYxCjEtSnVuLTE3LDcwLjI0LDcwLjYxLDY5LjQ1LDcwLjEwLDIxNjAzNjAxCjMxLU1heS0xNyw3MC41Myw3MC43NCw2OS44MSw2OS44NCwzMDQzNjM2NAozMC1NYXktMTcsNjkuNzksNzAuNDEsNjkuNzcsNzAuNDEsMTcwNzI4MzgKMjYtTWF5LTE3LDY5LjgwLDcwLjIyLDY5LjUyLDY5Ljk2LDE5ODI3OTIzCjI1LU1heS0xNyw2OC45Nyw2OS44OCw2OC45MSw2OS42MiwyMTg1NDA5NQoyNC1NYXktMTcsNjguODcsNjguODgsNjguNDUsNjguNzcsMTQ2NjY4NjUKMjMtTWF5LTE3LDY4LjcyLDY4Ljc1LDY4LjM4LDY4LjY4LDE1NDI1ODI0CjIyLU1heS0xNyw2Ny44OSw2OC41MCw2Ny41MCw2OC40NSwxNjIzNzU1MAoxOS1NYXktMTcsNjcuNTAsNjguMTAsNjcuNDMsNjcuNjksMjY5NjExMTkKMTgtTWF5LTE3LDY3LjQwLDY4LjEzLDY3LjE0LDY3LjcxLDI1MjAxMjc0CjE3LU1heS0xNyw2OC44OSw2OS4xMCw2Ny40Myw2Ny40OCwzMDU0ODc4MQoxNi1NYXktMTcsNjguMjMsNjkuNDQsNjguMTYsNjkuNDEsMzQ5NTYwMzgKMTUtTWF5LTE3LDY4LjE0LDY4LjQ4LDY3LjU3LDY4LjQzLDMxNTMwMzAxCjEyLU1heS0xNyw2OC42MSw2OC42MSw2OC4wNCw2OC4zOCwxODcxNDEyMwoxMS1NYXktMTcsNjguMzYsNjguNzMsNjguMTIsNjguNDYsMjg3ODk0MTMKMTAtTWF5LTE3LDY4Ljk5LDY5LjU2LDY4LjkyLDY5LjMxLDE3OTc3ODMwCjktTWF5LTE3LDY4Ljg2LDY5LjI4LDY4LjY4LDY5LjA0LDIyODU4NDE0CjgtTWF5LTE3LDY4Ljk3LDY5LjA1LDY4LjQyLDY4Ljk0LDE4NTY2MDg3CjUtTWF5LTE3LDY4LjkwLDY5LjAzLDY4LjQ4LDY5LjAwLDE5MTI4NzgyCjQtTWF5LTE3LDY5LjAzLDY5LjA4LDY4LjY0LDY4LjgxLDIxNzQ5NDA5CjMtTWF5LTE3LDY5LjM4LDY5LjM4LDY4LjcxLDY5LjA4LDI4OTI3OTczCjItTWF5LTE3LDY5LjcxLDY5LjcxLDY5LjEzLDY5LjMwLDIzOTA2MTE5CjEtTWF5LTE3LDY4LjY4LDY5LjU1LDY4LjUwLDY5LjQxLDMxOTU0MzYyCjI4LUFwci0xNyw2OC45MSw2OS4xNCw2Ny42OSw2OC40NiwzOTU0ODgxOAoyNy1BcHItMTcsNjguMTUsNjguMzgsNjcuNTgsNjguMjcsMzQ5NzA5NTMKMjYtQXByLTE3LDY4LjA4LDY4LjMxLDY3LjYyLDY3LjgzLDI2MTkwNzcwCjI1LUFwci0xNyw2Ny45MCw2OC4wNCw2Ny42MCw2Ny45MiwzMDI0MjczMAoyNC1BcHItMTcsNjcuNDgsNjcuNjYsNjcuMTAsNjcuNTMsMjk3Njk5NzYKMjEtQXByLTE3LDY1LjY3LDY2LjcwLDY1LjQ1LDY2LjQwLDMyNTIyNjQ1CjIwLUFwci0xNyw2NS40Niw2NS43NSw2NS4xNCw2NS41MCwyMjI5OTQ3NwoxOS1BcHItMTcsNjUuNjUsNjUuNzUsNjQuODksNjUuMDQsMjY5OTI3NzEKMTgtQXByLTE3LDY1LjMzLDY1LjcxLDY1LjE2LDY1LjM5LDE1MTU1NjExCjE3LUFwci0xNyw2NS4wNCw2NS40OSw2NS4wMSw2NS40OCwxNjY4OTI2NQoxMy1BcHItMTcsNjUuMjksNjUuODYsNjQuOTUsNjQuOTUsMTc4OTY0ODMKMTItQXByLTE3LDY1LjQyLDY1LjUxLDY1LjExLDY1LjIzLDE3MTA4NTEzCjExLUFwci0xNyw2NS42MCw2NS42MSw2NC44NSw2NS40OCwxODc5MTUzMwoxMC1BcHItMTcsNjUuNjEsNjUuODIsNjUuMzYsNjUuNTMsMTc5NTI3NDIKNy1BcHItMTcsNjUuODUsNjUuOTYsNjUuNDQsNjUuNjgsMTQxMDg1MzMKNi1BcHItMTcsNjUuNjAsNjYuMDYsNjUuNDgsNjUuNzMsMTgxMDM0NTMKNS1BcHItMTcsNjYuMzAsNjYuMzUsNjUuNDQsNjUuNTYsMjE0NDg1OTQKNC1BcHItMTcsNjUuMzksNjUuODEsNjUuMjgsNjUuNzMsMTI5OTc0NDkKMy1BcHItMTcsNjUuODEsNjUuOTQsNjUuMTksNjUuNTUsMjA0MDA4NzEKMzEtTWFyLTE3LDY1LjY1LDY2LjE5LDY1LjQ1LDY1Ljg2LDIxMDQwMzMxCjMwLU1hci0xNyw2NS40Miw2NS45OCw2NS4zNiw2NS43MSwxNTEyMjgyMwoyOS1NYXItMTcsNjUuMTIsNjUuNTAsNjQuOTUsNjUuNDcsMTM2MTg0MjQKMjgtTWFyLTE3LDY0Ljk2LDY1LjQ3LDY0LjY1LDY1LjI5LDIwMDgwMzU4CjI3LU1hci0xNyw2NC42Myw2NS4yMiw2NC4zNSw2NS4xMCwxODYxNDY2MgoyNC1NYXItMTcsNjUuMzYsNjUuNDUsNjQuNzYsNjQuOTgsMjI2MTcxMDUKMjMtTWFyLTE3LDY0Ljk0LDY1LjI0LDY0Ljc2LDY0Ljg3LDE5MjY5MjAzCjIyLU1hci0xNyw2NC4xMiw2NS4xNCw2NC4xMiw2NS4wMywyMDY4MDAxNQoyMS1NYXItMTcsNjUuMTksNjUuNTAsNjQuMTMsNjQuMjEsMjY2NDA0ODAKMjAtTWFyLTE3LDY0LjkxLDY1LjE4LDY0LjcyLDY0LjkzLDE0NTk4MDgzCjE3LU1hci0xNyw2NC45MSw2NS4yNCw2NC42OCw2NC44Nyw0OTIxOTY4NgoxNi1NYXItMTcsNjQuNzUsNjQuNzYsNjQuMzAsNjQuNjQsMjA2NzQyOTYKMTUtTWFyLTE3LDY0LjU1LDY0LjkyLDY0LjI1LDY0Ljc1LDI0ODMzODEwCjE0LU1hci0xNyw2NC41Myw2NC41NSw2NC4xNSw2NC40MSwxNDI4MDIwMgoxMy1NYXItMTcsNjUuMDEsNjUuMjAsNjQuNTcsNjQuNzEsMjAxMDAwMzUKMTAtTWFyLTE3LDY1LjExLDY1LjI2LDY0Ljc1LDY0LjkzLDE5NTM4MjQ1CjktTWFyLTE3LDY1LjE5LDY1LjIwLDY0LjQ4LDY0LjczLDE5ODQ2ODMyCjgtTWFyLTE3LDY0LjI2LDY1LjA4LDY0LjI1LDY0Ljk5LDIxNTEwOTA3CjctTWFyLTE3LDY0LjE5LDY0Ljc4LDY0LjE5LDY0LjQwLDE4NTIwOTg3CjYtTWFyLTE3LDYzLjk3LDY0LjU2LDYzLjgxLDY0LjI3LDE4NzUwMjU1CjMtTWFyLTE3LDYzLjk5LDY0LjI4LDYzLjYyLDY0LjI1LDE4MTM5NDA1CjItTWFyLTE3LDY0LjY5LDY0Ljc1LDYzLjg4LDY0LjAxLDI0NTM5NTk3CjEtTWFyLTE3LDY0LjEzLDY0Ljk5LDY0LjAyLDY0Ljk0LDI2OTM3NDU5CjI4LUZlYi0xNyw2NC4wOCw2NC4yMCw2My43Niw2My45OCwyMzIzOTgyNQoyNy1GZWItMTcsNjQuNTQsNjQuNTQsNjQuMDQsNjQuMjMsMTU4NzE1MDcKMjQtRmViLTE3LDY0LjUzLDY0LjgwLDY0LjE0LDY0LjYyLDIxNzk2ODAwCjIzLUZlYi0xNyw2NC40Miw2NC43Myw2NC4yMCw2NC42MiwyMDI3MzEyOAoyMi1GZWItMTcsNjQuMzMsNjQuMzksNjQuMDUsNjQuMzYsMTkyOTI2NTEKMjEtRmViLTE3LDY0LjYxLDY0Ljk1LDY0LjQ1LDY0LjQ5LDIwNjU1ODY5CjE3LUZlYi0xNyw2NC40Nyw2NC42OSw2NC4zMCw2NC42MiwyMTI0ODgxOAoxNi1GZWItMTcsNjQuNzQsNjUuMjQsNjQuNDQsNjQuNTIsMjA1NDYzNDUKMTUtRmViLTE3LDY0LjUwLDY0LjU3LDY0LjE2LDY0LjUzLDE3MDA1MTU3CjE0LUZlYi0xNyw2NC40MSw2NC43Miw2NC4wMiw2NC41NywyMzEwODQyNgoxMy1GZWItMTcsNjQuMjQsNjQuODYsNjQuMTMsNjQuNzIsMjI5MjAxMDEKMTAtRmViLTE3LDY0LjI1LDY0LjMwLDYzLjk4LDY0LjAwLDE4MTcwNzI5CjktRmViLTE3LDYzLjUyLDY0LjQ0LDYzLjMyLDY0LjA2LDIyNjQ0NDQzCjgtRmViLTE3LDYzLjU3LDYzLjgxLDYzLjIyLDYzLjM0LDE4MDk2MzU4CjctRmViLTE3LDYzLjc0LDYzLjc4LDYzLjIzLDYzLjQzLDIwMjc3MjI2CjYtRmViLTE3LDYzLjUwLDYzLjY1LDYzLjE0LDYzLjY0LDE5Nzk2MzYwCjMtRmViLTE3LDYzLjUwLDYzLjcwLDYzLjA3LDYzLjY4LDMwMzAxNzU5CjItRmViLTE3LDYzLjI1LDYzLjQxLDYyLjc1LDYzLjE3LDQ1ODI3MDEzCjEtRmViLTE3LDY0LjM2LDY0LjYyLDYzLjQ3LDYzLjU4LDM5NjcxNTI4CjMxLUphbi0xNyw2NC44Niw2NS4xNSw2NC4yNiw2NC42NSwyNTI3MDU0OQozMC1KYW4tMTcsNjUuNjksNjUuNzksNjQuODAsNjUuMTMsMzE2NTE0NDUKMjctSmFuLTE3LDY1LjM5LDY1LjkxLDY0Ljg5LDY1Ljc4LDQ0ODE3OTcyCjI2LUphbi0xNyw2NC4xMiw2NC41NCw2My41NSw2NC4yNyw0MzU1NDY0NQoyNS1KYW4tMTcsNjMuOTUsNjQuMTAsNjMuNDUsNjMuNjgsMjQ2NTQ5MzMKMjQtSmFuLTE3LDYzLjIwLDYzLjc0LDYyLjk0LDYzLjUyLDI0NjcyOTQwCjIzLUphbi0xNyw2Mi43MCw2My4xMiw2Mi41Nyw2Mi45NiwyMzA5NzU4MQoyMC1KYW4tMTcsNjIuNjcsNjIuODIsNjIuMzcsNjIuNzQsMzAyMTM0NjIKMTktSmFuLTE3LDYyLjI0LDYyLjk4LDYyLjIwLDYyLjMwLDE4NDUxNjU1CjE4LUphbi0xNyw2Mi42Nyw2Mi43MCw2Mi4xMiw2Mi41MCwxOTY3MDEwMgoxNy1KYW4tMTcsNjIuNjgsNjIuNzAsNjIuMDMsNjIuNTMsMjA2NjM5ODMKMTMtSmFuLTE3LDYyLjYyLDYyLjg2LDYyLjM1LDYyLjcwLDE5NDIyMzEwCjEyLUphbi0xNyw2My4wNiw2My40MCw2MS45NSw2Mi42MSwyMDk2ODIyMwoxMS1KYW4tMTcsNjIuNjEsNjMuMjMsNjIuNDMsNjMuMTksMjE1MTczMzUKMTAtSmFuLTE3LDYyLjczLDYzLjA3LDYyLjI4LDYyLjYyLDE4NTkzMDA0CjktSmFuLTE3LDYyLjc2LDYzLjA4LDYyLjU0LDYyLjY0LDIwMzgyNzMwCjYtSmFuLTE3LDYyLjMwLDYzLjE1LDYyLjA0LDYyLjg0LDE5OTIyOTE5CjUtSmFuLTE3LDYyLjE5LDYyLjY2LDYyLjAzLDYyLjMwLDI0ODc1OTY4CjQtSmFuLTE3LDYyLjQ4LDYyLjc1LDYyLjEyLDYyLjMwLDIxMzM5OTY5CjMtSmFuLTE3LDYyLjc5LDYyLjg0LDYyLjEyLDYyLjU4LDIwNjk0MTAxCg==
54
+ http_version:
55
+ recorded_at: Sat, 30 Dec 2017 19:35:33 GMT
56
+ recorded_with: VCR 3.0.3
@@ -0,0 +1,56 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://finance.google.com/finance/historical?enddate=2-Jan-2016&output=csv&q=MSFT&startdate=1-Jan-2016
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.13.1
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - "*/*"
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Content-Type:
22
+ - application/vnd.ms-excel
23
+ Date:
24
+ - Sat, 30 Dec 2017 19:36:58 GMT
25
+ Expires:
26
+ - Sat, 30 Dec 2017 19:36:58 GMT
27
+ Cache-Control:
28
+ - private, max-age=0
29
+ Content-Disposition:
30
+ - attachment; filename="msft.csv"
31
+ X-Content-Type-Options:
32
+ - nosniff
33
+ P3p:
34
+ - CP="This is not a P3P policy! See g.co/p3phelp for more info."
35
+ Transfer-Encoding:
36
+ - chunked
37
+ X-Frame-Options:
38
+ - SAMEORIGIN
39
+ X-Xss-Protection:
40
+ - 1; mode=block
41
+ Server:
42
+ - GSE
43
+ Set-Cookie:
44
+ - NID=120=YtvaW56YwDZZGYcW88rygTBA_H16qooKtQrt3Nk-uczbsuY-uchDhPyTjQMHNS_Qf-X87S6_yIIaUuqbEfgY0h8Kx5QDw9iV6WVi1xZnGPwSSUr7vgltB7OAIUzRPU54;Domain=.google.com;Path=/;Expires=Sun,
45
+ 01-Jul-2018 19:36:58 GMT;HttpOnly
46
+ - SC=RV=:ED=us; expires=Sun, 01-Jul-2018 19:36:58 GMT; path=/finance; domain=.google.com
47
+ Alt-Svc:
48
+ - hq=":443"; ma=2592000; quic=51303431; quic=51303339; quic=51303338; quic=51303337;
49
+ quic=51303335,quic=":443"; ma=2592000; v="41,39,38,37,35"
50
+ body:
51
+ encoding: ASCII-8BIT
52
+ string: !binary |-
53
+ 77u/RGF0ZSxPcGVuLEhpZ2gsTG93LENsb3NlLFZvbHVtZQo=
54
+ http_version:
55
+ recorded_at: Sat, 30 Dec 2017 19:36:58 GMT
56
+ recorded_with: VCR 3.0.3
@@ -0,0 +1,56 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://finance.google.com/finance/historical?enddate=10-Jan-2016&output=csv&q=MSFT&startdate=3-Jan-2016
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.13.1
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - "*/*"
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Content-Type:
22
+ - application/vnd.ms-excel
23
+ Date:
24
+ - Sat, 30 Dec 2017 19:35:33 GMT
25
+ Expires:
26
+ - Sat, 30 Dec 2017 19:35:33 GMT
27
+ Cache-Control:
28
+ - private, max-age=0
29
+ Content-Disposition:
30
+ - attachment; filename="msft.csv"
31
+ X-Content-Type-Options:
32
+ - nosniff
33
+ P3p:
34
+ - CP="This is not a P3P policy! See g.co/p3phelp for more info."
35
+ Transfer-Encoding:
36
+ - chunked
37
+ X-Frame-Options:
38
+ - SAMEORIGIN
39
+ X-Xss-Protection:
40
+ - 1; mode=block
41
+ Server:
42
+ - GSE
43
+ Set-Cookie:
44
+ - NID=120=b5tsAYolKpbrhP2UrQP74cW8tw6gYj26OPr4R0LJ8J62FoUJLti2WapSDHcLcPXr2ddsnYMiuFij66GJfJIHHJ-EH2Bmee9FZ4GTHoGSe0zsrNrH1NN1foP8S4zG-MQG;Domain=.google.com;Path=/;Expires=Sun,
45
+ 01-Jul-2018 19:35:33 GMT;HttpOnly
46
+ - SC=RV=:ED=us; expires=Sun, 01-Jul-2018 19:35:33 GMT; path=/finance; domain=.google.com
47
+ Alt-Svc:
48
+ - hq=":443"; ma=2592000; quic=51303431; quic=51303339; quic=51303338; quic=51303337;
49
+ quic=51303335,quic=":443"; ma=2592000; v="41,39,38,37,35"
50
+ body:
51
+ encoding: ASCII-8BIT
52
+ string: !binary |-
53
+ 77u/RGF0ZSxPcGVuLEhpZ2gsTG93LENsb3NlLFZvbHVtZQo4LUphbi0xNiw1Mi4zNyw1My4yOCw1Mi4xNSw1Mi4zMyw0ODc1Mzk2OQo3LUphbi0xNiw1Mi43MCw1My40OCw1Mi4wNyw1Mi4xNyw1NjU2NDg1Mgo2LUphbi0xNiw1NC4zMiw1NC40MCw1My42NCw1NC4wNSwzOTUxODg2Mwo1LUphbi0xNiw1NC45Myw1NS4zOSw1NC41NCw1NS4wNSwzNDA3OTY3NAo0LUphbi0xNiw1NC4zMiw1NC44MCw1My4zOSw1NC44MCw1Mjg0MzIxMAo=
54
+ http_version:
55
+ recorded_at: Sat, 30 Dec 2017 19:35:33 GMT
56
+ recorded_with: VCR 3.0.3
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+
3
+ describe GoogleFinance::History do
4
+ context 'known symbol', vcr: { cassette_name: 'historical_msft' } do
5
+ subject do
6
+ GoogleFinance::History.get('MSFT')
7
+ end
8
+ it 'retrieves price history' do
9
+ expect(subject.count).to eq 251
10
+ end
11
+ context 'row' do
12
+ let(:price) { subject.first }
13
+ it 'includes details' do
14
+ expect(price).to be_a GoogleFinance::Price
15
+ expect(price.close).to eq 85.54
16
+ expect(price.high).to eq 86.05
17
+ expect(price.low).to eq 85.5
18
+ expect(price.open).to eq 85.63
19
+ expect(price.volume).to eq 18_717_406
20
+ expect(price.date).to eq Date.parse('2017-12-29')
21
+ end
22
+ end
23
+ end
24
+ context 'with custom start and end fields', vcr: { cassette_name: 'historical_msft_with_date_options' } do
25
+ subject do
26
+ GoogleFinance::History.get('MSFT', start_date: Date.parse('2016-01-03'), end_date: Date.parse('2016-01-10'))
27
+ end
28
+ it 'retrieves price history' do
29
+ expect(subject.count).to eq 5
30
+ end
31
+ it 'matches dates' do
32
+ expect(subject.last.date).to eq Date.parse('2016-01-04')
33
+ expect(subject.first.date).to eq Date.parse('2016-01-08')
34
+ end
35
+ end
36
+ context 'on a weekend', vcr: { cassette_name: 'historical_msft_weekend' } do
37
+ subject do
38
+ GoogleFinance::History.get('MSFT', start_date: Date.parse('2016-01-01'), end_date: Date.parse('2016-01-02'))
39
+ end
40
+ it 'retrieves en empty set' do
41
+ expect(subject.count).to eq 0
42
+ end
43
+ end
44
+ context 'unknown symbol', vcr: { cassette_name: 'historical_invalid' } do
45
+ subject do
46
+ GoogleFinance::History.get('INVALID')
47
+ end
48
+ it 'fails with SymbolNotFoundError' do
49
+ expect { subject }.to raise_error GoogleFinance::Errors::SymbolNotFoundError, 'Symbol INVALID Not Found'
50
+ end
51
+ end
52
+ end
@@ -59,6 +59,17 @@ describe GoogleFinance::Prices do
59
59
  expect(subject.last.timezone_offset).to eq -300
60
60
  end
61
61
  end
62
+ context 'intraday', vcr: { cassette_name: 'get_prices_goog_intraday' } do
63
+ subject do
64
+ GoogleFinance::Prices.get('GOOG', i: 60 * 60, p: '1d', f: 'd,c,v,k,o,h,l')
65
+ end
66
+ it 'retrieves intraday price history' do
67
+ expect(subject.exchange).to eq 'NASDAQ'
68
+ expect(subject.interval).to eq 3600
69
+ expect(subject.columns).to eq(%w[date close high low open volume cdays])
70
+ expect(subject.count).to eq 7
71
+ end
72
+ end
62
73
  context 'with few fields', vcr: { cassette_name: 'get_prices_goog_with_few_fields' } do
63
74
  subject do
64
75
  GoogleFinance::Prices.get('GOOG', fields: %i[date close])
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: google-finance-ruby-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Doubrovkine
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-28 00:00:00.000000000 Z
11
+ date: 2017-12-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -145,27 +145,35 @@ files:
145
145
  - lib/google-finance-ruby-client.rb
146
146
  - lib/google-finance/api.rb
147
147
  - lib/google-finance/api/get_prices.rb
148
+ - lib/google-finance/api/historical.rb
148
149
  - lib/google-finance/api/index.rb
149
150
  - lib/google-finance/errors.rb
150
151
  - lib/google-finance/errors/symbol_not_found_error.rb
151
152
  - lib/google-finance/errors/symbols_not_found_error.rb
152
153
  - lib/google-finance/faraday_middleware/preprocessor.rb
154
+ - lib/google-finance/history.rb
153
155
  - lib/google-finance/price.rb
154
156
  - lib/google-finance/prices.rb
155
157
  - lib/google-finance/quote.rb
156
158
  - lib/google-finance/quotes.rb
157
159
  - lib/google-finance/resource.rb
158
160
  - lib/google-finance/version.rb
161
+ - spec/fixtures/google-finance/get_prices_goog_intraday.yml
159
162
  - spec/fixtures/google-finance/get_prices_goog_with_few_fields.yml
160
163
  - spec/fixtures/google-finance/get_prices_goog_with_options.yml
161
164
  - spec/fixtures/google-finance/get_prices_invalid.yml
162
165
  - spec/fixtures/google-finance/get_prices_msft.yml
166
+ - spec/fixtures/google-finance/historical_invalid.yml
167
+ - spec/fixtures/google-finance/historical_msft.yml
168
+ - spec/fixtures/google-finance/historical_msft_weekend.yml
169
+ - spec/fixtures/google-finance/historical_msft_with_date_options.yml
163
170
  - spec/fixtures/google-finance/invalid.yml
164
171
  - spec/fixtures/google-finance/msft.yml
165
172
  - spec/fixtures/google-finance/msft_ab.yml
166
173
  - spec/fixtures/google-finance/msft_ab_invalid.yml
167
174
  - spec/fixtures/google-finance/search_invalid.yml
168
175
  - spec/fixtures/google-finance/search_msft.yml
176
+ - spec/google-finance/history_spec.rb
169
177
  - spec/google-finance/prices_spec.rb
170
178
  - spec/google-finance/quote_spec.rb
171
179
  - spec/google-finance/quotes_spec.rb
@@ -195,18 +203,25 @@ rubyforge_project:
195
203
  rubygems_version: 2.6.12
196
204
  signing_key:
197
205
  specification_version: 4
198
- summary: Google Finance web API ruby client.
206
+ summary: Google Finance web API ruby client with support for retrieving stock quotes
207
+ and historical prices.
199
208
  test_files:
209
+ - spec/fixtures/google-finance/get_prices_goog_intraday.yml
200
210
  - spec/fixtures/google-finance/get_prices_goog_with_few_fields.yml
201
211
  - spec/fixtures/google-finance/get_prices_goog_with_options.yml
202
212
  - spec/fixtures/google-finance/get_prices_invalid.yml
203
213
  - spec/fixtures/google-finance/get_prices_msft.yml
214
+ - spec/fixtures/google-finance/historical_invalid.yml
215
+ - spec/fixtures/google-finance/historical_msft.yml
216
+ - spec/fixtures/google-finance/historical_msft_weekend.yml
217
+ - spec/fixtures/google-finance/historical_msft_with_date_options.yml
204
218
  - spec/fixtures/google-finance/invalid.yml
205
219
  - spec/fixtures/google-finance/msft.yml
206
220
  - spec/fixtures/google-finance/msft_ab.yml
207
221
  - spec/fixtures/google-finance/msft_ab_invalid.yml
208
222
  - spec/fixtures/google-finance/search_invalid.yml
209
223
  - spec/fixtures/google-finance/search_msft.yml
224
+ - spec/google-finance/history_spec.rb
210
225
  - spec/google-finance/prices_spec.rb
211
226
  - spec/google-finance/quote_spec.rb
212
227
  - spec/google-finance/quotes_spec.rb