stock_index 0.8.3 → 0.8.4

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.
@@ -4,17 +4,9 @@ class StockIndex
4
4
 
5
5
  require 'csv'
6
6
 
7
- EXCEPTIONS = {
8
- 'BIDU' => {name: 'BAIDU INC', bbgid: 'BBG000QXWHD1'},
9
- 'LVNTA' => {name: 'LIBERTY VENTURES', bbgid: 'BBG0038K9G41'},
10
- 'VIP' => {name: 'VIMPELCOM LTD', bbgid: 'BBG000QCW561'},
11
- 'VOD' => {name: 'VODAFONE GROUP PLC', bbgid: 'BBG000C4R6H6'}
12
- }
13
-
14
7
  class << self
15
8
 
16
9
  def find(symbol, pricing_source)
17
- return {name: EXCEPTIONS[symbol][:name], bbgid: EXCEPTIONS[symbol][:bbgid]} if EXCEPTIONS.keys.include? symbol
18
10
  CSV.foreach(files(pricing_source)) do |row|
19
11
  return {name: row[1], bbgid: row[2]} if row[0] == symbol
20
12
  end
@@ -12,11 +12,9 @@ class StockIndex
12
12
  end
13
13
 
14
14
  def attributes
15
- cache_lookup || attributes_lookup
16
- end
17
-
18
- def valid?
19
- @market && @symbol
15
+ attrs = cache_lookup || attributes_lookup
16
+ puts "---- ERROR #{attrs}" unless valid?(attrs)
17
+ attrs
20
18
  end
21
19
 
22
20
  def cache_lookup
@@ -36,10 +34,20 @@ class StockIndex
36
34
  end
37
35
 
38
36
  def attributes_lookup
39
- bsym = lookup_bsym
37
+ bsym = StockIndex::BsymSearch.find(@symbol, @pricing_source)
40
38
  cik = lookup_cik
39
+ puts " --- #{@symbol} bsym: #{bsym}"
40
+ puts " --- #{@symbol} cik: #{cik}"
41
41
  return nil unless bsym
42
- a = {market: @market, symbol: @symbol, name: bsym[:name], wikipedia: @wikipedia, cik: cik, bbgid: bsym[:bbgid]}
42
+ a = {
43
+ market: @market,
44
+ share: {
45
+ symbol: @symbol,
46
+ name: bsym[:name],
47
+ bbgid: bsym[:bbgid]
48
+ },
49
+ company: {wikipedia: @wikipedia}.merge( cik || {} )
50
+ }
43
51
  cache_write(a)
44
52
  a
45
53
  end
@@ -48,16 +56,6 @@ class StockIndex
48
56
  @pricing_source == :us
49
57
  end
50
58
 
51
- def lookup_bsym
52
- bsym = StockIndex::BsymSearch.find(@symbol, @pricing_source)
53
- if bsym
54
- bsym
55
- else
56
- puts "bsym --> #{@symbol}" unless testing?
57
- return nil
58
- end
59
- end
60
-
61
59
  def lookup_cik
62
60
  if us?
63
61
  lookup_cik_us
@@ -69,15 +67,22 @@ class StockIndex
69
67
  def lookup_cik_us
70
68
  edgar = Cik.lookup(SymbolParser.new(@symbol).bsym_to_cik)
71
69
  if edgar
72
- edgar[:cik]
70
+ {
71
+ cik: edgar[:cik],
72
+ name: edgar[:name],
73
+ sic: edgar[:sic]
74
+ }
73
75
  else
74
- puts "cik --> #{@symbol}" unless testing?
75
76
  return nil
76
77
  end
77
78
  end
78
79
 
79
- def testing?
80
- @symbol == 'ZZZZ'
80
+ def valid?(attributes)
81
+ !attributes[:market].nil? &&
82
+ !attributes[:share][:symbol].nil? &&
83
+ !attributes[:share][:name].nil? &&
84
+ !attributes[:share][:bbgid].nil? &&
85
+ !attributes[:company][:wikipedia].nil?
81
86
  end
82
87
 
83
88
  end
@@ -10,7 +10,7 @@ class StockIndex
10
10
  market = market(tr)
11
11
  if symbol && market
12
12
  component = StockIndex::Component.new(symbol, market, wikipedia_link(tr))
13
- array << component.attributes if component.valid?
13
+ array << component.attributes
14
14
  end
15
15
  array
16
16
  end
@@ -27,7 +27,7 @@ class StockIndex
27
27
  end
28
28
 
29
29
  def build_wikipedia_link(wikipedia_path)
30
- URI::HTTP.build({:host => 'en.wikipedia.org', :path => wikipedia_path}).to_s rescue nil
30
+ URI::Generic.new('https', nil, 'en.wikipedia.org', nil, nil, wikipedia_path, nil, nil, nil).to_s rescue nil
31
31
  end
32
32
 
33
33
  end
@@ -17,7 +17,7 @@ class FtseScraper < StockIndex::BaseScraper
17
17
  market = 'XLON'
18
18
  if symbol && market
19
19
  component = StockIndex::Component.new(symbol, market, @wikipedia_hash[symbol], :ln)
