hulse 0.0.1 → 0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NjllNjg3OGYwNTNkMjdlYzRhY2Y4ZjQ1Yjg4ZWJiNDA0ODQxZGY1Mg==
4
+ N2U1NzMxZWVmZWZmZDI3YTQ5YWNkNzg2ODIyMzE3NWI1ZjM2MWY3Ng==
5
5
  data.tar.gz: !binary |-
6
- ZWZiMzliODMzM2Y2NDM5MDA3MDJhNGEyMmZlYmI3YjIyMjUwOWUzOA==
6
+ MTlkN2I2N2EyOWIwNTQ4Y2YyZWIwN2JlYWZkYmVmYzE0ZDcxNWU5NA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- OGNiMjkxOGVmOTA1NGJmMzMzNWM2NGM1YmE3ZTA1NTcyNTcwZWNmNTdhNTRi
10
- MjMyODc0OWZhY2M0YTc1ODdmZjllNWIwZDZmOGU3MzQ5YWVmN2E1YzNlOWI0
11
- ZDFjNjQ2NWQwZmYzNzc0MTk0OTM3ZjhmYmE3NWM1YzZhOGExYTg=
9
+ OGM4NzAzMjNjM2FiYzA2ZWFlMDBlNjQyZTk4Yzk2NGEwYWI2NDkyMTFhYjAw
10
+ NWFjMGYzOThiMmY0YmY4NmZjYzljNjkzZGY1MDQwMjQ3MDhjZWM5ZmMxNTBk
11
+ NWE2NmI2N2U3MGRkMWJiZTlmMWIyMGQ5MzRhYjNjMGZjOGEzYjQ=
12
12
  data.tar.gz: !binary |-
