yahoo_finanza 0.3.2 → 0.4.0
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 +4 -4
- data/lib/yahoo_finanza.rb +2 -2
- data/lib/yahoo_finanza/client.rb +16 -39
- data/lib/yahoo_finanza/parser.rb +25 -5
- data/lib/yahoo_finanza/version.rb +1 -1
- data/lib/yahoo_finanza/workers.rb +97 -0
- metadata +3 -4
- data/lib/yahoo_finanza/finance_utils.rb +0 -47
- data/lib/yahoo_finanza/worker.rb +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2bf5897a7c1dab870202deb24deff1f11ccf4f95
|
4
|
+
data.tar.gz: e9d1bec7671281e049b3eec56e9e06cbf060d67a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e72882fc69bec34b9d0bc566e28296afc789bcb23f15918eb398f2f220fb6490c1b5238bc5e548d97a9eb87e785c86ce44e8c09dce3691084968028fe06dfd70
|
7
|
+
data.tar.gz: 5c4bbe495075825ea6cd03f1d57a5978ec86da5679311b0e153a730515b7eb5d46027ca0dbe032035b57861209533faf522e661b943579497c8dd711e7debe52
|
data/lib/yahoo_finanza.rb
CHANGED
data/lib/yahoo_finanza/client.rb
CHANGED
@@ -1,54 +1,31 @@
|
|
1
|
-
require 'yahoo_finanza/
|
2
|
-
require 'yahoo_finanza/finance_utils'
|
3
|
-
|
4
|
-
require 'yql'
|
5
|
-
require 'json'
|
6
|
-
require 'ostruct'
|
7
|
-
require 'mechanize'
|
1
|
+
require 'yahoo_finanza/workers'
|
8
2
|
|
9
3
|
module YahooFinanza
|
10
4
|
class Client
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
attr_reader :yql, :mecha_yahoo
|
5
|
+
def quote symbol
|
6
|
+
YahooFinanza::SingleQuoteWorker.new(symbol).run
|
7
|
+
end
|
15
8
|
|
16
|
-
def
|
17
|
-
|
18
|
-
@yql.format = 'json'
|
9
|
+
def quotes symbols
|
10
|
+
clean_quotes(YahooFinanza::MultiQuoteWorker.new(symbols).run)
|
19
11
|
end
|
20
12
|
|
21
|
-
def
|
22
|
-
|
23
|
-
query = Yql::QueryBuilder.new 'yahoo.finance.quotes'
|
24
|
-
query.conditions = "symbol in (\"#{symbols.join('\", \"')}\")"
|
25
|
-
@yql.query = query
|
26
|
-
response = @yql.get
|
27
|
-
yahoofy(response.show)
|
13
|
+
def quotes_history symbol, options
|
14
|
+
YahooFinanza::HistoricQuoteWorker.new(symbol, options).run
|
28
15
|
end
|
29
16
|
|
30
|
-
def
|
31
|
-
|
32
|
-
query = Yql::QueryBuilder.new 'yahoo.finance.quotes'
|
33
|
-
query.conditions = "symbol in (\"#{symbol}\")"
|
34
|
-
@yql.query = query
|
35
|
-
response = @yql.get
|
36
|
-
single_yahoofy(response.show)
|
17
|
+
def search_symbols key
|
18
|
+
YahooFinanza::SymbolSearchWorker.new(key).run
|
37
19
|
end
|
38
20
|
|
39
|
-
def
|
40
|
-
|
41
|
-
|
42
|
-
query.conditions = {
|
43
|
-
symbol: symbol, startDate: options[:start_date],
|
44
|
-
endDate: options[:end_date] }
|
45
|
-
@yql.query = query
|
46
|
-
response = @yql.get
|
47
|
-
historical_yahoofy(response.show)
|
21
|
+
def popular_stock_quotes
|
22
|
+
popular_symbols = YahooFinanza::ActiveStockWorker.new.get_active_stocks
|
23
|
+
YahooFinanza::MultiQuoteWorker.new(popular_symbols).run
|
48
24
|
end
|
49
25
|
|
50
|
-
|
51
|
-
|
26
|
+
private
|
27
|
+
def clean_quotes quotes
|
28
|
+
quotes.reject { |quote| quote.ask }
|
52
29
|
end
|
53
30
|
end
|
54
31
|
end
|
data/lib/yahoo_finanza/parser.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'json'
|
2
2
|
require 'ostruct'
|
3
|
+
require 'pry'
|
4
|
+
require 'uri'
|
3
5
|
|
4
6
|
module YahooFinanza
|
5
7
|
module Parser
|
@@ -9,12 +11,16 @@ module YahooFinanza
|
|
9
11
|
json['ResultSet']['Result'].map { |quote| quote['symbol'] }
|
10
12
|
end
|
11
13
|
|
14
|
+
def hash_to_query(hash)
|
15
|
+
URI.encode(hash.map{|k,v| "#{k}=#{v}"}.join("&"))
|
16
|
+
end
|
17
|
+
|
12
18
|
def yahoofy(payload)
|
13
19
|
jsons = JSON.parse(payload)['query']['results']['quote']
|
14
20
|
if jsons.class == Hash && jsons['Name']
|
15
|
-
|
21
|
+
OpenStruct.new(viperize_hash(jsons))
|
16
22
|
elsif jsons.class == Array
|
17
|
-
jsons.map { |symbol| OpenStruct.new(symbol) }
|
23
|
+
jsons.map { |symbol| OpenStruct.new(viperize_hash(symbol)) }
|
18
24
|
else
|
19
25
|
[]
|
20
26
|
end
|
@@ -22,15 +28,29 @@ module YahooFinanza
|
|
22
28
|
|
23
29
|
def single_yahoofy(payload)
|
24
30
|
jsons = JSON.parse(payload)['query']['results']['quote']
|
25
|
-
result = OpenStruct.new(jsons)
|
26
|
-
return
|
31
|
+
result = OpenStruct.new(viperize_hash(jsons))
|
32
|
+
return '' unless result.name
|
27
33
|
result
|
28
34
|
end
|
29
35
|
|
30
36
|
def historical_yahoofy(payload)
|
31
37
|
jsons = JSON.parse(payload)['query']['results']
|
32
38
|
return [] unless jsons
|
33
|
-
jsons['quote'].map { |symbol| OpenStruct.new(symbol) }
|
39
|
+
jsons['quote'].map { |symbol| OpenStruct.new(viperize_hash(symbol)) }
|
40
|
+
end
|
41
|
+
|
42
|
+
def viperize(symbol)
|
43
|
+
word = symbol.to_s.dup
|
44
|
+
word.gsub!(/::/, '/')
|
45
|
+
word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
|
46
|
+
word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
47
|
+
word.tr!("-", "_")
|
48
|
+
word.downcase!
|
49
|
+
word.to_sym
|
50
|
+
end
|
51
|
+
|
52
|
+
def viperize_hash hash
|
53
|
+
hash.map { |key, value| { viperize(key.to_s) => value } }.reduce(:merge)
|
34
54
|
end
|
35
55
|
end
|
36
56
|
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'yahoo_finanza/parser'
|
2
|
+
|
3
|
+
require 'rest-client'
|
4
|
+
require 'mechanize'
|
5
|
+
require 'yql'
|
6
|
+
|
7
|
+
module YahooFinanza
|
8
|
+
|
9
|
+
class BaseWorker
|
10
|
+
attr_accessor :yql
|
11
|
+
include YahooFinanza::Parser
|
12
|
+
include YahooFinanza::Constants
|
13
|
+
|
14
|
+
def invalid_symbol? symbol
|
15
|
+
symbol == '' || !((nyse + nasdaq + amex + sp_500).include? symbol)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class ActiveStockWorker
|
20
|
+
attr_accessor :browser
|
21
|
+
|
22
|
+
def initialize
|
23
|
+
@browser = Mechanize.new
|
24
|
+
end
|
25
|
+
|
26
|
+
def get_active_stocks
|
27
|
+
nasdaq = @browser.get(YahooFinanza::Constants.active_nnm_url).search(".linkb")[0..24]
|
28
|
+
nyse = @browser.get(YahooFinanza::Constants.active_nyse_url).search(".linkb")[0..24]
|
29
|
+
(nasdaq + nyse).map do |stock|
|
30
|
+
stock.text.match(/\(.*?\)/)[0].gsub!("(", "").gsub!(")", "")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class SymbolSearchWorker < BaseWorker
|
36
|
+
def initialize(key)
|
37
|
+
@key = key
|
38
|
+
end
|
39
|
+
|
40
|
+
def run
|
41
|
+
params = { callback: "YAHOO.Finance.SymbolSuggest.ssCallback", query: @key }
|
42
|
+
response = RestClient.get("#{YahooFinanza::Constants.search_url}" + "#{hash_to_query(params)}")
|
43
|
+
parse(response)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class MultiQuoteWorker < BaseWorker
|
48
|
+
def initialize(symbols)
|
49
|
+
@yql = Yql::Client.new(format: 'json')
|
50
|
+
@symbols = symbols
|
51
|
+
end
|
52
|
+
|
53
|
+
def run
|
54
|
+
return [] if @symbols.empty?
|
55
|
+
query = Yql::QueryBuilder.new 'yahoo.finance.quotes'
|
56
|
+
query.conditions = "symbol in (\"#{@symbols.join('\", \"')}\")"
|
57
|
+
@yql.query = query
|
58
|
+
response = @yql.get
|
59
|
+
yahoofy(response.show)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
class SingleQuoteWorker < BaseWorker
|
64
|
+
def initialize(symbol)
|
65
|
+
@yql = Yql::Client.new(format: 'json')
|
66
|
+
@symbol = symbol
|
67
|
+
end
|
68
|
+
|
69
|
+
def run
|
70
|
+
return '' if invalid_symbol? @symbol
|
71
|
+
query = Yql::QueryBuilder.new 'yahoo.finance.quotes'
|
72
|
+
query.conditions = "symbol in (\"#{@symbol}\")"
|
73
|
+
@yql.query = query
|
74
|
+
response = @yql.get
|
75
|
+
single_yahoofy(response.show)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
class HistoricQuoteWorker < BaseWorker
|
80
|
+
def initialize(symbol, opts)
|
81
|
+
@yql = Yql::Client.new(format: 'json')
|
82
|
+
@symbol = symbol
|
83
|
+
@opts = opts
|
84
|
+
end
|
85
|
+
|
86
|
+
def run
|
87
|
+
return [] if (invalid_symbol? @symbol) || @opts.empty?
|
88
|
+
@query = Yql::QueryBuilder.new('yahoo.finance.historicaldata')
|
89
|
+
@query.conditions = {
|
90
|
+
symbol: @symbol, startDate: @opts[:start_date],
|
91
|
+
endDate: @opts[:end_date] }
|
92
|
+
@yql.query = @query
|
93
|
+
response = @yql.get
|
94
|
+
historical_yahoofy(response.show)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yahoo_finanza
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric D. Santos
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-09-
|
12
|
+
date: 2015-09-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: yql
|
@@ -119,12 +119,11 @@ extensions: []
|
|
119
119
|
extra_rdoc_files: []
|
120
120
|
files:
|
121
121
|
- lib/yahoo_finanza.rb
|
122
|
-
- lib/yahoo_finanza/finance_utils.rb
|
123
122
|
- lib/yahoo_finanza/version.rb
|
124
123
|
- lib/yahoo_finanza/parser.rb
|
125
124
|
- lib/yahoo_finanza/client.rb
|
126
125
|
- lib/yahoo_finanza/constants.rb
|
127
|
-
- lib/yahoo_finanza/
|
126
|
+
- lib/yahoo_finanza/workers.rb
|
128
127
|
homepage: https://github.com/cometaworks/yahoo_finanza
|
129
128
|
licenses:
|
130
129
|
- MIT
|
@@ -1,47 +0,0 @@
|
|
1
|
-
require 'ostruct'
|
2
|
-
require 'csv'
|
3
|
-
require 'open-uri'
|
4
|
-
require 'uri'
|
5
|
-
|
6
|
-
require 'yahoo_finanza/parser'
|
7
|
-
|
8
|
-
module YahooFinanza
|
9
|
-
class MarketDoesntExistError < Exception; end
|
10
|
-
|
11
|
-
module FinanceUtils
|
12
|
-
def self.included(base)
|
13
|
-
base.extend(self)
|
14
|
-
end
|
15
|
-
|
16
|
-
def symbols_by_market(market)
|
17
|
-
if [:nyse, :nasdaq, :amex].include? market.to_sym
|
18
|
-
YahooFinanza::Constants.send(market.to_sym)
|
19
|
-
else
|
20
|
-
raise YahooFinanza::MarketDoesntExistError
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def sp_symbols
|
25
|
-
YahooFinanza::Constants.sp_500
|
26
|
-
end
|
27
|
-
|
28
|
-
def all_symbols
|
29
|
-
symbols_by_market('nyse').concat(symbols_by_market('nasdaq'))
|
30
|
-
end
|
31
|
-
|
32
|
-
def search_symbols(key = '')
|
33
|
-
params = { callback: "YAHOO.Finance.SymbolSuggest.ssCallback", query: key }
|
34
|
-
response = RestClient.get("#{YahooFinanza::Constants.search_url}" +
|
35
|
-
"#{hash_to_query(params)}")
|
36
|
-
YahooFinanza::Parser.parse(response)
|
37
|
-
end
|
38
|
-
|
39
|
-
def active_symbols
|
40
|
-
YahooFinanza::Worker.new.get_active_stocks
|
41
|
-
end
|
42
|
-
|
43
|
-
def hash_to_query(hash)
|
44
|
-
URI.encode(hash.map{|k,v| "#{k}=#{v}"}.join("&"))
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
data/lib/yahoo_finanza/worker.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
require 'mechanize'
|
2
|
-
require 'rest-client'
|
3
|
-
|
4
|
-
module YahooFinanza
|
5
|
-
class Worker
|
6
|
-
attr_accessor :browser
|
7
|
-
|
8
|
-
def initialize
|
9
|
-
@browser = Mechanize.new
|
10
|
-
end
|
11
|
-
|
12
|
-
def get_active_stocks
|
13
|
-
nasdaq = @browser.get(YahooFinanza::Constants.active_nnm_url).search(".linkb")[0..24]
|
14
|
-
nyse = @browser.get(YahooFinanza::Constants.active_nyse_url).search(".linkb")[0..24]
|
15
|
-
(nasdaq + nyse).map do |stock|
|
16
|
-
stock.text.match(/\(.*?\)/)[0].gsub!("(", "").gsub!(")", "")
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|