fec_results 0.0.1

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.
@@ -0,0 +1,340 @@
1
+ module FecResults
2
+ class President
3
+
4
+ attr_reader :year, :url
5
+
6
+ def initialize(params={})
7
+ params.each_pair do |k,v|
8
+ instance_variable_set("@#{k}", v)
9
+ end
10
+ @url = FecResults::PRESIDENT_URLS[year.to_s]
11
+ end
12
+
13
+ def to_s
14
+ "#<FecResults::President:#{year.to_s}>"
15
+ end
16
+
17
+ #### main instance methods called with optional arguments to filter.
18
+
19
+ def popular_vote_summary(*args)
20
+ send("popular_vote_summary_#{year}", *args)
21
+ end
22
+
23
+ def state_electoral_and_popular_vote_summary(*args)
24
+ send("state_electoral_and_popular_vote_summary_#{year}", *args)
25
+ end
26
+
27
+ def primary_party_summary
28
+ send("primary_party_summary_#{year}")
29
+ end
30
+
31
+ def general_election_results(*args)
32
+ send("general_election_results_#{year}", *args)
33
+ end
34
+
35
+ def primary_election_results(*args)
36
+ send("primary_election_results_#{year}", *args)
37
+ end
38
+
39
+ #### cycle-specific methods called by main methods above
40
+
41
+ def popular_vote_summary_2012(options={})
42
+ results = []
43
+ t = RemoteTable.new(url, :sheet => 'Table 1. 2012 Pres Popular Vote', :skip => 3)
44
+ t.entries.each do |row|
45
+ break if row['Candidate (Party Label)'] == 'Total:'
46
+ results << OpenStruct.new(:candidate => row['Candidate (Party Label)'], :popular_votes => row['Popular Vote Total'].to_i, :popular_vote_percent => row['Percent of Popular Vote'].to_f)
47
+ end
48
+ results
49
+ end
50
+
51
+ def popular_vote_summary_2008(options={})
52
+ results = []
53
+ t = RemoteTable.new(FecResults::SUMMARY_URLS[year.to_s], :sheet => 'Table 1. Pres Popular Vote', :skip => 3)
54
+ t.entries.each do |row|
55
+ break if row['Candidate'] == 'Total:'
56
+ results << OpenStruct.new(:candidate => row['Candidate'], :party => row['(Party Label)'], :popular_votes => row['Popular Vote Total'].to_i, :popular_vote_percent => row['Percent of Popular Vote'].to_f)
57
+ end
58
+ results
59
+ end
60
+
61
+ def popular_vote_summary_2004(options={})
62
+ results = []
63
+ t = RemoteTable.new(url, :sheet => 'Table 1. Pres Popular Vote', :skip => 3)
64
+ t.entries.each do |row|
65
+ break if row['Candidate'] == 'Total:'
66
+ results << OpenStruct.new(:candidate => row['Candidate'], :party => row['(Party Label)'], :popular_votes => row['Popular Vote Total'].to_i, :popular_vote_percent => row['Percent of Popular Vote'].to_f)
67
+ end
68
+ results
69
+ end
70
+
71
+ def state_electoral_and_popular_vote_summary_2012(options={})
72
+ results = []
73
+ t = RemoteTable.new(url, :sheet => 'Table 2. Electoral & Pop Vote', :skip => 4, :headers => false)
74
+ t.entries.each do |row|
75
+ break if row[0] == 'Total:'
76
+ results << OpenStruct.new(:state => row[0], :democratic_electoral_votes => row[1].to_i, :republican_electoral_votes => row[2].to_i, :democratic_popular_votes => row[3].to_i, :republican_popular_votes => row[4].to_i, :other_popular_votes => row[5].to_i, :total_votes => row[6].to_i)
77
+ end
78
+ results
79
+ end
80
+
81
+ def state_electoral_and_popular_vote_summary_2008(options={})
82
+ results = []
83
+ t = RemoteTable.new(FecResults::SUMMARY_URLS[year.to_s], :sheet => 'Table 2. Pres Elec & Pop Vote', :skip => 2)
84
+ t.entries.each do |row|
85
+ break if row[0] == 'Total:'
86
+ results << OpenStruct.new(:state => row['STATE'], :democratic_electoral_votes => row['Electoral Vote Kerry (D)'].to_i, :republican_electoral_votes => row['Electoral Vote Bush (R)'].to_i, :democratic_popular_votes => row['Popular Vote Kerry (D)'].to_i, :republican_popular_votes => row['Popular Vote Bush (R)'].to_i, :other_popular_votes => row['Popular Vote All Others'].to_i, :total_votes => row['Popular Vote Total Vote'].to_i)
87
+ end
88
+ results
89
+ end
90
+
91
+ def state_electoral_and_popular_vote_summary_2004(options={})
92
+ results = []
93
+ t = RemoteTable.new(url, :sheet => 'Table 2. Pres Elec & Pop Vote', :skip => 2)
94
+ t.entries.each do |row|
95
+ break if row[0] == 'Total:'
96
+ results << OpenStruct.new(:state => row['STATE'], :democratic_electoral_votes => row['Electoral Vote Kerry (D)'].to_i, :republican_electoral_votes => row['Electoral Vote Bush (R)'].to_i, :democratic_popular_votes => row['Popular Vote Kerry (D)'].to_i, :republican_popular_votes => row['Popular Vote Bush (R)'].to_i, :other_popular_votes => row['Popular Vote All Others'].to_i, :total_votes => row['Popular Vote Total Vote'].to_i)
97
+ end
98
+ results
99
+ end
100
+
101
+ def primary_party_summary_2012(options={})
102
+ results = []
103
+ t = RemoteTable.new(url, :sheet => '2012 Pres Primary Party Summary', :skip => 1, :headers => false)
104
+ t.entries.each do |row|
105
+ break if row[0] == 'Total Primary Votes:'
106
+ results << OpenStruct.new(:party => row[0], :total_votes => row[1].to_i)
107
+ end
108
+ results
109
+ end
110
+
111
+ def primary_party_summary_2008(options={})
112
+ results = []
113
+ t = RemoteTable.new(url, :sheet => '2008 Pres Primary Party Summary', :skip => 1, :headers => false)
114
+ t.entries.each do |row|
115
+ break if row[0] == 'Total Primary Votes:'
116
+ results << OpenStruct.new(:party => row[0], :total_votes => row[1].to_i)
117
+ end
118
+ results
119
+ end
120
+
121
+ def primary_party_summary_2004(options={})
122
+ results = []
123
+ t = RemoteTable.new(url, :sheet => '2004 Pres Primary Party Summary', :skip => 1, :headers => false)
124
+ t.entries.each do |row|
125
+ break if row[0] == 'Total Primary Votes Cast:'
126
+ results << OpenStruct.new(:party => row[0], :total_votes => row[1].to_i)
127
+ end
128
+ results
129
+ end
130
+
131
+ def primary_party_summary_2000(options={})
132
+ raise NotImplementedError.new("Data not available for #{year}")
133
+ end
134
+
135
+ def general_election_results_2012(options={})
136
+ results = []
137
+ t = RemoteTable.new(url, :sheet => '2012 Pres General Results')
138
+ rows = t.entries
139
+ rows = rows.select{|r| r['STATE ABBREVIATION'] == options[:state]} if options[:state]
140
+ rows.each do |candidate|
141
+ next if candidate['LAST NAME, FIRST'].blank?
142
+ c = {:year => year}
143
+ c[:chamber] = "P"
144
+ c[:state] = candidate['STATE ABBREVIATION']
145
+ c[:party] = candidate['PARTY'] == 'Combined Parties:' ? "COMBINED TOTAL" : candidate['PARTY']
146
+ c[:incumbent] = candidate['LAST NAME, FIRST'] == 'Obama, Barack' ? true : false
147
+ c[:fec_id] = candidate['FEC ID']
148
+ c[:candidate_first] = candidate['LAST NAME, FIRST']
149
+ c[:candidate_last] = candidate['LAST NAME, FIRST']
150
+ c[:candidate_suffix] = candidate['LAST NAME, FIRST'].split(', ').last if candidate['LAST NAME, FIRST'].split(', ').size > 2
151
+ c[:candidate_name] = candidate['LAST NAME, FIRST']
152
+ c[:general_votes] = candidate['GENERAL RESULTS'].to_i
153
+ c[:general_pct] = candidate['GENERAL %'].to_f*100.0
154
+ c[:general_winner] = candidate['WINNER INDICATOR'] == "W" ? true : false
155
+ results << c
156
+ end
157
+ Result.create_from_results(results)
158
+ end
159
+
160
+ def primary_election_results_2012(options={})
161
+ results = []
162
+ t = RemoteTable.new(url, :sheet => '2012 Pres Primary Results')
163
+ rows = t.entries
164
+ rows = rows.select{|r| r['STATE ABBREVIATION'] == options[:state]} if options[:state]
165
+ rows.each do |candidate|
166
+ next if candidate['LAST NAME, FIRST'].blank?
167
+ c = {:year => year}
168
+ c[:chamber] = "P"
169
+ c[:state] = candidate['STATE ABBREVIATION']
170
+ c[:party] = candidate['PARTY']
171
+ c[:incumbent] = candidate['LAST NAME, FIRST'] == 'Obama, Barack' ? true : false
172
+ c[:fec_id] = candidate['FEC ID']
173
+ c[:candidate_first] = candidate['LAST NAME, FIRST']
174
+ c[:candidate_last] = candidate['LAST NAME, FIRST']
175
+ c[:candidate_suffix] = candidate['LAST NAME, FIRST'].split(', ').last if candidate['LAST NAME, FIRST'].split(', ').size > 2
176
+ c[:candidate_name] = candidate['LAST NAME, FIRST']
177
+ c[:general_votes] = candidate['PRIMARY RESULTS'].to_i
178
+ c[:general_pct] = candidate['PRIMARY %'].to_f*100.0
179
+ c[:general_winner] = nil
180
+ results << c
181
+ end
182
+ Result.create_from_results(results)
183
+ end
184
+
185
+ def general_election_results_2008(options={})
186
+ results = []
187
+ t = RemoteTable.new(url, :sheet => '2008 PRES GENERAL RESULTS')
188
+ rows = t.entries
189
+ rows = rows.select{|r| r['STATE ABBREVIATION'] == options[:state]} if options[:state]
190
+ rows.each do |candidate|
191
+ next if candidate['LAST NAME, FIRST'].blank?
192
+ c = {:year => year}
193
+ c[:chamber] = "P"
194
+ c[:date] = Date.parse(candidate['GENERAL ELECTION DATE'])
195
+ c[:state] = candidate['STATE ABBREVIATION']
196
+ c[:party] = candidate['PARTY'] == 'Combined Parties:' ? "COMBINED TOTAL" : candidate['PARTY']
197
+ c[:incumbent] = false
198
+ c[:fec_id] = candidate['FEC ID']
199
+ c[:candidate_first] = candidate['FIRST NAME']
200
+ c[:candidate_last] = candidate['LAST NAME']
201
+ c[:candidate_suffix] = candidate['LAST NAME, FIRST'].split(', ').last if candidate['LAST NAME, FIRST'].split(', ').size > 2
202
+ c[:candidate_name] = candidate['LAST NAME, FIRST']
203
+ c[:general_votes] = candidate['GENERAL RESULTS'].to_i
204
+ c[:general_pct] = candidate['GENERAL %'].to_f*100.0
205
+ c[:general_winner] = nil
206
+ results << c
207
+ end
208
+ Result.create_from_results(results)
209
+ end
210
+
211
+ def primary_election_results_2008(options={})
212
+ results = []
213
+ t = RemoteTable.new(url, :sheet => '2008 Pres Primary Results')
214
+ rows = t.entries
215
+ rows = rows.select{|r| r['STATE ABBREVIATION'] == options[:state]} if options[:state]
216
+ rows.each do |candidate|
217
+ next if candidate['LAST NAME, FIRST'].blank?
218
+ c = {:year => year}
219
+ c[:chamber] = "P"
220
+ c[:date] = Date.parse(candidate['GENERAL ELECTION DATE'])
221
+ c[:state] = candidate['STATE ABBREVIATION']
222
+ c[:party] = candidate['PARTY']
223
+ c[:incumbent] = false
224
+ c[:fec_id] = candidate['FEC ID']
225
+ c[:candidate_first] = candidate['FIRST NAME']
226
+ c[:candidate_last] = candidate['LAST NAME']
227
+ c[:candidate_suffix] = candidate['LAST NAME, FIRST'].split(', ').last if candidate['LAST NAME, FIRST'].split(', ').size > 2
228
+ c[:candidate_name] = candidate['LAST NAME, FIRST']
229
+ c[:general_votes] = candidate['PRIMARY RESULTS'].to_i
230
+ c[:general_pct] = candidate['PRIMARY %'].to_f*100.0
231
+ c[:general_winner] = nil
232
+ results << c
233
+ end
234
+ Result.create_from_results(results)
235
+ end
236
+
237
+ def general_election_results_2004(options={})
238
+ results = []
239
+ t = RemoteTable.new(url, :sheet => '2004 PRES GENERAL RESULTS')
240
+ rows = t.entries
241
+ rows = rows.select{|r| r['STATE ABBREVIATION'] == options[:state]} if options[:state]
242
+ rows.each do |candidate|
243
+ next if candidate['LAST NAME, FIRST'].blank?
244
+ c = {:year => year}
245
+ c[:date] = Date.parse("GENERAL ELECTION DATE")
246
+ c[:chamber] = "P"
247
+ c[:state] = candidate['STATE ABBREVIATION']
248
+ c[:party] = candidate['PARTY'].blank? ? "COMBINED TOTAL" : candidate['PARTY']
249
+ c[:incumbent] = candidate['LAST NAME, FIRST'] == 'Bush, George W.' ? true : false
250
+ c[:fec_id] = candidate['FEC ID']
251
+ c[:candidate_first] = candidate['LAST NAME, FIRST']
252
+ c[:candidate_last] = candidate['LAST NAME, FIRST']
253
+ c[:candidate_suffix] = candidate['LAST NAME, FIRST'].split(', ').last if candidate['LAST NAME, FIRST'].split(', ').size > 2
254
+ c[:candidate_name] = candidate['LAST NAME, FIRST']
255
+ c[:general_votes] = candidate['GENERAL RESULTS'].to_i
256
+ c[:general_pct] = candidate['GENERAL %'].to_f*100.0
257
+ results << c
258
+ end
259
+ Result.create_from_results(results)
260
+ end
261
+
262
+ def primary_election_results_2004(options={})
263
+ results = []
264
+ t = RemoteTable.new(url, :sheet => '2004 PRES PRIMARY RESULTS')
265
+ rows = t.entries
266
+ rows = rows.select{|r| r['STATE ABBREVIATION'] == options[:state]} if options[:state]
267
+ rows.each do |candidate|
268
+ next if candidate['LAST NAME, FIRST'].blank?
269
+ c = {:year => year}
270
+ c[:date] = Date.parse("GENERAL ELECTION DATE")
271
+ c[:chamber] = "P"
272
+ c[:state] = candidate['STATE ABBREVIATION']
273
+ c[:party] = candidate['PARTY']
274
+ c[:incumbent] = candidate['LAST NAME, FIRST'] == 'Bush, George W.' ? true : false
275
+ c[:fec_id] = candidate['FEC ID']
276
+ c[:candidate_first] = candidate['LAST NAME, FIRST'] #fixme
277
+ c[:candidate_last] = candidate['LAST NAME, FIRST'] #fixme
278
+ c[:candidate_suffix] = candidate['LAST NAME, FIRST'].split(', ').last if candidate['LAST NAME, FIRST'].split(', ').size > 2
279
+ c[:candidate_name] = candidate['LAST NAME, FIRST']
280
+ c[:primary_votes] = candidate['PRIMARY RESULTS'].to_i
281
+ c[:primary_pct] = candidate['PRIMARY %'].to_f*100.0
282
+ results << c
283
+ end
284
+ Result.create_from_results(results)
285
+ end
286
+
287
+ def general_election_results_2000(options={})
288
+ results = []
289
+ t = RemoteTable.new(url.first, :sheet => 'Master (with Totals & Percents)', :skip => 1, :headers => false)
290
+ rows = t.entries
291
+ rows = rows.select{|r| r[0] == options[:state]} if options[:state]
292
+ rows.each do |candidate|
293
+ next if candidate[2].blank?
294
+ c = {:year => year}
295
+ c[:date] = Date.parse("11/7/2000")
296
+ c[:chamber] = "P"
297
+ c[:state] = candidate[0]
298
+ c[:party] = candidate[2] == 'Combined' ? "COMBINED TOTAL" : candidate[2]
299
+ c[:incumbent] = false
300
+ c[:fec_id] = nil
301
+ c[:candidate_first] = candidate[1].split(', ')[1]
302
+ c[:candidate_last] = candidate[1].split(', ')[0]
303
+ c[:candidate_suffix] = candidate[1].split(', ').last if candidate[1].split(', ').size > 2
304
+ c[:candidate_name] = candidate[1]
305
+ c[:general_votes] = candidate[3].blank? ? candidate[5].to_i : candidate[3].to_i
306
+ c[:general_pct] = candidate[4].to_f
307
+ results << c
308
+ end
309
+ Result.create_from_results(results)
310
+ end
311
+
312
+ def primary_election_results_2000(options={})
313
+ results = []
314
+ t = RemoteTable.new(url.last, :sheet => 'Primary Results by State')
315
+ rows = t.entries
316
+ rows = rows.select{|r| r['STATE'] == options[:state]} if options[:state]
317
+ rows.each do |candidate|
318
+ next if candidate['PARTY'].blank?
319
+ next if candidate['CANDIDATE'] == 'Total Party Votes'
320
+ c = {:year => year}
321
+ c[:date] = nil
322
+ c[:chamber] = "P"
323
+ c[:state] = candidate['STATE']
324
+ c[:party] = candidate['PARTY']
325
+ c[:incumbent] = false
326
+ c[:fec_id] = nil
327
+ c[:candidate_first] = candidate['CANDIDATE'].split(', ')[1]
328
+ c[:candidate_last] = candidate['CANDIDATE'].split(', ')[0]
329
+ c[:candidate_suffix] = candidate['CANDIDATE'].split(', ').last if candidate['CANDIDATE'].split(', ').size > 2
330
+ c[:candidate_name] = candidate['CANDIDATE']
331
+ c[:primary_votes] = candidate['# OF VOTES'].to_i
332
+ c[:primary_pct] = candidate['PERCENT'].to_f
333
+ results << c
334
+ end
335
+ Result.create_from_results(results)
336
+ end
337
+
338
+
339
+ end
340
+ end
@@ -0,0 +1,48 @@
1
+ module FecResults
2
+ class Result
3
+
4
+ attr_reader :year, :date, :chamber, :state, :district, :fec_id, :incumbent, :candidate_last, :candidate_first, :candidate_name, :party,
5
+ :primary_votes, :primary_pct, :primary_unopposed, :runoff_votes, :runoff_pct, :general_votes, :general_pct, :general_unopposed,
6
+ :general_runoff_votes, :general_runoff_pct, :general_combined_party_votes, :general_combined_party_pct, :general_winner, :notes
7
+
8
+ def initialize(params={})
9
+ params.each_pair do |k,v|
10
+ instance_variable_set("@#{k}", v)
11
+ end
12
+ end
13
+
14
+ def to_s
15
+ "#<FecResults::Result:#{year.to_s}:#{chamber}:#{state}:#{district.to_i}>"
16
+ end
17
+
18
+ def self.create_from_results(results)
19
+ results.map{|r|
20
+ self.new :year => r[:year],
21
+ :date => r[:date],
22
+ :chamber => r[:chamber],
23
+ :state => r[:state],
24
+ :district => r[:district],
25
+ :fec_id => r[:fec_id],
26
+ :incumbent => r[:incumbent],
27
+ :candidate_last => r[:candidate_last],
28
+ :candidate_first => r[:candidate_first],
29
+ :candidate_suffix => r[:candidate_suffix],
30
+ :candidate_name => r[:candidate_name],
31
+ :party => r[:party],
32
+ :primary_votes => r[:primary_votes],
33
+ :primary_pct => r[:primary_pct],
34
+ :primary_unopposed => r[:primary_unopposed],
35
+ :runoff_votes => r[:runoff_votes],
36
+ :runoff_pct => r[:runoff_pct],
37
+ :general_votes => r[:general_votes],
38
+ :general_pct => r[:general_pct],
39
+ :general_unopposed => r[:general_unopposed],
40
+ :general_runoff_votes => r[:general_runoff_votes],
41
+ :general_runoff_pct => r[:general_runoff_pct],
42
+ :general_combined_party_votes => r[:general_combined_party_votes],
43
+ :general_combined_party_pct => r[:general_combined_party_pct],
44
+ :general_winner => r[:general_winner],
45
+ :notes => r[:notes]}
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,558 @@
1
+ module FecResults
2
+ class Summary
3
+
4
+ attr_reader :year, :url
5
+
6
+ def initialize(params={})
7
+ params.each_pair do |k,v|
8
+ instance_variable_set("@#{k}", v)
9
+ end
10
+ @url = FecResults::SUMMARY_URLS[year.to_s]
11
+ end
12
+
13
+ def to_s
14
+ "#<FecResults::Summary:#{year.to_s}>"
15
+ end
16
+
17
+ #### main instance methods called with optional arguments to filter.
18
+
19
+ def general_election_votes(*args)
20
+ send("process_general_election_votes_#{year}", *args)
21
+ end
22
+
23
+ def general_election_votes_by_party(*args)
24
+ send("process_general_election_votes_by_party_#{year}", *args)
25
+ end
26
+
27
+ def congressional_votes_by_election(*args)
28
+ send("process_congressional_votes_by_election_#{year}", *args)
29
+ end
30
+
31
+ def chamber_votes_by_party(*args)
32
+ send("process_chamber_votes_by_party_#{year}", *args)
33
+ end
34
+
35
+ def house_party_gains(*args)
36
+ raise NotImplementedError.new("This method not available for #{year}") unless year == 2010
37
+ send("process_house_party_gains_#{year}")
38
+ end
39
+
40
+ def party_labels
41
+ send("party_labels_#{year}")
42
+ end
43
+
44
+ #### cycle-specific methods called by main methods above
45
+
46
+ def process_general_election_votes_2012(options={})
47
+ results = []
48
+ t = RemoteTable.new(url, :sheet => 'Table 3.GEVotes for Pres, H & S', :skip => 2)
49
+ rows = t.entries
50
+ rows = rows.select{|r| r['State'] == options[:state]} if options[:state]
51
+ rows.each do |row|
52
+ break if row['State'] == 'Total:'
53
+ pres_votes = row['Presidential Vote'].to_i == 0 ? nil : row['Presidential Vote'].to_i
54
+ sen_votes = row['U.S. Senate Vote'].to_i == 0 ? nil : row['U.S. Senate Vote'].to_i
55
+ results << OpenStruct.new(:state => row['State'], :presidential_votes => pres_votes, :senate_votes => sen_votes, :house_votes => row['U.S. House Vote'].to_i)
56
+ end
57
+ results
58
+ end
59
+
60
+ def process_general_election_votes_2010(options={})
61
+ results = []
62
+ t = RemoteTable.new(url, :sheet => 'Table 1. GE Votes Cast for Cong', :skip => 2)
63
+ rows = t.entries
64
+ rows = rows.select{|r| r['STATE ABBREVIATION'] == options[:state]} if options[:state]
65
+ rows.each do |row|
66
+ break if row['STATE ABBREVIATION'] == 'Total:'
67
+ sen_votes = row['U.S. SENATE VOTE'].to_i == 0 ? nil: row['U.S. SENATE VOTE'].to_i
68
+ results << OpenStruct.new(:state => row['STATE'], :state_abbrev => row['STATE ABBREVIATION'], :senate_votes => sen_votes, :house_votes => row['U.S. HOUSE VOTE'].to_i)
69
+ end
70
+ results
71
+ end
72
+
73
+ def process_general_election_votes_2008(options={})
74
+ results = []
75
+ t = RemoteTable.new(url, :sheet => 'Table 3.GEVotes for Pres, H & S', :skip => 2)
76
+ rows = t.entries
77
+ rows = rows.select{|r| r['State'] == options[:state]} if options[:state]
78
+ rows.each do |row|
79
+ break if row['State'] == 'Total:'
80
+ pres_votes = row['Presidential Vote'].to_i == 0 ? nil : row['Presidential Vote'].to_i
81
+ sen_votes = row['U.S. Senate Vote'].to_i == 0 ? nil : row['U.S. Senate Vote'].to_i
82
+ results << OpenStruct.new(:state_abbrev => row['State'], :presidential_votes => pres_votes, :senate_votes => sen_votes, :house_votes => row['U.S. House Vote'].to_i)
83
+ end
84
+ results
85
+ end
86
+
87
+ def process_general_election_votes_2006(options={})
88
+ results = []
89
+ t = RemoteTable.new(url, :sheet => 'Table 1. GE Votes by State ', :skip => 2)
90
+ rows = t.entries
91
+ rows = rows.select{|r| r['State'] == options[:state]} if options[:state]
92
+ rows.each do |row|
93
+ break if row['State'] == 'Total:'
94
+ sen_votes = row['U.S. Senate Vote'].to_i == 0 ? nil : row['U.S. Senate Vote'].to_i
95
+ results << OpenStruct.new(:state_abbrev => row['State'], :senate_votes => sen_votes, :house_votes => row['U.S. House Vote'].to_i, :total_votes => row['Combined Vote'].to_i)
96
+ end
97
+ results
98
+ end
99
+
100
+ def process_general_election_votes_2004(options={})
101
+ results = []
102
+ t = RemoteTable.new(url, :sheet => 'Table 3. GE Votes by State', :skip => 2)
103
+ rows = t.entries
104
+ rows = rows.select{|r| r['State'] == options[:state]} if options[:state]
105
+ rows.each do |row|
106
+ break if row['State'] == 'Total:'
107
+ pres_votes = row['Presidential Vote'].to_i == 0 ? nil : row['Presidential Vote'].to_i
108
+ sen_votes = row['U.S. Senate Vote'].to_i == 0 ? nil : row['U.S. Senate Vote'].to_i
109
+ results << OpenStruct.new(:state_abbrev => row['State'], :presidential_votes => pres_votes, :senate_votes => sen_votes, :house_votes => row['U.S. House Vote'].to_i)
110
+ end
111
+ results
112
+ end
113
+
114
+ def process_general_election_votes_2002(options={})
115
+ raise NotImplementedError.new("This method not available for 2002")
116
+ end
117
+
118
+ def process_general_election_votes_2000(options={})
119
+ results = []
120
+ t = RemoteTable.new(url, :sheet => 'GE Votes- Pres,Sen,House-p.4', :skip => 1)
121
+ rows = t.entries
122
+ rows = rows.select{|r| r['State'] == options[:state]} if options[:state]
123
+ rows.each do |row|
124
+ break if row['State'] == 'Total:'
125
+ pres_votes = row['Presidential Vote'].to_i == 0 ? nil : row['Presidential Vote'].to_i
126
+ sen_votes = row['U.S. Senate Vote'].to_i == 0 ? nil : row['U.S. Senate Vote'].to_i
127
+ results << OpenStruct.new(:state_abbrev => row['State'], :presidential_votes => pres_votes, :senate_votes => sen_votes, :house_votes => row['U.S. House Vote'].to_i)
128
+ end
129
+ results
130
+ end
131
+
132
+ def process_general_election_votes_by_party_2012(options={})
133
+ results = []
134
+ t = RemoteTable.new(url, :sheet => 'Table 4. GE Votes Cast by Party', :skip => 3)
135
+ rows = t.entries
136
+ rows = rows.select{|r| r['State'] == options[:state]} if options[:state]
137
+ rows.each do |row|
138
+ break if row['State'] == 'Total:'
139
+ dem_votes = row['Democratic Candidates'].to_i == 0 ? nil : row['Democratic Candidates'].to_i
140
+ gop_votes = row['Republican Candidates'].to_i == 0 ? nil : row['Republican Candidates'].to_i
141
+ other_votes = row['Other Candidates'].to_i == 0 ? nil : row['Other Candidates'].to_i
142
+ results << OpenStruct.new(:state_abbrev => row['State'], :democratic_candidates => dem_votes, :republican_candidates => gop_votes, :other_candidates => other_votes)
143
+ end
144
+ results
145
+ end
146
+
147
+ def process_general_election_votes_by_party_2010(options={})
148
+ results = []
149
+ t = RemoteTable.new(url, :sheet => 'Table 2. GE Votes by Party', :skip => 4, :headers => false)
150
+ rows = t.entries
151
+ rows = rows.select{|r| r[1] == options[:state]} if options[:state]
152
+ rows.each do |row|
153
+ break if row[1] == 'Total:'
154
+ dem_votes = row[2].to_i == 0 ? nil : row[2].to_i
155
+ gop_votes = row[3].to_i == 0 ? nil : row[3].to_i
156
+ other_votes = row[4].to_i == 0 ? nil : row[4].to_i
157
+ results << OpenStruct.new(:state => row[0], :state_abbrev => row[1], :democratic_candidates => dem_votes, :republican_candidates => gop_votes, :other_candidates => other_votes)
158
+ end
159
+ results
160
+ end
161
+
162
+ def process_general_election_votes_by_party_2008(options={})
163
+ results = []
164
+ t = RemoteTable.new(url, :sheet => 'Table 4. GE Votes Cast by Party', :skip => 3)
165
+ rows = t.entries
166
+ rows = rows.select{|r| r['State'] == options[:state]} if options[:state]
167
+ rows.each do |row|
168
+ break if row['State'] == 'Total:'
169
+ dem_votes = row['Democratic Candidates'].to_i == 0 ? nil : row['Democratic Candidates'].to_i
170
+ gop_votes = row['Republican Candidates'].to_i == 0 ? nil : row['Republican Candidates'].to_i
171
+ other_votes = row['Other Candidates'].to_i == 0 ? nil : row['Other Candidates'].to_i
172
+ results << OpenStruct.new(:state_abbrev => row['State'], :democratic_candidates => dem_votes, :republican_candidates => gop_votes, :other_candidates => other_votes)
173
+ end
174
+ results
175
+ end
176
+
177
+ def process_general_election_votes_by_party_2006(options={})
178
+ results = []
179
+ t = RemoteTable.new(url, :sheet => 'Table 2. GE Votes by Party', :skip => 3)
180
+ rows = t.entries
181
+ rows = rows.select{|r| r['State'] == options[:state]} if options[:state]
182
+ rows.each do |row|
183
+ break if row['State'] == 'Total:'
184
+ dem_votes = row['Democratic Candidates'].to_i == 0 ? nil : row['Democratic Candidates'].to_i
185
+ gop_votes = row['Republican Candidates'].to_i == 0 ? nil : row['Republican Candidates'].to_i
186
+ other_votes = row['Other Candidates'].to_i == 0 ? nil : row['Other Candidates'].to_i
187
+ results << OpenStruct.new(:state_abbrev => row['State'], :democratic_candidates => dem_votes, :republican_candidates => gop_votes, :other_candidates => other_votes)
188
+ end
189
+ results
190
+ end
191
+
192
+ def process_general_election_votes_by_party_2004(options={})
193
+ results = []
194
+ t = RemoteTable.new(url, :sheet => 'Table 4. GE Votes by Party', :skip => 3)
195
+ rows = t.entries
196
+ rows = rows.select{|r| r['State'] == options[:state]} if options[:state]
197
+ rows.each do |row|
198
+ break if row['State'] == 'Total:'
199
+ dem_votes = row['Democratic Candidates'].to_i == 0 ? nil : row['Democratic Candidates'].to_i
200
+ gop_votes = row['Republican Candidates'].to_i == 0 ? nil : row['Republican Candidates'].to_i
201
+ other_votes = row['Other Candidates'].to_i == 0 ? nil : row['Other Candidates'].to_i
202
+ results << OpenStruct.new(:state_abbrev => row['State'], :democratic_candidates => dem_votes, :republican_candidates => gop_votes, :other_candidates => other_votes)
203
+ end
204
+ results
205
+ end
206
+
207
+ def process_general_election_votes_by_party_2002(options={})
208
+ raise NotImplementedError.new("This method not available for 2002")
209
+ end
210
+
211
+ def process_general_election_votes_by_party_2000(options={})
212
+ results = []
213
+ t = RemoteTable.new(url, :sheet => 'GE Votes by Party -p.5', :skip => 1)
214
+ rows = t.entries
215
+ rows = rows.select{|r| r['State'] == options[:state]} if options[:state]
216
+ rows.each do |row|
217
+ break if row['State'] == 'Total:'
218
+ dem_votes = row['Democratic Candidates'].to_i == 0 ? nil : row['Democratic Candidates'].to_i
219
+ gop_votes = row['Republican Candidates'].to_i == 0 ? nil : row['Republican Candidates'].to_i
220
+ other_votes = row['Other Candidates'].to_i == 0 ? nil : row['Other Candidates'].to_i
221
+ results << OpenStruct.new(:state_abbrev => row['State'], :democratic_candidates => dem_votes, :republican_candidates => gop_votes, :other_candidates => other_votes)
222
+ end
223
+ results
224
+ end
225
+
226
+ def process_congressional_votes_by_election_2012(options={})
227
+ results = []
228
+ t = RemoteTable.new(url, :sheet => 'Table 5. P&G VotesCastforCong', :skip => 4, :headers => false)
229
+ rows = t.entries
230
+ rows = rows.select{|r| r[0] == options[:state]} if options[:state]
231
+ rows.each do |row|
232
+ break if row[0] == 'Total:'
233
+ senate_primary_votes = row[1].to_i == 0 ? nil : row[1].to_i
234
+ senate_general_votes = row[2].to_i == 0 ? nil : row[2].to_i
235
+ house_primary_votes = row[3].to_i == 0 ? nil : row[3].to_i
236
+ house_general_votes = row[4].to_i == 0 ? nil : row[4].to_i
237
+ results << OpenStruct.new(:state_abbrev => row[0], :senate_primary_votes => senate_primary_votes, :senate_general_votes => senate_general_votes, :house_primary_votes => house_primary_votes, :house_general_votes => house_general_votes)
238
+ end
239
+ results
240
+ end
241
+
242
+ def process_congressional_votes_by_election_2010(options={})
243
+ results = []
244
+ t = RemoteTable.new(url, :sheet => 'Table 3. Prim & Gen Votes Cast', :skip => 2)
245
+ rows = t.entries
246
+ rows = rows.select{|r| r['STATE ABBREVIATION'] == options[:state]} if options[:state]
247
+ rows.each do |row|
248
+ break if row['STATE ABBREVIATION'] == 'Total:'
249
+ senate_primary_votes = row['PRIMARY U.S. SENATE VOTE'].to_i == 0 ? nil : row['PRIMARY U.S. SENATE VOTE'].to_i
250
+ senate_general_votes = row['GENERAL U.S. SENATE VOTE'].to_i == 0 ? nil : row['GENERAL U.S. SENATE VOTE'].to_i
251
+ house_primary_votes = row['PRIMARY U.S. HOUSE VOTE'].to_i == 0 ? nil : row['PRIMARY U.S. HOUSE VOTE'].to_i
252
+ house_general_votes = row['GENERAL U.S. HOUSE VOTE'].to_i == 0 ? nil : row['GENERAL U.S. HOUSE VOTE'].to_i
253
+ results << OpenStruct.new(:state => row['STATE'], :state_abbrev => row['STATE ABBREVIATION'], :senate_primary_votes => senate_primary_votes, :senate_general_votes => senate_general_votes, :house_primary_votes => house_primary_votes, :house_general_votes => house_general_votes)
254
+ end
255
+ results
256
+ end
257
+
258
+ def process_congressional_votes_by_election_2008(options={})
259
+ results = []
260
+ t = RemoteTable.new(url, :sheet => 'Table 5. P&G VotesCastforCong', :skip => 4, :headers => false)
261
+ rows = t.entries
262
+ rows = rows.select{|r| r[0] == options[:state]} if options[:state]
263
+ rows.each do |row|
264
+ break if row[0] == 'Total:'
265
+ senate_primary_votes = row[1].to_i == 0 ? nil : row[1].to_i
266
+ senate_general_votes = row[2].to_i == 0 ? nil : row[2].to_i
267
+ house_primary_votes = row[3].to_i == 0 ? nil : row[3].to_i
268
+ house_general_votes = row[4].to_i == 0 ? nil : row[4].to_i
269
+ results << OpenStruct.new(:state_abbrev => row[0], :senate_primary_votes => senate_primary_votes, :senate_general_votes => senate_general_votes, :house_primary_votes => house_primary_votes, :house_general_votes => house_general_votes)
270
+ end
271
+ results
272
+ end
273
+
274
+ def process_congressional_votes_by_election_2006(options={})
275
+ results = []
276
+ t = RemoteTable.new(url, :sheet => 'Table 3. P&G Votes for Congress', :skip => 2)
277
+ rows = t.entries
278
+ rows = rows.select{|r| r['State'] == options[:state]} if options[:state]
279
+ rows.each do |row|
280
+ break if row['State'] == 'Total:'
281
+ senate_primary_votes = row['PRIMARY U.S. Senate Vote'].to_i == 0 ? nil : row['PRIMARY U.S. Senate Vote'].to_i
282
+ senate_general_votes = row['GENERAL U.S. Senate Vote'].to_i == 0 ? nil : row['GENERAL U.S. Senate Vote'].to_i
283
+ house_primary_votes = row['PRIMARY U.S. House Vote'].to_i == 0 ? nil : row['PRIMARY U.S. House Vote'].to_i
284
+ house_general_votes = row['GENERAL U.S. House Vote'].to_i == 0 ? nil : row['GENERAL U.S. House Vote'].to_i
285
+ results << OpenStruct.new(:state_abbrev => row['State'], :senate_primary_votes => senate_primary_votes, :senate_general_votes => senate_general_votes, :house_primary_votes => house_primary_votes, :house_general_votes => house_general_votes)
286
+ end
287
+ results
288
+ end
289
+
290
+ def process_congressional_votes_by_election_2004(options={})
291
+ results = []
292
+ t = RemoteTable.new(url, :sheet => 'Table 5. P&G Votes for Congress', :skip => 2)
293
+ rows = t.entries
294
+ rows = rows.select{|r| r['State'] == options[:state]} if options[:state]
295
+ rows.each do |row|
296
+ break if row['State'] == 'Total:'
297
+ senate_primary_votes = row['PRIMARY U.S. Senate Vote'].to_i == 0 ? nil : row['PRIMARY U.S. Senate Vote'].to_i
298
+ senate_general_votes = row['GENERAL U.S. Senate Vote'].to_i == 0 ? nil : row['GENERAL U.S. Senate Vote'].to_i
299
+ house_primary_votes = row['PRIMARY U.S. House Vote'].to_i == 0 ? nil : row['PRIMARY U.S. House Vote'].to_i
300
+ house_general_votes = row['GENERAL U.S. House Vote'].to_i == 0 ? nil : row['GENERAL U.S. House Vote'].to_i
301
+ results << OpenStruct.new(:state_abbrev => row['State'], :senate_primary_votes => senate_primary_votes, :senate_general_votes => senate_general_votes, :house_primary_votes => house_primary_votes, :house_general_votes => house_general_votes)
302
+ end
303
+ results
304
+ end
305
+
306
+ def process_congressional_votes_by_election_2002(options={})
307
+ results = []
308
+ t = RemoteTable.new(url, :sheet => 'Table 1. Primary & General Vote', :skip => 4, :headers => false)
309
+ rows = t.entries
310
+ rows = rows.select{|r| r[0] == options[:state]} if options[:state]
311
+ rows.each do |row|
312
+ break if row[0] == 'Total:'
313
+ senate_primary_votes = row[1].to_i == 0 ? nil : row[1].to_i
314
+ senate_general_votes = row[2].to_i == 0 ? nil : row[2].to_i
315
+ house_primary_votes = row[3].to_i == 0 ? nil : row[3].to_i
316
+ house_general_votes = row[4].to_i == 0 ? nil : row[4].to_i
317
+ results << OpenStruct.new(:state_abbrev => row[0], :senate_primary_votes => senate_primary_votes, :senate_general_votes => senate_general_votes, :house_primary_votes => house_primary_votes, :house_general_votes => house_general_votes)
318
+ end
319
+ results
320
+ end
321
+
322
+ def process_congressional_votes_by_election_2000(options={})
323
+ results = []
324
+ t = RemoteTable.new(url, :sheet => 'P&G Votes-US Congress-p. 6', :skip => 1)
325
+ rows = t.entries
326
+ rows = rows.select{|r| r['State'] == options[:state]} if options[:state]
327
+ rows.each do |row|
328
+ break if row['State'] == 'Total:'
329
+ senate_primary_votes = row['Primary U.S. Senate Vote'].to_i == 0 ? nil : row['Primary U.S. Senate Vote'].to_i
330
+ senate_general_votes = row['General U.S. Senate Vote'].to_i == 0 ? nil : row['General U.S. Senate Vote'].to_i
331
+ house_primary_votes = row['Primary U.S. House Vote'].to_i == 0 ? nil : row['Primary U.S. House Vote'].to_i
332
+ house_general_votes = row['General U.S. House Vote'].to_i == 0 ? nil : row['General U.S. House Vote'].to_i
333
+ results << OpenStruct.new(:state_abbrev => row['State'], :senate_primary_votes => senate_primary_votes, :senate_general_votes => senate_general_votes, :house_primary_votes => house_primary_votes, :house_general_votes => house_general_votes)
334
+ end
335
+ results
336
+ end
337
+
338
+ # columns are dem primary, gop primary, other primary, dem general, gop general, other general
339
+ # runoff election votes are included in the primary totals
340
+ def process_chamber_votes_by_party_2012(options={})
341
+ results = []
342
+ sheet = options[:chamber] == 'senate' ? 'Table 6. Senate by Party' : 'Table 7. House by Party'
343
+ t = RemoteTable.new(url, :sheet => sheet, :skip => 4, :headers => false)
344
+ rows = t.entries
345
+ rows = rows.select{|r| r[0] == options[:state]} if options[:state]
346
+ rows.each do |row|
347
+ break if row[0] == 'Total:'
348
+ dem_primary = row[1].to_i == 0 ? nil : row[1].to_i
349
+ gop_primary = row[2].to_i == 0 ? nil : row[2].to_i
350
+ other_primary = row[3].to_i == 0 ? nil : row[3].to_i
351
+ dem_general = row[4].to_i == 0 ? nil : row[4].to_i
352
+ gop_general = row[5].to_i == 0 ? nil : row[5].to_i
353
+ other_general = row[6].to_i == 0 ? nil : row[6].to_i
354
+ results << OpenStruct.new(:state_abbrev => row[0], :democratic_primary_votes => dem_primary, :republican_primary_votes => gop_primary, :other_primary_votes => other_primary,
355
+ :democratic_general_votes => dem_general, :republican_general_votes => gop_general, :other_general_votes => other_general)
356
+ end
357
+ results
358
+ end
359
+
360
+ def process_chamber_votes_by_party_2010(options={})
361
+ results = []
362
+ sheet = options[:chamber] == 'senate' ? 'Table 4. Senate by Party' : 'Table 5. House by Party'
363
+ t = RemoteTable.new(url, :sheet => sheet, :skip => 2)
364
+ rows = t.entries
365
+ rows = rows.select{|r| r['STATE ABBREVIATION'] == options[:state]} if options[:state]
366
+ rows.each do |row|
367
+ break if row['STATE ABBREVIATION'] == 'Total:'
368
+ dem_primary = row['PRIMARY ELECTION DEMOCRATIC'].to_i == 0 ? nil : row['PRIMARY ELECTION DEMOCRATIC'].to_i
369
+ gop_primary = row['PRIMARY ELECTION REPUBLICAN'].to_i == 0 ? nil : row['PRIMARY ELECTION REPUBLICAN'].to_i
370
+ other_primary = row['PRIMARY ELECTION OTHER'].to_i == 0 ? nil : row['PRIMARY ELECTION OTHER'].to_i
371
+ dem_general = row['GENERAL ELECTION DEMOCRATIC'].to_i == 0 ? nil : row['GENERAL ELECTION DEMOCRATIC'].to_i
372
+ gop_general = row['GENERAL ELECTION REPUBLICAN'].to_i == 0 ? nil : row['GENERAL ELECTION REPUBLICAN'].to_i
373
+ other_general = row['GENERAL ELECTION OTHER'].to_i == 0 ? nil : row['GENERAL ELECTION OTHER'].to_i
374
+ results << OpenStruct.new(:state => row['STATE'], :state_abbrev => row['STATE ABBREVIATION'], :democratic_primary_votes => dem_primary, :republican_primary_votes => gop_primary, :other_primary_votes => other_primary,
375
+ :democratic_general_votes => dem_general, :republican_general_votes => gop_general, :other_general_votes => other_general)
376
+ end
377
+ results
378
+ end
379
+
380
+ def process_chamber_votes_by_party_2008(options={})
381
+ results = []
382
+ sheet = options[:chamber] == 'senate' ? 'Table 6. Senate by Party' : 'Table 7. House by Party'
383
+ t = RemoteTable.new(url, :sheet => sheet, :skip => 4, :headers => false)
384
+ rows = t.entries
385
+ rows = rows.select{|r| r[0] == options[:state]} if options[:state]
386
+ rows.each do |row|
387
+ break if row[0] == 'Total:'
388
+ dem_primary = row[1].to_i == 0 ? nil : row[1].to_i
389
+ gop_primary = row[2].to_i == 0 ? nil : row[2].to_i
390
+ other_primary = row[3].to_i == 0 ? nil : row[3].to_i
391
+ dem_general = row[4].to_i == 0 ? nil : row[4].to_i
392
+ gop_general = row[5].to_i == 0 ? nil : row[5].to_i
393
+ other_general = row[6].to_i == 0 ? nil : row[6].to_i
394
+ results << OpenStruct.new(:state_abbrev => row[0], :democratic_primary_votes => dem_primary, :republican_primary_votes => gop_primary, :other_primary_votes => other_primary,
395
+ :democratic_general_votes => dem_general, :republican_general_votes => gop_general, :other_general_votes => other_general)
396
+ end
397
+ results
398
+ end
399
+
400
+ def process_chamber_votes_by_party_2006(options={})
401
+ results = []
402
+ sheet = options[:chamber] == 'senate' ? 'Table 4. Senate Votes by Party' : 'Table 5. House Votes by Party'
403
+ t = RemoteTable.new(url, :sheet => sheet, :skip => 2)
404
+ rows = t.entries
405
+ rows = rows.select{|r| r['State'] == options[:state]} if options[:state]
406
+ rows.each do |row|
407
+ break if row['State'] == 'Total:'
408
+ dem_primary = row['PRIMARY Democratic'].to_i == 0 ? nil : row['PRIMARY Democratic'].to_i
409
+ gop_primary = row['PRIMARY Republican'].to_i == 0 ? nil : row['PRIMARY Republican'].to_i
410
+ other_primary = row['PRIMARY Other'].to_i == 0 ? nil : row['PRIMARY Other'].to_i
411
+ dem_general = row['GENERAL Democratic'].to_i == 0 ? nil : row['GENERAL Democratic'].to_i
412
+ gop_general = row['GENERAL Republican'].to_i == 0 ? nil : row['GENERAL Republican'].to_i
413
+ other_general = row['GENERAL Other'].to_i == 0 ? nil : row['GENERAL Other'].to_i
414
+ results << OpenStruct.new(:state_abbrev => row['State'], :democratic_primary_votes => dem_primary, :republican_primary_votes => gop_primary, :other_primary_votes => other_primary,
415
+ :democratic_general_votes => dem_general, :republican_general_votes => gop_general, :other_general_votes => other_general)
416
+ end
417
+ results
418
+ end
419
+
420
+ def process_chamber_votes_by_party_2004(options={})
421
+ results = []
422
+ sheet = options[:chamber] == 'senate' ? 'Table 6. Senate Votes by Party' : 'Table 7. House Votes by Party'
423
+ state = options[:chamber] == 'senate' ? 'STATE' : 'State'
424
+ t = RemoteTable.new(url, :sheet => sheet, :skip => 2)
425
+ rows = t.entries
426
+ rows = rows.select{|r| r[state] == options[:state]} if options[:state]
427
+ rows.each do |row|
428
+ break if row[state] == 'Total:'
429
+ dem_primary = row['PRIMARY Democratic'].to_i == 0 ? nil : row['PRIMARY Democratic'].to_i
430
+ gop_primary = row['PRIMARY Republican'].to_i == 0 ? nil : row['PRIMARY Republican'].to_i
431
+ other_primary = row['PRIMARY Other'].to_i == 0 ? nil : row['PRIMARY Other'].to_i
432
+ dem_general = row['GENERAL Democratic'].to_i == 0 ? nil : row['GENERAL Democratic'].to_i
433
+ gop_general = row['GENERAL Republican'].to_i == 0 ? nil : row['GENERAL Republican'].to_i
434
+ other_general = row['GENERAL Other'].to_i == 0 ? nil : row['GENERAL Other'].to_i
435
+ results << OpenStruct.new(:state_abbrev => row[state], :democratic_primary_votes => dem_primary, :republican_primary_votes => gop_primary, :other_primary_votes => other_primary,
436
+ :democratic_general_votes => dem_general, :republican_general_votes => gop_general, :other_general_votes => other_general)
437
+ end
438
+ results
439
+ end
440
+
441
+ def process_chamber_votes_by_party_2002(options={})
442
+ results = []
443
+ sheet = options[:chamber] == 'senate' ? 'Table 2. Senate Votes by Party' : 'Table 3. House Votes by Party'
444
+ t = RemoteTable.new(url, :sheet => sheet, :skip => 4, :headers => false)
445
+ rows = t.entries
446
+ rows = rows.select{|r| r[0] == options[:state]} if options[:state]
447
+ rows.each do |row|
448
+ break if row[0] == 'Total:'
449
+ dem_primary = row[1].to_i == 0 ? nil : row[1].to_i
450
+ gop_primary = row[2].to_i == 0 ? nil : row[2].to_i
451
+ other_primary = row[3].to_i == 0 ? nil : row[3].to_i
452
+ dem_general = row[4].to_i == 0 ? nil : row[4].to_i
453
+ gop_general = row[5].to_i == 0 ? nil : row[5].to_i
454
+ other_general = row[6].to_i == 0 ? nil : row[6].to_i
455
+ results << OpenStruct.new(:state_abbrev => row[0], :democratic_primary_votes => dem_primary, :republican_primary_votes => gop_primary, :other_primary_votes => other_primary,
456
+ :democratic_general_votes => dem_general, :republican_general_votes => gop_general, :other_general_votes => other_general)
457
+ end
458
+ results
459
+ end
460
+
461
+ def process_chamber_votes_by_party_2000(options={})
462
+ results = []
463
+ sheet = options[:chamber] == 'senate' ? 'Senate by Party-p. 7' : 'House by Party-p. 8'
464
+ t = RemoteTable.new(url, :sheet => sheet, :skip => 1)
465
+ rows = t.entries
466
+ rows = rows.select{|r| r['State'] == options[:state]} if options[:state]
467
+ rows.each do |row|
468
+ break if row['State'] == 'Total:'
469
+ dem_primary = row['Democratic Primary'].to_i == 0 ? nil : row['Democratic Primary'].to_i
470
+ gop_primary = row['Republican Primary'].to_i == 0 ? nil : row['Republican Primary'].to_i
471
+ other_primary = row['Other Primary'].to_i == 0 ? nil : row['Other Primary'].to_i
472
+ dem_general = row['Democratic General'].to_i == 0 ? nil : row['Democratic General'].to_i
473
+ gop_general = row['Republican General '].to_i == 0 ? nil : row['Republican General '].to_i
474
+ other_general = row['Other General '].to_i == 0 ? nil : row['Other General '].to_i
475
+ results << OpenStruct.new(:state_abbrev => row['State'], :democratic_primary_votes => dem_primary, :republican_primary_votes => gop_primary, :other_primary_votes => other_primary,
476
+ :democratic_general_votes => dem_general, :republican_general_votes => gop_general, :other_general_votes => other_general)
477
+ end
478
+ results
479
+ end
480
+
481
+ def process_house_party_gains_2010(options={})
482
+ results = []
483
+ t = RemoteTable.new(url, :sheet => 'Table 6. House Party Gains', :skip => 3)
484
+ rows = t.entries
485
+ rows = rows.select{|r| r['State'] == options[:state]} if options[:state]
486
+ rows.each do |row|
487
+ break if row['State'] == 'Total:'
488
+ results << OpenStruct.new(:state_abbrev => row['State'], :republican_seats_2010 => row['2010 Republican Seats'].to_i, :democratic_seats_2010 => row['2010 Democratic Seats'].to_i,
489
+ :republican_seats_2008 => row['2008 Republican Seats'].to_i, :democratic_seats_2008 => row['2008 Democratic Seats'].to_i, :change_in_republican_seats => row['Change in # of Republican Seats, 2008-2010'].to_i)
490
+ end
491
+ results
492
+ end
493
+
494
+ def party_labels_2012
495
+ results = []
496
+ t = RemoteTable.new(url, :sheet => '2012 Party Labels', :skip => 5, :headers => false)
497
+ t.entries.each do |row|
498
+ results << OpenStruct.new(:abbrev => row[0], :name => row[2])
499
+ end
500
+ results
501
+ end
502
+
503
+ def party_labels_2010
504
+ results = []
505
+ t = RemoteTable.new(FecResults::CONGRESS_URLS[year.to_s], :sheet => '2010 Party Labels', :skip => 5, :headers => false)
506
+ t.entries.each do |row|
507
+ results << OpenStruct.new(:abbrev => row[0], :name => row[2])
508
+ end
509
+ results
510
+ end
511
+
512
+ def party_labels_2008
513
+ results = []
514
+ t = RemoteTable.new(FecResults::PRESIDENT_URLS[year.to_s], :sheet => '2008 Party Labels', :skip => 5, :headers => false)
515
+ t.entries.each do |row|
516
+ results << OpenStruct.new(:abbrev => row[0], :name => row[2])
517
+ end
518
+ results
519
+ end
520
+
521
+ def party_labels_2006
522
+ results = []
523
+ t = RemoteTable.new(FecResults::CONGRESS_URLS[year.to_s], :sheet => '2006 Party Labels', :skip => 7, :headers => false)
524
+ t.entries.each do |row|
525
+ results << OpenStruct.new(:abbrev => row[0], :name => row[2])
526
+ end
527
+ results
528
+ end
529
+
530
+ def party_labels_2004
531
+ results = []
532
+ t = RemoteTable.new(FecResults::PRESIDENT_URLS[year.to_s], :sheet => '2004 Party Labels', :skip => 7, :headers => false)
533
+ t.entries.each do |row|
534
+ results << OpenStruct.new(:abbrev => row[0], :name => row[2])
535
+ end
536
+ results
537
+ end
538
+
539
+ def party_labels_2002
540
+ results = []
541
+ t = RemoteTable.new(url, :sheet => '2002 Party Labels', :skip => 3, :headers => false)
542
+ t.entries.each do |row|
543
+ results << OpenStruct.new(:abbrev => row[0], :name => row[2])
544
+ end
545
+ results
546
+ end
547
+
548
+ def party_labels_2000
549
+ results = []
550
+ t = RemoteTable.new(FecResults::PRESIDENT_URLS[year.to_s].first, :sheet => 'Guide to 2000 Party Labels', :headers => false)
551
+ t.entries.each do |row|
552
+ results << OpenStruct.new(:abbrev => row[0], :name => row[2])
553
+ end
554
+ results
555
+ end
556
+
557
+ end
558
+ end