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 +4 -4
- data/.rubocop_todo.yml +9 -7
- data/CHANGELOG.md +5 -1
- data/README.md +42 -5
- data/google-finance-ruby-client.gemspec +1 -1
- data/lib/google-finance-ruby-client.rb +2 -0
- data/lib/google-finance/api.rb +1 -0
- data/lib/google-finance/api/get_prices.rb +4 -2
- data/lib/google-finance/api/historical.rb +24 -0
- data/lib/google-finance/history.rb +35 -0
- data/lib/google-finance/prices.rb +1 -1
- data/lib/google-finance/version.rb +1 -1
- data/spec/fixtures/google-finance/get_prices_goog_intraday.yml +68 -0
- data/spec/fixtures/google-finance/historical_invalid.yml +53 -0
- data/spec/fixtures/google-finance/historical_msft.yml +56 -0
- data/spec/fixtures/google-finance/historical_msft_weekend.yml +56 -0
- data/spec/fixtures/google-finance/historical_msft_with_date_options.yml +56 -0
- data/spec/google-finance/history_spec.rb +52 -0
- data/spec/google-finance/prices_spec.rb +11 -0
- metadata +18 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6b43a8f6bffc4ab128fcd6dad74ae82ff2684ecb
|
4
|
+
data.tar.gz: 8ddc90677f6cfc479e7e10f6cb50c177c1bab040
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d406664a6436ac69a23e660dd7e194c1263fb5a7653a72d6ed6c69af43e7141322815f43c5941492ed5f6ddf24710aa7d4adf330f1bb6a5e695dccc817fcd4cf
|
7
|
+
data.tar.gz: 0c102d2c49609785c9adf28de80fe6d3e7e1e03a785aa6b14efda1779c30589501f1d9252cef288b1e886692f6ac4db8d0d925f282b8d74b49d621eacb5659da
|
data/.rubocop_todo.yml
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# This configuration was generated by
|
2
2
|
# `rubocop --auto-gen-config`
|
3
|
-
# on 2017-12-
|
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:
|
27
|
+
# Offense count: 4
|
28
28
|
Metrics/AbcSize:
|
29
29
|
Max: 77
|
30
30
|
|
31
|
-
# Offense count:
|
31
|
+
# Offense count: 6
|
32
32
|
# Configuration parameters: CountComments, ExcludedMethods.
|
33
33
|
Metrics/BlockLength:
|
34
|
-
Max:
|
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:
|
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:
|
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:
|
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'
|
data/CHANGELOG.md
CHANGED
@@ -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):
|
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
|
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
|
-
|
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
|
124
|
+
Retrieve intraday prices in 1 hour intervals.
|
90
125
|
|
91
126
|
```ruby
|
92
|
-
prices = GoogleFinance::Prices.get('GOOG', interval: 60 * 60, period: '
|
127
|
+
prices = GoogleFinance::Prices.get('GOOG', interval: 60 * 60, period: '1d')
|
128
|
+
|
129
|
+
prices.count # 7
|
93
130
|
|
94
|
-
prices
|
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'
|
data/lib/google-finance/api.rb
CHANGED
@@ -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
|
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)
|
@@ -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.
|
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-
|
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
|