20
- array << component.attributes if component.valid?
20
+ array << component.attributes
21
21
  end
22
22
  array
23
23
  end
@@ -26,7 +26,7 @@ class FtseScraper < StockIndex::BaseScraper
26
26
  def symbol(tr)
27
27
  symbol_td = td(tr, 0)
28
28
  s = symbol_td ? symbol_td.text : nil
29
- SymbolParser.new(s).symbol_to_bsym
29
+ s.nil? ? nil : s.sub('.', '/')
30
30
  end
31
31
 
32
32
  def url(page)
@@ -41,7 +41,49 @@ class FtseScraper < StockIndex::BaseScraper
41
41
  hash[symbol_td[1].text] = build_wikipedia_link(link_td.css('a').first.attributes['href'].value)
42
42
  end
43
43
  hash
44
- end
44
+ end.merge(ftse_not_found_wikipedia_links)
45
+ end
46
+
47
+ def ftse_not_found_wikipedia_links
48
+ {
49
+ 'III' => 'https://en.wikipedia.org/wiki/3i',
50
+ 'AHT' => 'https://en.wikipedia.org/wiki/Ashtead_Group',
51
+ 'AV/' => 'https://en.wikipedia.org/wiki/Aviva',
52
+ 'BA/' => 'https://en.wikipedia.org/wiki/BAE_Systems',
53
+ 'BDEV' => 'https://en.wikipedia.org/wiki/Barratt_Developments',
54
+ 'BG/' => 'https://en.wikipedia.org/wiki/BG_Group',
55
+ 'BP/' => 'https://en.wikipedia.org/wiki/BP',
56
+ 'BATS' => 'https://en.wikipedia.org/wiki/British_American_Tobacco',
57
+ 'BT/A' => 'https://en.wikipedia.org/wiki/BT_Group',
58
+ 'CCL' => 'https://en.wikipedia.org/wiki/Carnival_Corporation_%26_plc',
59
+ 'DLG' => 'https://en.wikipedia.org/wiki/Direct_Line_Group',
60
+ 'DC/' => 'https://en.wikipedia.org/wiki/Dixons_Carphone',
61
+ 'EZJ' => 'https://en.wikipedia.org/wiki/EasyJet',
62
+ 'HL/' => 'https://en.wikipedia.org/wiki/Hargreaves_Lansdown',
63
+ 'HIK' => 'https://en.wikipedia.org/wiki/Hikma_Pharmaceuticals',
64
+ 'ISAT' => 'https://en.wikipedia.org/wiki/Inmarsat',
65
+ 'INTU' => 'https://en.wikipedia.org/wiki/Intu_Properties',
66
+ 'LSE' => 'https://en.wikipedia.org/wiki/London_Stock_Exchange_Group',
67
+ 'MERL' => 'https://en.wikipedia.org/wiki/Merlin_Entertainments',
68
+ 'MNDI' => 'https://en.wikipedia.org/wiki/Mondi',
69
+ 'NG/' => 'https://en.wikipedia.org/wiki/National_Grid_plc',
70
+ 'PSON' => 'https://en.wikipedia.org/wiki/Pearson_PLC',
71
+ 'PSN' => 'https://en.wikipedia.org/wiki/Persimmon_plc',
72
+ 'RDSB' => 'https://en.wikipedia.org/wiki/Royal_Dutch_Shell',
73
+ 'RB/' => 'https://en.wikipedia.org/wiki/Reckitt_Benckiser',
74
+ 'RR/' => 'https://en.wikipedia.org/wiki/Rolls-Royce_Holdings',
75
+ 'RMG' => 'https://en.wikipedia.org/wiki/Royal_Mail',
76
+ 'SHP' => 'https://en.wikipedia.org/wiki/Shire_(pharmaceutical_company)',
77
+ 'SKY' => 'https://en.wikipedia.org/wiki/Sky_plc',
78
+ 'SN/' => 'https://en.wikipedia.org/wiki/Smith_%26_Nephew',
79
+ 'SPD' => 'https://en.wikipedia.org/wiki/Sports_Direct',
80
+ 'STJ' => 'https://en.wikipedia.org/wiki/St._James%27s_Place_plc',
81
+ 'SL/' => 'https://en.wikipedia.org/wiki/Standard_Life',
82
+ 'TW/' => 'https://en.wikipedia.org/wiki/Taylor_Wimpey',
83
+ 'TPK' => 'https://en.wikipedia.org/wiki/Travis_Perkins',
84
+ 'TUI' => 'https://en.wikipedia.org/wiki/TUI_Group',
85
+ 'UU/' => 'https://en.wikipedia.org/wiki/United_Utilities'
86
+ }
45
87
  end
46
88
 
47
89
  end
@@ -8,10 +8,11 @@ class NasdaqScraper < StockIndex::BaseScraper
8
8
  def parse_rows(rows)
9
9
  rows.inject([]) do |array, li|
10
10
  symbol = /.+\((\w+)\)/.match(li)[1]
11
+ symbol = 'SWKS' if symbol == 'SKWS' # wikipedia erratum
11
12
  market = 'XNAS'
