securities 0.1.2 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +26 -9
- data/lib/securities/scraper.rb +9 -10
- data/lib/securities/stock.rb +15 -7
- data/lib/securities/version.rb +1 -1
- data/spec/stock_spec.rb +11 -0
- metadata +6 -6
- data/spec/securities_spec.rb +0 -5
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Securities
|
2
2
|
|
3
3
|
Financial information scraper gem.
|
4
|
-
Uses Yahoo Finance API. Current functionality demo: http://strangemuseum.heroku.com
|
4
|
+
Uses Yahoo Finance API. Current functionality demo of this gem, working in synergy with gem ta: http://strangemuseum.heroku.com
|
5
5
|
|
6
6
|
[![Build Status](https://secure.travis-ci.org/Nedomas/securities.png)](http://travis-ci.org/Nedomas/securities)[![Build Status](https://gemnasium.com/Nedomas/securities.png)](https://gemnasium.com/Nedomas/securities)
|
7
7
|
|
@@ -35,11 +35,15 @@ You can get stock information with commands:
|
|
35
35
|
|
36
36
|
Optional parameter :periods accepts :daily, :weekly, :monthly, :dividend. If not specified, it defaults to :daily.
|
37
37
|
|
38
|
+
:end_date defaults to Date.today if not specified.
|
39
|
+
|
38
40
|
You can access hash for a single stock with:
|
39
41
|
|
40
|
-
my_data
|
42
|
+
my_data["yhoo"]
|
43
|
+
|
44
|
+
or my_stocks.output["yhoo"]
|
41
45
|
|
42
|
-
|
46
|
+
Output is returned in a hash:
|
43
47
|
|
44
48
|
{"aapl"=>
|
45
49
|
[{:date=>"2012-01-04",
|
@@ -72,18 +76,31 @@ Results are returned in a hash:
|
|
72
76
|
:volume=>"19708600",
|
73
77
|
:adj_close=>"16.29"}]}
|
74
78
|
|
75
|
-
|
79
|
+
# Version 1.0.0
|
80
|
+
|
81
|
+
Results are returned in a reversed manner from 0.1.2. Array begins from the oldest data points.
|
82
|
+
|
83
|
+
Only Stock class initializes an object so you can do:
|
76
84
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
85
|
+
my_stocks = Securities::Stock.new(["aapl", "yhoo"])
|
86
|
+
my_stocks.history(:start_date => '2012-01-01', :end_date => '2012-02-01', :periods => :weekly)
|
87
|
+
^ adds @ouput variable to the my_stocks object. ^
|
88
|
+
|
89
|
+
And get output with:
|
90
|
+
my_stocks.output or my_stocks.output["aapl"]
|
91
|
+
|
92
|
+
Given symbols, dates and periods with:
|
93
|
+
my_stocks.symbols
|
94
|
+
my_stocks.start_date
|
95
|
+
my_stocks.end_date
|
96
|
+
my_stocks.periods
|
97
|
+
|
98
|
+
## To do:
|
81
99
|
|
82
100
|
* Write specs.
|
83
101
|
* Add quote info (P/E, P/S, etc.)
|
84
102
|
* Add symbol from name lookup.
|
85
103
|
* Add options support.
|
86
|
-
* Add technical analysis module (or a seperate gem which works in synergy with this).
|
87
104
|
|
88
105
|
## Contributing
|
89
106
|
|
data/lib/securities/scraper.rb
CHANGED
@@ -9,22 +9,23 @@ module Securities
|
|
9
9
|
#
|
10
10
|
class Scraper
|
11
11
|
|
12
|
-
attr_reader :results
|
13
12
|
# Error handling
|
14
13
|
class ScraperException < StandardError
|
15
14
|
end
|
16
15
|
|
17
|
-
def
|
18
|
-
@results = Hash.new
|
16
|
+
def self.get type, parameters
|
19
17
|
|
20
18
|
# Manage different type requests.
|
21
19
|
case type
|
22
|
-
when :history then
|
20
|
+
when :history then results = scrape_history(parameters)
|
23
21
|
else raise ScraperException, 'Cannot determine request type.'
|
24
22
|
end
|
23
|
+
|
24
|
+
return results
|
25
25
|
end
|
26
26
|
|
27
|
-
def scrape_history parameters
|
27
|
+
def self.scrape_history parameters
|
28
|
+
results = Hash.new
|
28
29
|
parameters.each do |symbol, url|
|
29
30
|
|
30
31
|
uri = URI.parse(url)
|
@@ -42,11 +43,10 @@ module Securities
|
|
42
43
|
csv = CSV.parse(get, :headers => true)
|
43
44
|
rescue => error
|
44
45
|
# PROBABLY an invalid symbol specified or there was some other way the parser couldn't read a CSV.
|
45
|
-
# FIXME: Let it raise exception on one symbol, but continue on other and send the message.
|
46
46
|
# It will no longer raise exception because it causes a bug.
|
47
47
|
# bug => if exception occurs in one symbol, it will not give any results for any other.
|
48
48
|
# raise ScraperException, "Invalid symbol '#{symbol}' specified."
|
49
|
-
|
49
|
+
results[symbol] = []
|
50
50
|
next
|
51
51
|
end
|
52
52
|
|
@@ -60,16 +60,15 @@ module Securities
|
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
|
-
# FIXME: Let it raise exception on one symbol, but continue on other and send the message.
|
64
63
|
# It will no longer raise exception if data is empty, because it causes a
|
65
64
|
# bug => if exception occurs in one symbol, it will not give any results for any other.
|
66
65
|
# if data.empty?
|
67
66
|
# raise ScraperException, "There were no results for #{symbol}."
|
68
67
|
# end
|
69
68
|
|
70
|
-
|
69
|
+
results[symbol] = data.reverse
|
71
70
|
end
|
72
|
-
return
|
71
|
+
return results
|
73
72
|
end
|
74
73
|
|
75
74
|
end
|
data/lib/securities/stock.rb
CHANGED
@@ -4,11 +4,11 @@ module Securities
|
|
4
4
|
# :periods accepts :daily, :weekly, :monthly, :dividend. If not specified, it defaults to :daily.
|
5
5
|
#
|
6
6
|
# You can access hash for a single stock with:
|
7
|
-
# my_stocks
|
7
|
+
# my_stocks["yhoo"]
|
8
8
|
|
9
9
|
class Stock
|
10
10
|
|
11
|
-
|
11
|
+
attr_accessor :symbols, :output, :start_date, :end_date, :periods
|
12
12
|
# REGEX for YYYY-MM-DD
|
13
13
|
DATE_REGEX = /^[0-9]{4}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])/
|
14
14
|
PERIODS_ARRAY = [:daily, :weekly, :monthly, :dividends]
|
@@ -26,11 +26,15 @@ module Securities
|
|
26
26
|
parameters[:symbols] = @symbols
|
27
27
|
validate_history(parameters)
|
28
28
|
urls = generate_history_url(parameters)
|
29
|
-
|
29
|
+
@start_date = parameters[:start_date]
|
30
|
+
@end_date = parameters[:end_date]
|
31
|
+
@periods = parameters[:periods]
|
32
|
+
@output = Securities::Scraper.get(type, urls)
|
30
33
|
end
|
31
34
|
|
32
35
|
private
|
33
36
|
|
37
|
+
#
|
34
38
|
# History URL generator
|
35
39
|
#
|
36
40
|
# Generating URL for various types of requests within stocks.
|
@@ -92,7 +96,7 @@ module Securities
|
|
92
96
|
# Reject empty symbol hashes.
|
93
97
|
@symbols = parameters.reject(&:empty?)
|
94
98
|
|
95
|
-
|
99
|
+
if @symbols.nil?
|
96
100
|
raise StockException, 'You must specify at least one stock symbol.'
|
97
101
|
end
|
98
102
|
|
@@ -110,10 +114,14 @@ module Securities
|
|
110
114
|
raise StockException, 'Given parameters have to be a hash.'
|
111
115
|
end
|
112
116
|
|
113
|
-
unless parameters.
|
114
|
-
|
117
|
+
unless parameters.has_key?(:end_date)
|
118
|
+
parameters[:end_date] = Date.today.strftime("%Y-%m-%d")
|
119
|
+
end
|
120
|
+
|
121
|
+
unless parameters.has_key?(:start_date)
|
122
|
+
raise StockException, 'Start date must be specified.'
|
115
123
|
end
|
116
|
-
|
124
|
+
|
117
125
|
unless DATE_REGEX.match(parameters[:start_date])
|
118
126
|
raise StockException, 'Invalid start date specified. Format YYYY-MM-DD.'
|
119
127
|
end
|
data/lib/securities/version.rb
CHANGED
data/spec/stock_spec.rb
ADDED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: securities
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-09-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -62,8 +62,8 @@ files:
|
|
62
62
|
- lib/securities/stock.rb
|
63
63
|
- lib/securities/version.rb
|
64
64
|
- securities.gemspec
|
65
|
-
- spec/securities_spec.rb
|
66
65
|
- spec/spec_helper.rb
|
66
|
+
- spec/stock_spec.rb
|
67
67
|
homepage: https://github.com/Nedomas/securities
|
68
68
|
licenses: []
|
69
69
|
post_install_message:
|
@@ -78,7 +78,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
78
78
|
version: '0'
|
79
79
|
segments:
|
80
80
|
- 0
|
81
|
-
hash:
|
81
|
+
hash: -3860670281301913454
|
82
82
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
@@ -87,7 +87,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
87
87
|
version: '0'
|
88
88
|
segments:
|
89
89
|
- 0
|
90
|
-
hash:
|
90
|
+
hash: -3860670281301913454
|
91
91
|
requirements: []
|
92
92
|
rubyforge_project:
|
93
93
|
rubygems_version: 1.8.24
|
@@ -95,5 +95,5 @@ signing_key:
|
|
95
95
|
specification_version: 3
|
96
96
|
summary: Financial information scraper gem. Uses Yahoo Finance API.
|
97
97
|
test_files:
|
98
|
-
- spec/securities_spec.rb
|
99
98
|
- spec/spec_helper.rb
|
99
|
+
- spec/stock_spec.rb
|