yfinance 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2d0a3c12ae05886b8dfb8a00879173a255c2dd48
4
+ data.tar.gz: cc3e37e7035c61670cb54506ffbb812e35b385b4
5
+ SHA512:
6
+ metadata.gz: ac503ac4209a6655c3403d0d571985414091b2a92ca72d7c4b6523c38bc1f7f28236ba1026039c90b7bb2fed210aca8d14bfb9b485a3a0f2531b98474855b0f4
7
+ data.tar.gz: 4b05bef9b64a64be4396c22100325a06c017e90e6c91df3682abf18bf4c1300c8a564160338b9cd9eef8aade6a35e6b2546815f4bc3aa20f97e18125d4b2ee6b
data/.gitignore ADDED
@@ -0,0 +1,16 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
15
+ timer.rb
16
+ NASDAQ.csv
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in yfinance.gemspec
4
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,11 @@
1
+ guard 'rspec', cmd: "bundle exec rspec" do
2
+ # watch /lib/ files
3
+ watch(%r{^lib/(.+).rb$}) do |m|
4
+ "spec/#{m[1]}_spec.rb"
5
+ end
6
+
7
+ # watch /spec/ files
8
+ watch(%r{^spec/(.+).rb$}) do |m|
9
+ "spec/#{m[1]}.rb"
10
+ end
11
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Alexander Potrykus
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,158 @@
1
+ # Yfinance - Fast Yahoo Finance Wrapper Using Parallel Requests
2
+
3
+ A wrapper of the Yahoo! Finance API in Ruby using parallel HTTP requests. Requesting daily historical stock market prices of 100 companies takes only
4
+ 4.8 seconds on my system - using the usual sequential approach takes 56.4 seconds!
5
+
6
+ ## Installation
7
+
8
+ Add this line to your application's Gemfile:
9
+
10
+ ```ruby
11
+ gem 'yfinance'
12
+ ```
13
+
14
+ And then execute:
15
+
16
+ $ bundle
17
+
18
+ Or install it yourself as:
19
+
20
+ $ gem install yfinance
21
+
22
+ ## Usage
23
+ All methods make use of parallel requests, and therefore should
24
+ be a multitude faster than using normal sequential requests.
25
+
26
+ ### Latest quotes for symbols
27
+ Use the `quotes` method and pass it an array of symbols and
28
+ the list of fields
29
+ ```ruby
30
+ yf = Yfinance.new
31
+ res = yf.quotes(["MSFT", "GOOG"])
32
+ p res[0].symbol # prints "MSFT"
33
+ ```
34
+ Supported fields are:
35
+ ```ruby
36
+ :after_hours_change_real_time
37
+ :annualized_gain
38
+ :ask
39
+ :ask_real_time
40
+ :ask_size
41
+ :average_daily_volume
42
+ :bid
43
+ :bid_real_time
44
+ :bid_size
45
+ :book_value
46
+ :change
47
+ :change_and_percent_change
48
+ :change_from_200_day_moving_average
49
+ :change_from_50_day_moving_average
50
+ :change_from_52_week_high
51
+ :change_From_52_week_low
52
+ :change_in_percent
53
+ :change_percent_realtime
54
+ :change_real_time
55
+ :close
56
+ :comission
57
+ :day_value_change
58
+ :day_value_change_realtime
59
+ :days_range
60
+ :days_range_realtime
61
+ :dividend_pay_date
62
+ :dividend_per_share
63
+ :dividend_yield
64
+ :earnings_per_share
65
+ :ebitda
66
+ :eps_estimate_current_year
67
+ :eps_estimate_next_quarter
68
+ :eps_estimate_next_year
69
+ :error_indicator
70
+ :ex_dividend_date
71
+ :float_shares
72
+ :high
73
+ :high_52_weeks
74
+ :high_limit
75
+ :holdings_gain
76
+ :holdings_gain_percent
77
+ :holdings_gain_percent_realtime
78
+ :holdings_gain_realtime
79
+ :holdings_value
80
+ :holdings_value_realtime
81
+ :last_trade_date
82
+ :last_trade_price
83
+ :last_trade_realtime_withtime
84
+ :last_trade_size
85
+ :last_trade_time
86
+ :last_trade_with_time
87
+ :low
88
+ :low_52_weeks
89
+ :low_limit
90
+ :market_cap_realtime
91
+ :market_capitalization
92
+ :more_info
93
+ :moving_average_200_day
94
+ :moving_average_50_day
95
+ :name
96
+ :notes
97
+ :one_year_target_price
98
+ :open
99
+ :order_book
100
+ :pe_ratio
101
+ :pe_ratio_realtime
102
+ :peg_ratio
103
+ :percent_change_from_200_day_moving_average
104
+ :percent_change_from_50_day_moving_average
105
+ :percent_change_from_52_week_high
106
+ :percent_change_from_52_week_low
107
+ :previous_close
108
+ :price_eps_estimate_current_year
109
+ :price_eps_Estimate_next_year
110
+ :price_paid
111
+ :price_per_book
112
+ :price_per_sales
113
+ :shares_owned
114
+ :short_ratio
115
+ :stock_exchange
116
+ :symbol
117
+ :ticker_trend
118
+ :trade_date
119
+ :trade_links
120
+ :volume
121
+ :weeks_range_52
122
+ ```
123
+
124
+ ### Getting historical data for a set of symbols
125
+ Pass an array of symbols and the date range to the Yfinance method `add_historical_data_query`
126
+ ```ruby
127
+ symbols = ['AAPL', 'MSFT', 'GOOG']
128
+ result = Proc.new { |response| p response}
129
+ yf = Yfinance.new
130
+ yf.add_historical_data_query(symbols, '1971-12-30', '2014-09-17', {period: :daily}, &result)
131
+ yf.run
132
+ ```
133
+ The period can be specified as `:daily, :monthly, :weekly, :dividends`.
134
+
135
+ ### Changing the number of concurrent requests
136
+ This is done in the initializer:
137
+ ```ruby
138
+ Yfinance.new(max_concurrency: 50) # default 20
139
+ ```
140
+ Don't set this too high, otherwise Yahoo might block any further requests.
141
+
142
+ ### Autocomplete symbols
143
+ Use the `read_symbols` method
144
+ ```ruby
145
+ query = "yahoo"
146
+ yf = Yfinance.new
147
+ yf.read_symbols(query) do |res|
148
+ p res
149
+ end
150
+ ```
151
+
152
+ ### Memoization
153
+ Requests can be memoized during a single run call. Enable memoization in the initializer:
154
+ ```ruby
155
+ yf = Yfinance.new(memoize: true) # default is 'false'
156
+ ```
157
+
158
+
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ # Default directory to look in is `/specs`
5
+ # Run with `rake spec`
6
+ RSpec::Core::RakeTask.new(:spec) do |task|
7
+ task.rspec_opts = ['--color', '--format', 'nested']
8
+ end
9
+
10
+ task :default => :spec
11
+
data/lib/yfinance.rb ADDED
@@ -0,0 +1,192 @@
1
+ require 'csv'
2
+ require 'typhoeus'
3
+ require 'JSON'
4
+ require 'ostruct'
5
+
6
+ class Yfinance
7
+
8
+ class YahooFinanceException < Exception
9
+ end
10
+
11
+ class SymbolNotFoundException < YahooFinanceException
12
+ end
13
+
14
+ COLUMNS = {
15
+ :ask => "a",
16
+ :average_daily_volume => "a2",
17
+ :ask_size => "a5",
18
+ :bid => "b",
19
+ :ask_real_time => "b2",
20
+ :bid_real_time => "b3",
21
+ :book_value => "b4",
22
+ :bid_size => "b6",
23
+ :change_and_percent_change => "c",
24
+ :change => "c1",
25
+ :comission => "c3",
26
+ :change_real_time => "c6",
27
+ :after_hours_change_real_time => "c8",
28
+ :dividend_per_share => "d",
29
+ :last_trade_date => "d1",
30
+ :trade_date => "d2",
31
+ :earnings_per_share => "e",
32
+ :error_indicator => "e1",
33
+ :eps_estimate_current_year => "e7",
34
+ :eps_estimate_next_year => "e8",
35
+ :eps_estimate_next_quarter => "e9",
36
+ :float_shares => "f6",
37
+ :low => "g",
38
+ :high => "h",
39
+ :low_52_weeks => "j",
40
+ :high_52_weeks => "k",
41
+ :holdings_gain_percent => "g1",
42
+ :annualized_gain => "g3",
43
+ :holdings_gain => "g4",
44
+ :holdings_gain_percent_realtime => "g5",
45
+ :holdings_gain_realtime => "g6",
46
+ :more_info => "i",
47
+ :order_book => "i5",
48
+ :market_capitalization => "j1",
49
+ :market_cap_realtime => "j3",
50
+ :ebitda => "j4",
51
+ :change_From_52_week_low => "j5",
52
+ :percent_change_from_52_week_low => "j6",
53
+ :last_trade_realtime_withtime => "k1",
54
+ :change_percent_realtime => "k2",
55
+ :last_trade_size => "k3",
56
+ :change_from_52_week_high => "k4",
57
+ :percent_change_from_52_week_high => "k5",
58
+ :last_trade_with_time => "l",
59
+ :last_trade_price => "l1",
60
+ :close => "l1",
61
+ :high_limit => "l2",
62
+ :low_limit => "l3",
63
+ :days_range => "m",
64
+ :days_range_realtime => "m2",
65
+ :moving_average_50_day => "m3",
66
+ :moving_average_200_day => "m4",
67
+ :change_from_200_day_moving_average => "m5",
68
+ :percent_change_from_200_day_moving_average => "m6",
69
+ :change_from_50_day_moving_average => "m7",
70
+ :percent_change_from_50_day_moving_average => "m8",
71
+ :name => "n",
72
+ :notes => "n4",
73
+ :open => "o",
74
+ :previous_close => "p",
75
+ :price_paid => "p1",
76
+ :change_in_percent => "p2",
77
+ :price_per_sales => "p5",
78
+ :price_per_book => "p6",
79
+ :ex_dividend_date => "q",
80
+ :pe_ratio => "r",
81
+ :dividend_pay_date => "r1",
82
+ :pe_ratio_realtime => "r2",
83
+ :peg_ratio => "r5",
84
+ :price_eps_estimate_current_year => "r6",
85
+ :price_eps_Estimate_next_year => "r7",
86
+ :symbol => "s",
87
+ :shares_owned => "s1",
88
+ :short_ratio => "s7",
89
+ :last_trade_time => "t1",
90
+ :trade_links => "t6",
91
+ :ticker_trend => "t7",
92
+ :one_year_target_price => "t8",
93
+ :volume => "v",
94
+ :holdings_value => "v1",
95
+ :holdings_value_realtime => "v7",
96
+ :weeks_range_52 => "w",
97
+ :day_value_change => "w1",
98
+ :day_value_change_realtime => "w4",
99
+ :stock_exchange => "x",
100
+ :dividend_yield => "y",
101
+ :adjusted_close => nil
102
+ }
103
+
104
+ HISTORICAL_MODES = {
105
+ :daily => "d",
106
+ :weekly => "w",
107
+ :monthly => "m",
108
+ :dividends_only => "v"
109
+ }
110
+
111
+ def initialize(max_concurrency: 20, memoize: false)
112
+ @hydra = Typhoeus::Hydra.new(max_concurrency: max_concurrency)
113
+ Typhoeus::Config.memoize = memoize
114
+ end
115
+
116
+ def run
117
+ @hydra.run
118
+ end
119
+
120
+ def add_historical_data_query(symbols_array, start_date, end_date, options={}, &callback)
121
+ start_date = Date.parse(start_date) unless start_date.is_a?(Date)
122
+ end_date = Date.parse(end_date) unless end_date.is_a?(Date)
123
+ options = {}
124
+ options[:raw] ||= true
125
+ options[:period] ||= :daily
126
+ symbols_array.each do |symbol|
127
+ symbol = symbol.rstrip
128
+ url = "http://ichart.finance.yahoo.com/table.csv?s=#{URI.escape(symbol)}&d=#{end_date.month-1}&e=#{end_date.day}&f=#{end_date.year}&g=#{HISTORICAL_MODES[options[:period]]}&a=#{start_date.month-1}&b=#{start_date.day}&c=#{start_date.year}&ignore=.csv"
129
+ @hydra.queue(make_request(url, symbol, options, callback))
130
+ end
131
+ end
132
+
133
+ def read_symbols(query, &callback)
134
+ url = "http://d.yimg.com/autoc.finance.yahoo.com/autoc?query=#{query}&callback=YAHOO.Finance.SymbolSuggest.ssCallback"
135
+ request = Typhoeus::Request.new(url, method: :get)
136
+ request.on_complete do |response|
137
+ body = response.body
138
+ body.sub!('YAHOO.Finance.SymbolSuggest.ssCallback(', '').chomp!(')')
139
+ json_result = JSON.parse(body)
140
+ callback.call(json_result["ResultSet"]["Result"])
141
+ end
142
+ @hydra.queue(request)
143
+ @hydra.run
144
+ end
145
+
146
+ def quotes(symbols_array, columns_array = [:symbol, :last_trade_price, :last_trade_date, :change, :previous_close], options = {})
147
+ options[:raw] ||= true
148
+ ret = []
149
+ symb_str = symbols_array.join("+")
150
+ columns = "#{columns_array.map {|col| COLUMNS[col] }.join('')}"
151
+ url = "http://download.finance.yahoo.com/d/quotes.csv?s=#{URI.escape(symb_str)}&f=#{columns}"
152
+ request = Typhoeus::Request.new(url, method: :get)
153
+ request.on_complete do |response|
154
+ result = CSV.parse(response.body, headers: columns_array)
155
+ result.each do |row|
156
+ ret << OpenStruct.new(row.to_hash)
157
+ end
158
+ return ret
159
+ end
160
+ @hydra.queue(request)
161
+ @hydra.run
162
+ end
163
+
164
+ private
165
+
166
+ def make_request(url, symbol, options, callback)
167
+ request = Typhoeus::Request.new(url, method: :get)
168
+ cols =
169
+ if options[:period] == :dividends_only
170
+ [:dividend_pay_date, :dividend_yield]
171
+ else
172
+ [:trade_date, :open, :high, :low, :close, :volume, :adjusted_close]
173
+ end
174
+ request.on_complete do |response|
175
+ if response.code == 200
176
+ if response.body[0..40] != "Date,Open,High,Low,Close,Volume,Adj Close"
177
+ raise YahooFinanceException.new(" * Error: Unknown response body from Yahoo - #{ response.body[0..40] } ...")
178
+ else
179
+ result = CSV.parse(response.body, headers: cols)
180
+ result.delete(0)
181
+ callback.call(result)
182
+ end
183
+ elsif response.code == 404
184
+ raise SymbolNotFoundException.new("#{symbol} not found at Yahoo")
185
+ else
186
+ raise YahooFinanceException.new("Error communicating with Yahoo. Response code #{ response.code }. URL: " + "#{ url }. Response: #{ response.inspect }")
187
+ end
188
+ end
189
+ request
190
+ end
191
+
192
+ end
@@ -0,0 +1,2 @@
1
+ require 'pry'
2
+ require 'Yfinance'
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ describe Yfinance do
4
+
5
+ it 'downloads historical data' do
6
+ symbols = CSV.read('NASDAQ.csv').flatten[0,2]
7
+ result = Proc.new { |response| expect(response).not_to be nil}
8
+ yf = Yfinance.new
9
+ yf.add_historical_data_query(symbols, '1971-12-30', '2014-09-17', {period: :weekly}, &result)
10
+ yf.run
11
+ end
12
+
13
+ it "fetches matching symbols" do
14
+ query = "yahoo"
15
+ yf = Yfinance.new
16
+ yf.read_symbols(query) do |res|
17
+ expect(res).not_to be nil
18
+ end
19
+ end
20
+
21
+ it "retrieves quote data" do
22
+ yf = Yfinance.new
23
+ res = yf.quotes(["MSFT", "GOOG"])
24
+ expect(res[0].symbol).to eql('MSFT')
25
+ expect(res[1].symbol).to eql('GOOG')
26
+ end
27
+
28
+ end
data/yfinance.gemspec ADDED
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'yfinance'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "yfinance"
8
+ spec.version = "1.0.0"
9
+ spec.authors = ["Alexander Potrykus"]
10
+ spec.email = ["alexander@risklog.io"]
11
+ spec.summary = %q{Fetches Yahoo! Finance data using parallel HTTP requests.}
12
+ spec.description = %q{Uses Typhoeus to make HTTP requests to the Yahoo! Finance API in parallel. }
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.7"
22
+ spec.add_development_dependency "rake", "~> 10.0"
23
+ spec.add_development_dependency "rspec"
24
+ spec.add_development_dependency "rspec-nc"
25
+ spec.add_development_dependency "guard"
26
+ spec.add_development_dependency "guard-rspec"
27
+ spec.add_development_dependency "pry"
28
+ spec.add_development_dependency "pry-remote"
29
+ spec.add_development_dependency "pry-nav"
30
+ spec.add_development_dependency "typhoeus"
31
+ end
metadata ADDED
@@ -0,0 +1,196 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: yfinance
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Alexander Potrykus
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-09-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec-nc
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: guard
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: guard-rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: pry-remote
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: pry-nav
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: typhoeus
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ description: 'Uses Typhoeus to make HTTP requests to the Yahoo! Finance API in parallel. '
154
+ email:
155
+ - alexander@risklog.io
156
+ executables: []
157
+ extensions: []
158
+ extra_rdoc_files: []
159
+ files:
160
+ - ".gitignore"
161
+ - Gemfile
162
+ - Guardfile
163
+ - LICENSE.txt
164
+ - README.md
165
+ - Rakefile
166
+ - lib/yfinance.rb
167
+ - spec/spec_helper.rb
168
+ - spec/yfinance_spec.rb
169
+ - yfinance.gemspec
170
+ homepage: ''
171
+ licenses:
172
+ - MIT
173
+ metadata: {}
174
+ post_install_message:
175
+ rdoc_options: []
176
+ require_paths:
177
+ - lib
178
+ required_ruby_version: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - ">="
181
+ - !ruby/object:Gem::Version
182
+ version: '0'
183
+ required_rubygems_version: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ requirements: []
189
+ rubyforge_project:
190
+ rubygems_version: 2.2.2
191
+ signing_key:
192
+ specification_version: 4
193
+ summary: Fetches Yahoo! Finance data using parallel HTTP requests.
194
+ test_files:
195
+ - spec/spec_helper.rb
196
+ - spec/yfinance_spec.rb