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 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
-