securities 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Securities
2
2
 
3
3
  Financial information scraper gem.
4
- Uses Yahoo Finance API.
4
+ Uses Yahoo Finance API. Current functionality demo: 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
 
@@ -74,6 +74,10 @@ Results are returned in a hash:
74
74
 
75
75
  ## To do:
76
76
 
77
+ * Fix monthly+ and dividends+
78
+ * Fix exception messages for friendlier displaying to end-user+ (and invalid symbol error=>"Illegal quoting in line 1.")+.
79
+ * Rescue empty results error.+
80
+ * Let it raise exception on one symbol, but continue on other and send the message.
77
81
  * Write specs.
78
82
  * Add quote info (P/E, P/S, etc.)
79
83
  * Add symbol from name lookup.
@@ -37,12 +37,30 @@ module Securities
37
37
  end
38
38
 
39
39
  # Skip first line because it contains headers with Date,Open,High,Low,Close,Volume,Adj Close
40
- csv = CSV.parse(get, :headers => true)
40
+ # Check for errors during CSV parsing.
41
+ begin
42
+ csv = CSV.parse(get, :headers => true)
43
+ rescue => error
44
+ # 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
+ raise ScraperException, "Invalid symbol '#{symbol}' specified."
47
+ end
41
48
 
42
49
  data = Array.new
43
- csv.each_with_index {|row, index|
44
- data[index] = {:date => row[0], :open => row[1], :high => row[2], :low => row[3], :close => row[4], :volume => row[5], :adj_close => row[6]}
45
- }
50
+ csv.each_with_index do |row, index|
51
+ line = Hash.new
52
+ csv.headers.each_with_index do |header, i|
53
+ # Set headers as keys for data hash.
54
+ line[header.parameterize.underscore.to_sym] = row[i]
55
+ data[index] = line
56
+ end
57
+ end
58
+
59
+ # FIXME: Let it raise exception on one symbol, but continue on other and send the message.
60
+ if data.empty?
61
+ raise ScraperException, 'There were no results for these parameters.'
62
+ end
63
+
46
64
  @results[symbol] = data
47
65
  end
48
66
  return @results
@@ -11,7 +11,7 @@ module Securities
11
11
  attr_reader :symbols
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
- PERIODS_ARRAY = [:daily, :weekly, :montly, :dividends]
14
+ PERIODS_ARRAY = [:daily, :weekly, :monthly, :dividends]
15
15
 
16
16
  # Error handling
17
17
  class StockException < StandardError
@@ -93,7 +93,7 @@ module Securities
93
93
  @symbols = parameters.reject(&:empty?)
94
94
 
95
95
  unless !@symbols.empty?
96
- raise StockException, 'You must specify stock symbols.'
96
+ raise StockException, 'You must specify at least one stock symbol.'
97
97
  end
98
98
 
99
99
  # FIXME: A kinda hacky way to check if parameters are a nested array (when accepting an array as a symbols argument).
@@ -101,7 +101,7 @@ module Securities
101
101
  @symbols[0].is_a?(Array) ? @symbols = @symbols[0] : nil
102
102
 
103
103
  unless @symbols.uniq.length == @symbols.length
104
- raise StockException, 'Duplicate symbols given.'
104
+ raise StockException, 'Duplicate stock symbols given.'
105
105
  end
106
106
  end
107
107
 
@@ -111,30 +111,30 @@ module Securities
111
111
  end
112
112
 
113
113
  unless parameters.has_keys?(:start_date, :end_date)
114
- raise StockException, 'You must specify :start_date and :end_date.'
114
+ raise StockException, 'You must specify start date and end date.'
115
115
  end
116
116
 
117
117
  unless DATE_REGEX.match(parameters[:start_date])
118
- raise StockException, 'Invalid :start_date specified. Format YYYY-MM-DD.'
118
+ raise StockException, 'Invalid start date specified. Format YYYY-MM-DD.'
119
119
  end
120
120
 
121
121
  unless DATE_REGEX.match(parameters[:end_date])
122
- raise StockException, 'Invalid :end_date specified. Format YYYY-MM-DD.'
122
+ raise StockException, 'Invalid end date specified. Format YYYY-MM-DD.'
123
123
  end
124
124
 
125
125
  unless parameters[:start_date].to_date < parameters[:end_date].to_date
126
- raise StockException, ':end_date must be greater than the :start_date.'
126
+ raise StockException, 'End date must be greater than the start date.'
127
127
  end
128
128
 
129
129
  unless parameters[:start_date].to_date < Date.today
130
- raise StockException, ':start_date must not be in the future.'
130
+ raise StockException, 'Start date must not be in the future.'
131
131
  end
132
132
 
133
133
  # Set to default :periods if key isn't specified.
134
134
  parameters[:periods] = :daily if !parameters.has_key?(:periods)
135
135
 
136
136
  unless PERIODS_ARRAY.include?(parameters[:periods])
137
- raise StockException, 'Invalid :periods value specified.'
137
+ raise StockException, 'Invalid periods value specified.'
138
138
  end
139
139
  end
140
140
 
@@ -1,3 +1,3 @@
1
1
  module Securities
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
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.1.0
4
+ version: 0.1.1
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-08-25 00:00:00.000000000 Z
12
+ date: 2012-08-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -78,7 +78,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
78
78
  version: '0'
79
79
  segments:
80
80
  - 0
81
- hash: 4396400797512649668
81
+ hash: -2122445770564870703
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: 4396400797512649668
90
+ hash: -2122445770564870703
91
91
  requirements: []
92
92
  rubyforge_project:
93
93
  rubygems_version: 1.8.23