13
- MGNkN2Y2NTcyNThhZTFlZGYzZDQ3OTRmY2MyYjVhZTU0OTE2MjVhYWVlN2Q0
14
- YWMxMjEyNGU1Mjk1NzNjMmE0NjRiZmNiMmJjOTdjZTY0ZTNhNWIzNzJiYjIw
15
- NDFmM2RlYzY2ZTEzZTllZDdhZDAyOGJlODRkYWRiNDg2NDljZTI=
13
+ Njk5MWY2MTE2ZGI0OWRkZjU1MWMzNzg2ZjNiMTZmN2FhZGExMzI3MDk2MDI0
14
+ OWEyM2I2ZDQyYjc3NWZjYTJhZGUwNzY2MzcxNWM0YzBlYTg2NjJhNDAyNTcz
15
+ ZTVkMGI4MjhiZDE2MTE3MmMzNGJmNmRlOGY3MDU3YzEzNjRhOWY=
data/README.md CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Hulse is a Ruby gem for accessing House and Senate roll call votes from the official sources on [house.gov](http://clerk.house.gov/evs/2013/index.asp) and [senate.gov](http://www.senate.gov/pagelayout/legislative/a_three_sections_with_teasers/votes.htm). It is developed under Ruby 1.9.3.
4
4
 
5
- Hulse has two classes, `HouseVote` and `SenateVote` which create Ruby objects using the XML attributes available from roll call vote data (voice votes are not covered by Hulse or available as data from official sources). Hulse makes a few changes, renaming some attributes for clarity and consistency, and collapsing each House vote's date and time into a single datetime attribute. Otherwise it does not alter the original data.
5
+ Hulse has two classes, `HouseVote` and `SenateVote`, which create Ruby objects using the XML attributes available from roll call vote data (voice votes are not covered by Hulse or available as data from official sources). Hulse makes a few changes, renaming some attributes for clarity and consistency, and collapsing each House vote's date and time into a single datetime attribute. Otherwise it does not alter the original data.
6
6
 
7
7
  `HouseVote` and `SenateVote` have different attributes due to parliamentary conventions and the presence or absence of data in one chamber or the other. Senators are uniquely identified by a `lis_member_id`; House members are uniquely identified by a `bioguide_id` beginning in 2003. Prior to 2003, there is no unique ID for House members, but using a combination of name, state and political party one can be manfactured. House member attributes also include an `unaccented_name` and an `name` attribute that may contain accent characters.
8
8
 
9
- Hulse is named for Carl Hulse, a longtime congressional correspondent for The New York Times.
9
+ Hulse is named for [Carl Hulse](https://www.nytimes.com/learning/students/ask_reporters/Carl_Hulse.html), a longtime congressional correspondent for The New York Times.
10
10
 
11
11
  ## Installation
12
12
 
data/hulse.gemspec CHANGED
@@ -21,4 +21,5 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency "bundler", "~> 1.5"
22
22
  spec.add_development_dependency "rake"
23
23
  spec.add_dependency "httparty"
24
+ spec.add_dependency "oj"
24
25
  end
@@ -1,21 +1,21 @@
1
1
  module Hulse
2
2
  class HouseVote
3
-
3
+
4
4
  attr_reader :majority, :congress, :session, :chamber, :vote_number, :bill_number, :question, :vote_type, :vote_result, :vote_timestamp, :description,
5
5
  :party_summary, :vote_count, :members, :amendment_number, :amendment_author
6
-
6
+
7
7
  def initialize(params={})
8
8
  params.each_pair do |k,v|
9
9
  instance_variable_set("@#{k}", v)
10
10
  end
11
- end
11
+ end
12
12
 
13
13
  def self.find(year, vote)
14
- url = "http://clerk.house.gov/evs/#{year.to_s}/roll#{vote}.xml"
14
+ url = "http://clerk.house.gov/evs/#{year.to_s}/roll#{vote.to_s.rjust(3,"0")}.xml"
15
15
  response = HTTParty.get(url)
16
16
  self.create_from_vote(response.parsed_response['rollcall_vote'])
17
17
  end
18
-
18
+
19
19
  def self.create_from_vote(response)
20
20
  party_totals = []
21
21
  response['vote_metadata']['vote_totals']['totals_by_party'].each do |p|
@@ -29,22 +29,22 @@ module Hulse
29
29
  m['legislator']['vote'] = m['vote']
30
30
  members << m['legislator'].inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo}
31
31
  end
32
- self.new(:majority => response['vote_metadata']['majority'],
33
- :congress => response['vote_metadata']['congress'].to_i,
34
- :session => response['vote_metadata']['session'],
35
- :chamber => response['vote_metadata']['chamber'],
36
- :vote_number => response['vote_metadata']['rollcall_num'].to_i,
37
- :bill_number => response['vote_metadata']['legis_num'],
38
- :question => response['vote_metadata']['vote_question'],
39
- :amendment_number => response['vote_metadata']['amendment_num'],
40
- :amendment_author => response['vote_metadata']['amendment_author'],
41
- :vote_type => response['vote_metadata']['vote_type'],
42
- :vote_result => response['vote_metadata']['vote_result'],
43
- :vote_timestamp => DateTime.parse(response['vote_metadata']['action_date'] + ' ' + response['vote_metadata']['action_time']['time_etz']),
44
- :description => response['vote_metadata']['vote_desc'],
45
- :party_summary => party_totals,
46
- :vote_count => response['vote_metadata']['vote_totals']['totals_by_vote'].reject{|k,v| k == 'total_stub'}.inject({}){|memo,(k,v)| memo[k.to_sym] = v.to_i; memo},
47
- :members => members)
32
+ self.new(majority: response['vote_metadata']['majority'],
33
+ congress: response['vote_metadata']['congress'].to_i,
34
+ session: response['vote_metadata']['session'],
35
+ chamber: response['vote_metadata']['chamber'],
36
+ vote_number: response['vote_metadata']['rollcall_num'].to_i,
37
+ bill_number: response['vote_metadata']['legis_num'],
38
+ question: response['vote_metadata']['vote_question'],
39
+ amendment_number: response['vote_metadata']['amendment_num'],
40
+ amendment_author: response['vote_metadata']['amendment_author'],
41
+ vote_type: response['vote_metadata']['vote_type'],
42
+ vote_result: response['vote_metadata']['vote_result'],
43
+ vote_timestamp: DateTime.parse(response['vote_metadata']['action_date'] + ' ' + response['vote_metadata']['action_time']['time_etz']),
44
+ description: response['vote_metadata']['vote_desc'],
45
+ party_summary: party_totals,
46
+ vote_count: response['vote_metadata']['vote_totals']['totals_by_vote'].reject{|k,v| k == 'total_stub'}.inject({}){|memo,(k,v)| memo[k.to_sym] = v.to_i; memo},
47
+ members: members)
48
48
  end
49
49
  end
50
50
  end
@@ -1,49 +1,49 @@
1
1
  module Hulse
2
2
  class SenateVote
3
-
4
- attr_reader :congress, :session, :year, :vote_number, :vote_timestamp, :updated_at, :vote_question_text, :vote_document_text,
3
+
4
+ attr_reader :congress, :session, :year, :vote_number, :vote_timestamp, :updated_at, :vote_question_text, :vote_document_text,
5
5
  :vote_result_text, :question, :vote_title, :majority_requirement, :vote_result, :document, :amendment, :vote_count, :tie_breaker, :members
6
-
6
+
7
7
  def initialize(params={})
8
8
  params.each_pair do |k,v|
9
9
  instance_variable_set("@#{k}", v)
10
10
  end
11
11
  end
12
-
12
+
13
13
  def self.find(year, vote)
14
14
  # TODO: need to special-case 2013 votes from 112th congress, 2nd session
15
15
  congress, session = Hulse::Utils.convert_year_to_congress_and_session(year)
16
- url = "http://www.senate.gov/legislative/LIS/roll_call_votes/vote#{congress.to_s}#{session.to_s}/vote_#{congress.to_s}_#{session.to_s}_#{vote.to_s.rjust(5,"0")}.xml"
16
+ url = "http://www.senate.gov/legislative/LIS/roll_call_votes/vote#{congress}#{session}/vote_#{congress}_#{session}_#{vote.to_s.rjust(5,"0")}.xml"
17
17
  response = HTTParty.get(url)
18
18
  self.create_from_vote(response.parsed_response['roll_call_vote'])
19
19
  end
20
-
20
+
21
21
  def self.create_from_vote(response)
22
22
  members = []
23
23
  response['members']['member'].each do |m|
24
24
  members << m.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo}
