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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 185e7d0f8723b8975e505a05d4184530bd7f35fc
4
- data.tar.gz: da1e61df1f60da0cb3410446923015e85333c178
3
+ metadata.gz: 7fff9201e6d946b2048caee7d62b83e4e0ea6d21
4
+ data.tar.gz: 04f3c656d4295d90e8e0058183e284b1b0abe793
5
5
  SHA512:
6
- metadata.gz: 5adcc7caad232e98f0916266ea122df98a05a6a895f0d18cce9512b9f5f973748d2820db503cf0e0a4f8b66aae3d0c8a9959823ef8d32c4678c274e0287ee377
7
- data.tar.gz: c560b982ff4bb63a9509e5ab98629280d3aa31390f6c174ee57c3c563223faabcecd9d3b413c05738fa873d6caa117db8d6835e876ef642d3bd0593d8334b290
6
+ metadata.gz: d8efaa4916c5e751167f7985ed27fd03c9582a982220cfad8946f47a4e772f22250e9e3abf1b7baf8a193a188368ce13ff8664042bb80749058d86b7cdc83b63
7
+ data.tar.gz: 463484d86ecf427d34311efa210f8541b6eb4fe10c45294be3aa5efa18690ef7ce83371aeb444038be687950995bc0b128b288c7c588e451703a848400025e21
@@ -1,16 +1,20 @@
1
1
  require 'jamrock_stocks/version'
2
2
  require 'jamrock_stocks/stock'
3
- require 'jamrock_stocks/stock_config'
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.fetch_stocks(symbols:[])
13
- StockParser.new.fetch_stocks symbols: symbols
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
+
@@ -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
@@ -1,3 +1,3 @@
1
1
  module JamrockStocks
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -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
- result = StockClient.fetch_stocks
29
- expect(result[:stocks]).not_to be_empty
30
- expect(%w(BRG CBNY CAR CCC) - result[:stocks].map{ |s| s.symbol } ).to be_empty
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
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-21 00:00:00.000000000 Z
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
-