yahoo_finanza 0.2.0 → 0.3.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/client.rb +54 -0
- data/lib/yahoo_finanza/constants.rb +35 -0
- data/lib/yahoo_finanza/finance_utils.rb +21 -63
- data/lib/yahoo_finanza/parser.rb +36 -0
- data/lib/yahoo_finanza/version.rb +1 -1
- data/lib/yahoo_finanza/worker.rb +35 -0
- data/lib/yahoo_finanza.rb +3 -55
- metadata +7 -3
- data/lib/yahoo_finanza/yahoo_helpers.rb +0 -45
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: af130ef3ca135486c91cca2ceb3ae2f431162480
|
4
|
+
data.tar.gz: 36af5ea5d997e60d828b365c0b47488fd05f43b0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a651ce4227b9f057b29e83c1e47dd98a25db82888eab8ed5d3d8c6365b96cf98821e96fb49050493ab4e318cdf621ded8ade0b68f5d606dc0a0f837118b2b2cd
|
7
|
+
data.tar.gz: 84e2e7c1cb5ac41bc22cf0e5723acf85edb3a49170411dcb60069ec42927eb5637b4ce8f771fa777e13e18dc14ddef90b7c76331bcefa6528f40dec3a7e809dd
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'yahoo_finanza/parser'
|
2
|
+
require 'yahoo_finanza/finance_utils'
|
3
|
+
|
4
|
+
require 'yql'
|
5
|
+
require 'json'
|
6
|
+
require 'ostruct'
|
7
|
+
require 'mechanize'
|
8
|
+
|
9
|
+
module YahooFinanza
|
10
|
+
class Client
|
11
|
+
include YahooFinanza::FinanceUtils
|
12
|
+
include YahooFinanza::Parser
|
13
|
+
|
14
|
+
attr_reader :yql, :mecha_yahoo
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
@yql = Yql::Client.new
|
18
|
+
@yql.format = 'json'
|
19
|
+
end
|
20
|
+
|
21
|
+
def quotes(symbols)
|
22
|
+
return [] if symbols.empty?
|
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)
|
28
|
+
end
|
29
|
+
|
30
|
+
def quote(symbol)
|
31
|
+
return [] if symbol == ''
|
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)
|
37
|
+
end
|
38
|
+
|
39
|
+
def historical_quotes(symbol, options = {})
|
40
|
+
return [] if symbol == ''
|
41
|
+
query = Yql::QueryBuilder.new 'yahoo.finance.historicaldata'
|
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)
|
48
|
+
end
|
49
|
+
|
50
|
+
def popular_quotes
|
51
|
+
quotes(active_symbols)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require "yaml"
|
2
|
+
|
3
|
+
module YahooFinanza
|
4
|
+
module Constants
|
5
|
+
extend self
|
6
|
+
|
7
|
+
def nyse
|
8
|
+
YAML.load(File.read("config/nyse.yml"))["nyse_symbols"]
|
9
|
+
end
|
10
|
+
|
11
|
+
def amex
|
12
|
+
YAML.load(File.read("config/amex.yml"))["amex_symbols"]
|
13
|
+
end
|
14
|
+
|
15
|
+
def nasdaq
|
16
|
+
YAML.load(File.read("config/nasdaq.yml"))["nasdaq_symbols"]
|
17
|
+
end
|
18
|
+
|
19
|
+
def sp_500
|
20
|
+
YAML.load(File.read("config/sp_500.yml"))["sp_500_symbols"]
|
21
|
+
end
|
22
|
+
|
23
|
+
def active_nyse_url
|
24
|
+
YAML.load(File.read("config/config.yml"))["active_nyse_url"]
|
25
|
+
end
|
26
|
+
|
27
|
+
def active_nnm_url
|
28
|
+
YAML.load(File.read("config/config.yml"))["active_nnm_url"]
|
29
|
+
end
|
30
|
+
|
31
|
+
def search_url
|
32
|
+
YAML.load(File.read("config/config.yml"))["search_url"]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -1,59 +1,28 @@
|
|
1
1
|
require 'ostruct'
|
2
2
|
require 'csv'
|
3
3
|
require 'open-uri'
|
4
|
-
require '
|
4
|
+
require 'uri'
|
5
|
+
|
6
|
+
require 'yahoo_finanza/parser'
|
5
7
|
|
6
8
|
module YahooFinanza
|
7
|
-
|
9
|
+
class MarketDoesntExistError < Exception; end
|
10
|
+
|
8
11
|
module FinanceUtils
|
9
12
|
def self.included(base)
|
10
13
|
base.extend(self)
|
11
14
|
end
|
12
15
|
|
13
|
-
def method_missing(method_sym, *args, &block)
|
14
|
-
if !!(method_sym =~ /'_url'/)
|
15
|
-
"http://www.nasdaq.com/screening/companies-by-name.aspx?letter=0&exchange=#{method_sym}&render=download"
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
%w(nasdaq nyse amex).each do |market_symbol|
|
20
|
-
define_method "#{market_symbol}_url".to_sym do
|
21
|
-
"http://www.nasdaq.com/screening/companies-by-name.aspx?letter=0&exchange=#{market_symbol}&render=download"
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
%w(nnm nyse).each do |market_symbol|
|
26
|
-
define_method "active_#{market_symbol}_url".to_sym do
|
27
|
-
"http://online.wsj.com/mdc/public/page/2_3021-activ#{market_symbol}-actives.html"
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def search_endpoint(key)
|
32
|
-
"http://d.yimg.com/autoc.finance.yahoo.com/autoc?query=#{key}&callback=YAHOO.Finance.SymbolSuggest.ssCallback"
|
33
|
-
end
|
34
|
-
|
35
16
|
def symbols_by_market(market)
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
market_file = open(url)
|
41
|
-
|
42
|
-
CSV.foreach(market_file) do |row|
|
43
|
-
next if row.first == 'Symbol'
|
44
|
-
symbols.push(row.first.gsub(' ', ''))
|
45
|
-
end
|
17
|
+
if [:nyse, :nasdaq, :amex].include? market.to_sym
|
18
|
+
YahooFinanza::Constants.send(market.to_sym)
|
19
|
+
else
|
20
|
+
raise YahooFinanza::MarketDoesntExistError
|
46
21
|
end
|
47
|
-
symbols
|
48
22
|
end
|
49
23
|
|
50
|
-
def sp_symbols
|
51
|
-
|
52
|
-
if response['error']
|
53
|
-
Array.new
|
54
|
-
else
|
55
|
-
response['result']
|
56
|
-
end
|
24
|
+
def sp_symbols
|
25
|
+
YahooFinanza::Constants.sp_500
|
57
26
|
end
|
58
27
|
|
59
28
|
def all_symbols
|
@@ -61,30 +30,19 @@ module YahooFinanza
|
|
61
30
|
end
|
62
31
|
|
63
32
|
def search_symbols(key = '')
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
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)
|
68
37
|
end
|
69
38
|
|
70
39
|
def active_symbols
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
end
|
78
|
-
break unless symbols.count < 8
|
79
|
-
end
|
80
|
-
page2 = mecha_yahoo.get(active_nyse_url)
|
81
|
-
page2.links.each do |link|
|
82
|
-
if link.text.split(" (").count > 1
|
83
|
-
symbols.push(link.text.split(" (")[1].gsub(')', '').strip)
|
84
|
-
end
|
85
|
-
break unless symbols.count < 16
|
86
|
-
end
|
87
|
-
symbols
|
40
|
+
worker = YahooFinanza::Worker.new
|
41
|
+
worker.process_page_2(worker.process_page_1)
|
42
|
+
end
|
43
|
+
|
44
|
+
def hash_to_query(hash)
|
45
|
+
URI.encode(hash.map{|k,v| "#{k}=#{v}"}.join("&"))
|
88
46
|
end
|
89
47
|
end
|
90
48
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
module YahooFinanza
|
5
|
+
module Parser
|
6
|
+
extend self
|
7
|
+
def parse(response)
|
8
|
+
json = JSON.parse(response.gsub(/YAHOO.Finance.SymbolSuggest.ssCallback\(|\)/, ''))
|
9
|
+
json['ResultSet']['Result'].map { |quote| quote['symbol'] }
|
10
|
+
end
|
11
|
+
|
12
|
+
def yahoofy(payload)
|
13
|
+
jsons = JSON.parse(payload)['query']['results']['quote']
|
14
|
+
if jsons.class == Hash && jsons['Name']
|
15
|
+
[OpenStruct.new(jsons)]
|
16
|
+
elsif jsons.class == Array
|
17
|
+
jsons.map { |symbol| OpenStruct.new(symbol) }
|
18
|
+
else
|
19
|
+
[]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def single_yahoofy(payload)
|
24
|
+
jsons = JSON.parse(payload)['query']['results']['quote']
|
25
|
+
result = OpenStruct.new(jsons)
|
26
|
+
return [] unless result.Name
|
27
|
+
result
|
28
|
+
end
|
29
|
+
|
30
|
+
def historical_yahoofy(payload)
|
31
|
+
jsons = JSON.parse(payload)['query']['results']
|
32
|
+
return [] unless jsons
|
33
|
+
jsons['quote'].map { |symbol| OpenStruct.new(symbol) }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,35 @@
|
|
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 process_page_1
|
13
|
+
symbols = []
|
14
|
+
page_1 = @browser.get(YahooFinanza::Constants.active_nnm_url)
|
15
|
+
page_1.links.each do |link|
|
16
|
+
if link.text.split(" (").count > 1
|
17
|
+
symbols.push(link.text.split(" (")[1].gsub(')', '').strip)
|
18
|
+
end
|
19
|
+
break unless symbols.count < 8
|
20
|
+
end
|
21
|
+
symbols
|
22
|
+
end
|
23
|
+
|
24
|
+
def process_page_2(symbols)
|
25
|
+
page_2 = @browser.get(YahooFinanza::Constants.active_nyse_url)
|
26
|
+
page_2.links.each do |link|
|
27
|
+
if link.text.split(" (").count > 1
|
28
|
+
symbols.push(link.text.split(" (")[1].gsub(')', '').strip)
|
29
|
+
end
|
30
|
+
break unless symbols.count < 16
|
31
|
+
end
|
32
|
+
symbols
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/yahoo_finanza.rb
CHANGED
@@ -1,59 +1,7 @@
|
|
1
1
|
require 'yahoo_finanza/version'
|
2
|
-
require 'yahoo_finanza/
|
3
|
-
require 'yahoo_finanza/
|
4
|
-
require '
|
5
|
-
require 'json'
|
6
|
-
require 'ostruct'
|
7
|
-
require 'mechanize'
|
2
|
+
require 'yahoo_finanza/client'
|
3
|
+
require 'yahoo_finanza/constants'
|
4
|
+
require 'yahoo_finanza/worker'
|
8
5
|
|
9
6
|
module YahooFinanza
|
10
|
-
# Yahoo Finanza Client
|
11
|
-
class Client
|
12
|
-
include YahooFinanza::FinanceUtils
|
13
|
-
include YahooFinanza::YahooHelpers
|
14
|
-
|
15
|
-
attr_reader :yql, :mecha_yahoo
|
16
|
-
|
17
|
-
def initialize
|
18
|
-
@yql = Yql::Client.new
|
19
|
-
@yql.format = 'json'
|
20
|
-
end
|
21
|
-
|
22
|
-
def quotes(symbols)
|
23
|
-
return nil if symbols.empty?
|
24
|
-
query = Yql::QueryBuilder.new 'yahoo.finance.quotes'
|
25
|
-
query.conditions = "symbol in (\"#{symbols.join('\", \"')}\")"
|
26
|
-
@yql.query = query
|
27
|
-
response = @yql.get
|
28
|
-
yahoofy(response.show)
|
29
|
-
end
|
30
|
-
|
31
|
-
def quote(symbol)
|
32
|
-
return nil if symbol == ''
|
33
|
-
query = Yql::QueryBuilder.new 'yahoo.finance.quotes'
|
34
|
-
query.conditions = "symbol in (\"#{symbol}\")"
|
35
|
-
@yql.query = query
|
36
|
-
response = @yql.get
|
37
|
-
single_yahoofy(response.show)
|
38
|
-
end
|
39
|
-
|
40
|
-
def historical_quotes(symbol, options = {})
|
41
|
-
return [] if symbol == ''
|
42
|
-
query = Yql::QueryBuilder.new 'yahoo.finance.historicaldata'
|
43
|
-
query.conditions = {
|
44
|
-
symbol: symbol, startDate: options[:start_date],
|
45
|
-
endDate: options[:end_date] }
|
46
|
-
@yql.query = query
|
47
|
-
response = @yql.get
|
48
|
-
historical_yahoofy(response.show)
|
49
|
-
end
|
50
|
-
|
51
|
-
def sp_quotes_top(limit)
|
52
|
-
quotes(sp_symbols(limit))
|
53
|
-
end
|
54
|
-
|
55
|
-
def popular_quotes
|
56
|
-
quotes(active_symbols)
|
57
|
-
end
|
58
|
-
end
|
59
7
|
end
|
metadata
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yahoo_finanza
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric D. Santos
|
8
|
+
- Robert Grayson
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2015-09-
|
12
|
+
date: 2015-09-28 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: yql
|
@@ -120,7 +121,10 @@ files:
|
|
120
121
|
- lib/yahoo_finanza.rb
|
121
122
|
- lib/yahoo_finanza/finance_utils.rb
|
122
123
|
- lib/yahoo_finanza/version.rb
|
123
|
-
- lib/yahoo_finanza/
|
124
|
+
- lib/yahoo_finanza/parser.rb
|
125
|
+
- lib/yahoo_finanza/client.rb
|
126
|
+
- lib/yahoo_finanza/constants.rb
|
127
|
+
- lib/yahoo_finanza/worker.rb
|
124
128
|
homepage: https://github.com/cometaworks/yahoo_finanza
|
125
129
|
licenses:
|
126
130
|
- MIT
|
@@ -1,45 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
require 'ostruct'
|
3
|
-
|
4
|
-
module YahooFinanza
|
5
|
-
# Yahoo Helpers for Yahoo Finanza
|
6
|
-
module YahooHelpers
|
7
|
-
def yahoofy(payload)
|
8
|
-
yahoofied = OpenStruct.new
|
9
|
-
jsons = JSON.parse(payload)['query']['results']['quote']
|
10
|
-
if jsons.class == Hash
|
11
|
-
tmpsym = OpenStruct.new(symbol)
|
12
|
-
if tmpsym.Name
|
13
|
-
yahoofied[tmpsym.symbol] = tmpsym
|
14
|
-
end
|
15
|
-
else
|
16
|
-
jsons.each do |symbol|
|
17
|
-
tmpsym = OpenStruct.new(symbol)
|
18
|
-
if tmpsym.Name
|
19
|
-
yahoofied[tmpsym.symbol] = tmpsym
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
return nil if yahoofied.to_h.keys.empty?
|
24
|
-
yahoofied
|
25
|
-
end
|
26
|
-
|
27
|
-
def single_yahoofy(payload)
|
28
|
-
jsons = JSON.parse(payload)['query']['results']['quote']
|
29
|
-
result = OpenStruct.new(jsons)
|
30
|
-
return nil unless result.Name
|
31
|
-
result
|
32
|
-
end
|
33
|
-
|
34
|
-
def historical_yahoofy(payload)
|
35
|
-
yahoofied = []
|
36
|
-
jsons = JSON.parse(payload)['query']['results']
|
37
|
-
return [] unless jsons
|
38
|
-
jsons['quote'].each do |symbol|
|
39
|
-
tmpsym = OpenStruct.new(symbol)
|
40
|
-
yahoofied << tmpsym
|
41
|
-
end
|
42
|
-
yahoofied
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|