jamrock_stocks 0.0.4 → 0.0.5
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/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
|
-
|