jamrock_stocks 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/jamrock_stocks.rb +8 -4
- data/lib/jamrock_stocks/brokers/mayberry.rb +79 -0
- data/lib/jamrock_stocks/stock.rb +3 -2
- data/lib/jamrock_stocks/version.rb +1 -1
- data/spec/jamrock_stocks_spec.rb +4 -25
- metadata +3 -4
- data/lib/jamrock_stocks/stock_config.rb +0 -14
- data/lib/jamrock_stocks/stock_parser.rb +0 -47
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7fff9201e6d946b2048caee7d62b83e4e0ea6d21
|
4
|
+
data.tar.gz: 04f3c656d4295d90e8e0058183e284b1b0abe793
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d8efaa4916c5e751167f7985ed27fd03c9582a982220cfad8946f47a4e772f22250e9e3abf1b7baf8a193a188368ce13ff8664042bb80749058d86b7cdc83b63
|
7
|
+
data.tar.gz: 463484d86ecf427d34311efa210f8541b6eb4fe10c45294be3aa5efa18690ef7ce83371aeb444038be687950995bc0b128b288c7c588e451703a848400025e21
|
data/lib/jamrock_stocks.rb
CHANGED
@@ -1,16 +1,20 @@
|
|
1
1
|
require 'jamrock_stocks/version'
|
2
2
|
require 'jamrock_stocks/stock'
|
3
|
-
require 'jamrock_stocks/
|
4
|
-
require 'jamrock_stocks/stock_parser'
|
3
|
+
# require 'jamrock_stocks/mayberry'
|
5
4
|
require 'pry'
|
5
|
+
require 'time'
|
6
6
|
require 'nokogiri'
|
7
7
|
require 'open-uri'
|
8
8
|
|
9
|
+
# Brokers are automatically loaded
|
10
|
+
brokers_paths = File.join(File.dirname(__FILE__), 'jamrock_stocks', 'brokers', '*.rb')
|
11
|
+
Dir[brokers_paths].each { |file| require file }
|
12
|
+
|
9
13
|
module JamrockStocks
|
10
14
|
class StockClient
|
11
15
|
|
12
|
-
def self.
|
13
|
-
|
16
|
+
def self.stocks
|
17
|
+
Mayberry.new.stocks
|
14
18
|
end
|
15
19
|
|
16
20
|
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module JamrockStocks
|
2
|
+
class Mayberry
|
3
|
+
attr_reader :page, :change_and_volume, :stock_prices, :stock_symbols
|
4
|
+
|
5
|
+
STRING_NO_SPACE = ''
|
6
|
+
REGEXP_DOLLAR_SIGN = /\$/
|
7
|
+
REGEXP_NON_BREAKING_SPACE = /\u00a0/
|
8
|
+
|
9
|
+
STOCKS_URL = 'https://www.mayberryinv.com/PhysicalPages/Ticker/TickerDataSource.aspx'
|
10
|
+
TRADES_URL = 'https://www.mayberryinv.com/PhysicalPages/Ticker/TickerTradeDataSource.aspx'
|
11
|
+
BASE_HTML_PATH = 'span#TickerSpan > table > tr > td > table > tr > td > table >'
|
12
|
+
SYMBOLS_HTML_PATH = "#{BASE_HTML_PATH} tr[2] > td > strong > span[1]"
|
13
|
+
PRICE_HTML_PATH = "#{BASE_HTML_PATH} tr[2] > td > strong > span[2]"
|
14
|
+
CHANGE_AND_VOLUME_HTML_PATH = "#{BASE_HTML_PATH} tr[4] > td > strong"
|
15
|
+
TIME_HTML_PATH = 'span#TickerSpan > table > tr > td > table > tr > td[2] > span#LabelSummaryTime'
|
16
|
+
TRADES_HTML_PATH = 'span#TickerTradeDataSpan > table > tr > td'
|
17
|
+
|
18
|
+
|
19
|
+
def stocks
|
20
|
+
@stocks ||= fetch_stocks
|
21
|
+
end
|
22
|
+
|
23
|
+
def clear_stocks
|
24
|
+
@stocks = nil
|
25
|
+
end
|
26
|
+
|
27
|
+
def clear_page
|
28
|
+
@pate = nil
|
29
|
+
end
|
30
|
+
|
31
|
+
def reset
|
32
|
+
clear_stocks
|
33
|
+
clear_page
|
34
|
+
end
|
35
|
+
|
36
|
+
def fetch_stocks
|
37
|
+
reset
|
38
|
+
stocks = []
|
39
|
+
stock_symbols.count.times do |index|
|
40
|
+
stocks << Stock.new(symbol: stock_symbols[index],
|
41
|
+
price: stock_prices[index].to_f,
|
42
|
+
change: change_and_volume[index][0].to_f,
|
43
|
+
volume: change_and_volume[index][1].to_i,
|
44
|
+
updated_at: updated_at)
|
45
|
+
end
|
46
|
+
stocks
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def page
|
53
|
+
@page ||= Nokogiri::HTML(open(STOCKS_URL))
|
54
|
+
end
|
55
|
+
|
56
|
+
def updated_at
|
57
|
+
date, time = page.css(TIME_HTML_PATH).map { |dt| dt.text.gsub(REGEXP_NON_BREAKING_SPACE, ' ').split[0..1] }.flatten
|
58
|
+
Time.parse("#{date} #{time}")
|
59
|
+
end
|
60
|
+
|
61
|
+
def stock_symbols
|
62
|
+
@stock_symbols ||= page.css(SYMBOLS_HTML_PATH).map { |s| s.text.strip.upcase }.compact
|
63
|
+
end
|
64
|
+
|
65
|
+
def stock_prices
|
66
|
+
@stock_prices ||= page.css(PRICE_HTML_PATH).map { |p| p.text.strip.gsub(REGEXP_DOLLAR_SIGN, Mayberry::STRING_NO_SPACE) }
|
67
|
+
end
|
68
|
+
|
69
|
+
def change_and_volume
|
70
|
+
@change_and_volume ||= page.css(CHANGE_AND_VOLUME_HTML_PATH).
|
71
|
+
map { |cv| cv.text.gsub!(REGEXP_NON_BREAKING_SPACE, ' ').
|
72
|
+
sub(/\s/, Mayberry::STRING_NO_SPACE).
|
73
|
+
sub('CHG:$', Mayberry::STRING_NO_SPACE).
|
74
|
+
sub('VOL:', Mayberry::STRING_NO_SPACE).
|
75
|
+
sub(',', Mayberry::STRING_NO_SPACE).split(/\s\s/) }
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
data/lib/jamrock_stocks/stock.rb
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
module JamrockStocks
|
2
2
|
class Stock
|
3
3
|
|
4
|
-
attr_reader :symbol, :price, :change, :volume, :previous_price
|
4
|
+
attr_reader :symbol, :price, :change, :volume, :previous_price, :updated_at
|
5
5
|
|
6
|
-
def initialize(symbol:, price:, change: 0.0, volume: 0)
|
6
|
+
def initialize(symbol:, price:, change: 0.0, volume: 0, updated_at:)
|
7
7
|
@symbol = symbol.to_str.upcase
|
8
8
|
@price = price.to_f
|
9
9
|
@change = change.to_f
|
10
10
|
@volume = volume.to_int
|
11
11
|
@previous_price = @price - (@change)
|
12
|
+
@updated_at = updated_at
|
12
13
|
end
|
13
14
|
|
14
15
|
def percentage_change
|
data/spec/jamrock_stocks_spec.rb
CHANGED
@@ -2,31 +2,10 @@ require 'rspec'
|
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
4
|
describe 'Stock' do
|
5
|
-
|
6
|
-
it 'should not retrieve an invalid stock' do
|
7
|
-
result = StockClient.fetch_stocks symbols:['MILSS']
|
8
|
-
expect(result[:stocks]).to be_empty
|
9
|
-
expect(result[:stocks].count).to eq(0)
|
10
|
-
end
|
11
|
-
|
12
|
-
it 'should retrieve a single stock' do
|
13
|
-
result = StockClient.fetch_stocks symbols:['MIL']
|
14
|
-
expect(result[:stocks]).not_to be_empty
|
15
|
-
expect(result[:stocks].count).to eq(1)
|
16
|
-
expect(result[:stocks].first.symbol).to eq('MIL')
|
17
|
-
expect(result[:stocks].first.symbol).to eq('MIL')
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'should retrieve 3 stocks' do
|
21
|
-
result = StockClient.fetch_stocks symbols:['MIL','BRG', 'BPOW', 'PEMP']
|
22
|
-
expect(result[:stocks]).not_to be_empty
|
23
|
-
expect(result[:stocks].count).to eq(3)
|
24
|
-
expect(result[:stocks].last.symbol).to eq('BPOW')
|
25
|
-
end
|
26
|
-
|
27
5
|
it 'should retrieve all stocks' do
|
28
|
-
|
29
|
-
expect(
|
30
|
-
expect(
|
6
|
+
stocks = StockClient.stocks
|
7
|
+
expect(stocks).not_to be_empty
|
8
|
+
expect(stocks.count).to eq(60)
|
9
|
+
expect(%w(BRG CBNY CAR CCC) - stocks.map{ |s| s.symbol } ).to be_empty
|
31
10
|
end
|
32
11
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jamrock_stocks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevon Green
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-12-
|
11
|
+
date: 2014-12-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -97,9 +97,8 @@ files:
|
|
97
97
|
- bin/rspec
|
98
98
|
- jamrock_stocks.gemspec
|
99
99
|
- lib/jamrock_stocks.rb
|
100
|
+
- lib/jamrock_stocks/brokers/mayberry.rb
|
100
101
|
- lib/jamrock_stocks/stock.rb
|
101
|
-
- lib/jamrock_stocks/stock_config.rb
|
102
|
-
- lib/jamrock_stocks/stock_parser.rb
|
103
102
|
- lib/jamrock_stocks/version.rb
|
104
103
|
- spec/jamrock_stocks_spec.rb
|
105
104
|
- spec/spec_helper.rb
|
@@ -1,14 +0,0 @@
|
|
1
|
-
module JamrockStocks
|
2
|
-
module StockConfig
|
3
|
-
STOCKS_URL = 'https://www.mayberryinv.com/PhysicalPages/Ticker/TickerDataSource.aspx'
|
4
|
-
TRADES_URL = 'https://www.mayberryinv.com/PhysicalPages/Ticker/TickerTradeDataSource.aspx'
|
5
|
-
|
6
|
-
BASE_HTML_PATH = 'span#TickerSpan > table > tr > td > table > tr > td > table >'
|
7
|
-
SYMBOLS_HTML_PATH = "#{BASE_HTML_PATH} tr[2] > td > strong > span[1]"
|
8
|
-
PRICE_HTML_PATH = "#{BASE_HTML_PATH} tr[2] > td > strong > span[2]"
|
9
|
-
CHANGE_AND_VOLUME_HTML_PATH = "#{BASE_HTML_PATH} tr[4] > td > strong"
|
10
|
-
TIME_HTML_PATH = 'span#TickerSpan > table > tr > td > table > tr > td[2] > span#LabelSummaryTime'
|
11
|
-
|
12
|
-
TRADES_HTML_PATH = 'span#TickerTradeDataSpan > table > tr > td'
|
13
|
-
end
|
14
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
module JamrockStocks
|
2
|
-
class StockParser
|
3
|
-
|
4
|
-
include JamrockStocks::StockConfig
|
5
|
-
|
6
|
-
STRING_NO_SPACE = ''
|
7
|
-
REGEXP_DOLLAR_SIGN = /\$/
|
8
|
-
REGEXP_NON_BREAKING_SPACE = /\u00a0/
|
9
|
-
|
10
|
-
def fetch_stocks(symbols:[])
|
11
|
-
stocks = []
|
12
|
-
page = Nokogiri::HTML(open(StockConfig::STOCKS_URL))
|
13
|
-
stocks_symbols = page.css(StockConfig::SYMBOLS_HTML_PATH).map { |s| s.text.strip.upcase }
|
14
|
-
date, time = page.css(StockConfig::TIME_HTML_PATH).map { |dt| dt.text.gsub(REGEXP_NON_BREAKING_SPACE, ' ').split[0..1] }.flatten
|
15
|
-
stocks_prices = page.css(StockConfig::PRICE_HTML_PATH).map { |p| p.text.strip.gsub(REGEXP_DOLLAR_SIGN, StockParser::STRING_NO_SPACE) }
|
16
|
-
change_and_volume = get_volume(page)
|
17
|
-
|
18
|
-
stocks_symbols.count.times do |index|
|
19
|
-
stocks << Stock.new(symbol: stocks_symbols[index].to_s,
|
20
|
-
price: stocks_prices[index].to_f,
|
21
|
-
change: change_and_volume[index][0].to_f,
|
22
|
-
volume: change_and_volume[index][1].to_i)
|
23
|
-
end
|
24
|
-
|
25
|
-
data = stocks
|
26
|
-
data = transform_symbols(symbols).map{ |symbol| stocks.find {|stock| stock.symbol == symbol} }.compact if symbols.to_a.any?
|
27
|
-
{ stocks: data, date: date.freeze, time: time.freeze }
|
28
|
-
end
|
29
|
-
|
30
|
-
|
31
|
-
private
|
32
|
-
|
33
|
-
def transform_symbols(symbols)
|
34
|
-
symbols.map!(&:upcase).map!(&:strip)
|
35
|
-
end
|
36
|
-
|
37
|
-
def get_volume(page)
|
38
|
-
page.css(StockConfig::CHANGE_AND_VOLUME_HTML_PATH).
|
39
|
-
map { |cv| cv.text.gsub!(REGEXP_NON_BREAKING_SPACE, ' ').
|
40
|
-
sub(/\s/, StockParser::STRING_NO_SPACE).
|
41
|
-
sub('CHG:$', StockParser::STRING_NO_SPACE).
|
42
|
-
sub('VOL:', StockParser::STRING_NO_SPACE).
|
43
|
-
sub(',', StockParser::STRING_NO_SPACE).split(/\s\s/) }
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|