12
13
  if symbol && market
13
14
  component = StockIndex::Component.new(symbol, market, wikipedia(li))
14
- array << component.attributes if component.valid?
15
+ array << component.attributes
15
16
  end
16
17
  array
17
18
  end
@@ -14,18 +14,18 @@ class NikkeiScraper < StockIndex::BaseScraper
14
14
  market = 'XJPX'
15
15
  if symbol && market
16
16
  component = StockIndex::Component.new(symbol, market, @wikipedia_hash[symbol], :jp)
17
- array << component.attributes if component.valid?
17
+ array << component.attributes
18
18
  end
19
19
  array
20
20
  end
21
21
  end
22
22
 
23
23
  def parse_wikipedia_page(wikipedia_doc)
24
- wikipedia_doc.css('li').inject({}) do |hash, li|
25
- md = li.text.match(/.+\(TYO:\s+(\d{4})/)
24
+ wikipedia_doc.css('#constituents tr').inject({}) do |hash, tr|
25
+ md = tr.text.match(/\n(\d{4})\n/)
26
26
  if md
27
27
  symbol = md[1]
28
- link = build_wikipedia_link(li.css('a').first.attributes['href'].value)
28
+ link = build_wikipedia_link(tr.css('a').first.attributes['href'].value)
29
29
  hash[symbol] = link
30
30
  end
31
31
  hash
@@ -6,7 +6,7 @@ class SymbolParser
6
6
 
7
7
  def symbol_to_bsym
8
8
  if @symbol
9
- @symbol.sub('.', '/')
9
+ @symbol.sub('-', '/')
10
10
  else
11
11
  nil
12
12
  end
@@ -20,12 +20,15 @@ class SymbolParser
20
20
  # BF/B (Brown-Forman Corp)
21
21
  when 'BF/B'
22
22
  '0000014693'
23
+ # QRVO (Qorvo, Inc.)
24
+ # when 'QRVO'
25
+ # '0001604778'
23
26
  # QVCA (Liberty Interactive Corp)
24
- when 'QVCA'
25
- '0001355096'
27
+ # when 'QVCA'
28
+ # '0001355096'
26
29
  # LMCK (Liberty Media Corp)
27
- when 'LMCK'
28
- '0001560385'
30
+ # when 'LMCK'
31
+ # '0001560385'
29
32
  else
30
33
  @symbol
31
34
  end
@@ -1,3 +1,3 @@
1
1
  class StockIndex
2
- VERSION = "0.8.3"
2
+ VERSION = "0.8.4"
3
3
  end
@@ -2,14 +2,6 @@ require 'helper'
2
2
 
3
3
  describe StockIndex::BsymSearch do
4
4
 
5
- context 'searching a symbol in EXCEPTIONS' do
6
-
7
- it 'returns the component' do
8
- expect(StockIndex::BsymSearch.find('BIDU', :us)).to eq({name: 'BAIDU INC', bbgid: 'BBG000QXWHD1'})
9
- end
10
-
11
- end
12
-
13
5
  context 'searching a symbol in the CSV file' do
14
6
 
15
7
  it 'returns the component' do
@@ -10,7 +10,7 @@ describe StockIndex::Component do
10
10
 
11
11
  it 'returns the correct attributes with a valid symbol' do
12
12
  component = StockIndex::Component.new('CSCO', 'XNAS', nil)
13
- expect(component.attributes_lookup).to eq({:market=>"XNAS", :symbol=>"CSCO", :name=>"CISCO SYSTEMS INC", :wikipedia=>nil, :cik=>"0000858877", :bbgid=>"BBG000C3J3C9"})
13
+ expect(component.attributes_lookup).to eq({:market=>"XNAS", :share=>{:symbol=>"CSCO", :name=>"CISCO SYSTEMS INC", :bbgid=>"BBG000C3J3C9"}, :company=>{:wikipedia=>nil, :cik=>"0000858877", :name=>"CISCO SYSTEMS, INC.", :sic=>"3576"}})
14
14
  end
15
15
 
16
16
  it 'returns nil with an invalid symbol' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stock_index
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.3
4
+ version: 0.8.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Javier Vidal
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-28 00:00:00.000000000 Z
11
+ date: 2015-09-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -153,14 +153,19 @@ files:
153
153
  - LICENSE.txt
154
154
  - README.md
155
155
  - Rakefile
156
+ - bsym/.keep
156
157
  - bsym/JP.csv
157
158
  - bsym/LN.csv
158
159
  - bsym/US.csv
160
+ - cache/.keep
159
161
  - cache/XJPX.pstore
160
162
  - cache/XLON.pstore
161
163
  - cache/XNAS.pstore
162
164
  - cache/XNYS.pstore
163
- - cache/test.pstore
165
+ - csv/.keep
166
+ - csv/JP.csv
167
+ - csv/LN.csv
168
+ - csv/US.csv
164
169
  - lib/stock_index.rb
165
170
  - lib/stock_index/bsym_search.rb
166
171
  - lib/stock_index/component.rb
data/cache/test.pstore DELETED
Binary file