25
25
  end
26
- self.new(:congress => response['congress'].to_i,
27
- :session => response['session'].to_i,
28
- :year => response['congress_year'].to_i,
29
- :vote_number => response['vote_number'].to_i,
30
- :vote_timestamp => DateTime.parse(response['vote_date']),
31
- :updated_at => DateTime.parse(response['modify_date']),
32
- :vote_question_text => response['vote_question_text'],
33
- :vote_document_text => response['vote_document_text'],
34
- :vote_result_text => response['vote_result_text'],
35
- :question => response['question'],
36
- :vote_title => response['vote_title'],
37
- :majority_requirement => response['majority_requirement'],
38
- :vote_result => response['vote_result'],
39
- :document => response['document'].inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo},
40
- :amendment => response['amendment'].inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo},
41
- :vote_count => response['count'].inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo},
42
- :tie_breaker => response['tie_breaker'].inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo},
43
- :members => members
44
- )
26
+ self.new(congress: response['congress'].to_i,
27
+ session: response['session'].to_i,
28
+ year: response['congress_year'].to_i,
29
+ vote_number: response['vote_number'].to_i,
30
+ vote_timestamp: DateTime.parse(response['vote_date']),
31
+ updated_at: DateTime.parse(response['modify_date']),
32
+ vote_question_text: response['vote_question_text'],
33
+ vote_document_text: response['vote_document_text'],
34
+ vote_result_text: response['vote_result_text'],
35
+ question: response['question'],
36
+ vote_title: response['vote_title'],
37
+ majority_requirement: response['majority_requirement'],
38
+ vote_result: response['vote_result'],
39
+ document: response['document'].inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo},
40
+ amendment: response['amendment'].inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo},
41
+ vote_count: response['count'].inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo},
42
+ tie_breaker: response['tie_breaker'].inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo},
43
+ members: members
44
+ )
45
45
  end
46
-
47
-
46
+
47
+
48
48
  end
49
49
  end
data/lib/hulse/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Hulse
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1"
3
3
  end
data/lib/hulse.rb CHANGED
@@ -6,42 +6,19 @@ require 'oj'
6
6
 
7
7
  module Hulse
8
8
  class Utils
9
-
10
- CONGRESSES = {
11
- 2014 => 113,
12
- 2013 => 113,
13
- 2012 => 112,
14
- 2011 => 112,
15
- 2010 => 111,
16
- 2009 => 111,
17
- 2008 => 110,
18
- 2007 => 110,
19
- 2006 => 109,
20
- 2005 => 109,
21
- 2004 => 108,
22
- 2003 => 108,
23
- 2002 => 107,
24
- 2001 => 107,
25
- 2000 => 106,
26
- 1999 => 106,
27
- 1998 => 106,
28
- 1997 => 105,
29
- 1996 => 105,
30
- 1995 => 104,
31
- 1994 => 104,
32
- 1993 => 103,
33
- 1992 => 103,
34
- 1991 => 102,
35
- 1990 => 102,
36
- 1989 => 101
37
- }
38
-
9
+
10
+ # this function is more intuitive when you solve for the other side:
11
+ # year = 1789 + (2 * (congress - 1))
12
+ def self.congress_for_year(year)
13
+ ((year.to_i + 1) / 2) - 894
14
+ end
15
+
39
16
  def self.convert_year_to_congress_and_session(year)
40
- congress = CONGRESSES[year]
17
+ congress = congress_for_year year
41
18
  session = year.odd? ? 1 : 2
42
19
  return [congress, session]
43
20
  end
44
-
45
-
21
+
22
+
46
23
  end
47
24
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hulse
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: '0.1'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Derek Willis
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ! '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: oj
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  description: Turns House and Senate votes into Ruby objects for your legislative pleasure.
56
70
  email:
57
71
  - dwillis@gmail.com