google-finance-ruby-client 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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