govtrack 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +3 -0
- data/LICENSE.md +20 -0
- data/README.md +77 -0
- data/TODO.md +2 -0
- data/govtrack.gemspec +23 -0
- data/lib/govtrack.rb +9 -0
- data/lib/govtrack/base.rb +73 -0
- data/lib/govtrack/bill.rb +31 -0
- data/lib/govtrack/helper.rb +60 -0
- data/lib/govtrack/paginated_list.rb +26 -0
- data/lib/govtrack/person.rb +24 -0
- data/lib/govtrack/role.rb +11 -0
- data/lib/govtrack/version.rb +5 -0
- data/lib/govtrack/vote.rb +26 -0
- data/lib/govtrack/vote_voter.rb +26 -0
- data/spec/govtrack/bill_spec.rb +63 -0
- data/spec/govtrack/paginated_list_spec.rb +5 -0
- data/spec/govtrack/person_spec.rb +54 -0
- data/spec/govtrack/role_spec.rb +32 -0
- data/spec/govtrack/vote_spec.rb +36 -0
- data/spec/govtrack/vote_voter_spec.rb +53 -0
- data/spec/helper.rb +3 -0
- metadata +122 -0
data/CHANGELOG.md
ADDED
data/LICENSE.md
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2012 Noah Litvin
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
# GovTrack Gem
|
2
|
+
An unofficial Ruby wrapper for the [GovTrack API](http://www.govtrack.us/developers/api). You must agree to the surprisingly brief and readable [license terms](http://www.govtrack.us/developers/license) before using.
|
3
|
+
|
4
|
+
## Installation
|
5
|
+
|
6
|
+
gem install govtrack
|
7
|
+
|
8
|
+
Then ```require 'govtrack'``` and you're good to go.
|
9
|
+
|
10
|
+
## Usage
|
11
|
+
|
12
|
+
GovTrack data is supplied through various find methods:
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
sopa = GovTrack::Bill.find_by_id(71392) #Find SOPA with a GovTrack ID...
|
16
|
+
al = GovTrack::Person.find(firstname: 'Al', lastname: 'Franken') #...Al Franken with a hash of parameters...
|
17
|
+
john = GovTrack::Person.find_by_firstname_and_lastname('John','McCain') #...or John McCain with an ActiveRecord-style dynamic finder!
|
18
|
+
|
19
|
+
#Let's see if SOPA's sponsor is older than Al Franken.
|
20
|
+
sopa.sponsor.birthday < al.birthday
|
21
|
+
=> true
|
22
|
+
|
23
|
+
#Is he older than John McCain?
|
24
|
+
sopa.sponsor.birthday < john.birthday
|
25
|
+
=> false
|
26
|
+
```
|
27
|
+
|
28
|
+
**Not all fields can be used in a query.** Some fields support [Django-style filters](https://docs.djangoproject.com/en/dev/ref/models/querysets/#field-lookups) and some can span relationships. Refer to the [GovTrack Data API Documentation](http://www.govtrack.us/developers/api) for details.
|
29
|
+
|
30
|
+
### Pagination
|
31
|
+
By default, the API returns data in arrays of 20. You can adjust this amount and move through the results by setting ```:limit``` and ```:offset``` in your query. Alternatively, call ```.find``` with a block to iterate through all of the results.
|
32
|
+
|
33
|
+
```ruby
|
34
|
+
#Returns the titles of every bill currently introduced to the 112th Congress.
|
35
|
+
GovTrack::Bill.find(current_status: 'introduced', congress: 112) { |bill| bill.title }
|
36
|
+
```
|
37
|
+
|
38
|
+
## Examples
|
39
|
+
|
40
|
+
**See how Ron Paul and Dennis Kucinich voted on 'H.R. 3590: Patient Protection and Affordable Care Act':**
|
41
|
+
|
42
|
+
```ruby
|
43
|
+
obamacare = GovTrack::Bill.find_by_congress_and_bill_type_and_number(111,:house_bill,3590)
|
44
|
+
recent_obamacare_vote = GovTrack::Vote.find(related_bill: obamacare, order_by: "-created").first
|
45
|
+
|
46
|
+
ron = GovTrack::Person.find_by_nickname_and_lastname('Ron','Paul')
|
47
|
+
ron_vote = GovTrack::VoteVoter.find(vote: recent_obamacare_vote, person: ron)
|
48
|
+
"#{ron.name_no_details} voted '#{ron_vote.option.to_display_text}' on '#{obamacare.title}'."
|
49
|
+
=> "Ronald Paul voted 'No' on 'H.R. 3590 (111th): Patient Protection and Afforble Care Act'."
|
50
|
+
|
51
|
+
dennis = GovTrack::Person.find_by_firstname_and_lastname('Dennis','Kucinich')
|
52
|
+
dennis_vote = GovTrack::VoteVoter.find(vote: recent_obamacare_vote, person: dennis)
|
53
|
+
"#{dennis.name_no_details} voted '#{dennis_vote.option.to_display_text}' on '#{obamacare.title}'."
|
54
|
+
=> "Dennis Kucinich voted 'Aye' on 'H.R. 3590 (111th): Patient Protection and Affordble Care Act'."
|
55
|
+
```
|
56
|
+
|
57
|
+
**List the female members of congress who abstained from voting on 'H.R. 3: No Taxpayer Funding for Abortion Act':**
|
58
|
+
|
59
|
+
```ruby
|
60
|
+
hr3 = GovTrack::Bill.find_by_congress_and_bill_type_and_number(112,:house_bill,3)
|
61
|
+
recent_hr3_vote = GovTrack::Vote.find(related_bill: hr3, order_by: "-created").first
|
62
|
+
GovTrack::VoteVoter.find(vote: recent_hr3_vote) { |vote_voter|
|
63
|
+
vote_voter.person.name if vote_voter.option == '0' && vote_voter.person.gender == 'female'
|
64
|
+
}
|
65
|
+
=> "Rep. Gabrielle Giffords [D-AZ8, 2007-2012]"
|
66
|
+
=> "Rep. Jo Ann Emerson [R-MO8]"
|
67
|
+
```
|
68
|
+
|
69
|
+
## Tips
|
70
|
+
|
71
|
+
* If you're searching for a particular bill by its number, include a ```congress``` and ```bill_type``` in your query as well.
|
72
|
+
* There will often be more than one vote related to a bill.
|
73
|
+
* Depending on your application, consider using GovTrack's [Bulk Raw Data](http://www.govtrack.us/developers/data) instead.
|
74
|
+
|
75
|
+
## Copyright
|
76
|
+
|
77
|
+
Copyright (c) 2012 Noah Litvin. See [LICENSE](https://github.com/noahlitvin/govtrack/blob/master/LICENSE.md) for details.
|
data/TODO.md
ADDED
data/govtrack.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/govtrack/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.name = "govtrack"
|
6
|
+
gem.version = GovTrack::Gem::VERSION
|
7
|
+
gem.authors = ["Noah Litvin"]
|
8
|
+
gem.email = ["noah.litvin@gmail.com"]
|
9
|
+
gem.homepage = "https://github.com/noahlitvin/govtrack"
|
10
|
+
gem.summary = %q{A Ruby wrapper for the GovTrack API.}
|
11
|
+
gem.description = %q{A Ruby wrapper for the GovTrack API.}
|
12
|
+
|
13
|
+
gem.files = %w(CHANGELOG.md LICENSE.md README.md TODO.md govtrack.gemspec)
|
14
|
+
gem.files += Dir.glob("lib/**/*.rb")
|
15
|
+
gem.files += Dir.glob("spec/**/*")
|
16
|
+
|
17
|
+
gem.test_files = Dir.glob("spec/**/*")
|
18
|
+
|
19
|
+
gem.add_dependency 'httparty', ">= 0.6.1"
|
20
|
+
|
21
|
+
gem.add_development_dependency 'rspec'
|
22
|
+
gem.add_development_dependency 'fakeweb', "~> 1.3"
|
23
|
+
end
|
data/lib/govtrack.rb
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
module GovTrack
|
2
|
+
class Base
|
3
|
+
include HTTParty
|
4
|
+
|
5
|
+
base_uri 'http://www.govtrack.us/api/v1'
|
6
|
+
|
7
|
+
def initialize(attributes=nil)
|
8
|
+
attributes ||= {}
|
9
|
+
attributes.each do |(attr, val)|
|
10
|
+
instance_variable_set("@#{attr}", val)
|
11
|
+
instance_eval "def #{attr}() @#{attr} end" unless self.respond_to?(attr)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.find(args)
|
16
|
+
args[:limit] ||= 500 if block_given? #default to queries of 500 when a block is given
|
17
|
+
|
18
|
+
response = get("/#{self.demodulized_name}/?#{URI.escape(URI.encode_www_form(args))}")
|
19
|
+
paginated_list = GovTrack::PaginatedList.new(self,response["meta"],response["objects"])
|
20
|
+
|
21
|
+
if block_given?
|
22
|
+
page = paginated_list.offset
|
23
|
+
for page in paginated_list.offset..(paginated_list.total/paginated_list.limit)
|
24
|
+
args[:offset] = page
|
25
|
+
if page == (paginated_list.total/paginated_list.limit).to_i #don't supply the end of the last page
|
26
|
+
self.find(args).first(paginated_list.total%paginated_list.limit).each { |item| yield item }
|
27
|
+
else
|
28
|
+
self.find(args).each { |item| yield item }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
else
|
32
|
+
paginated_list
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.find_by_id(id)
|
37
|
+
new(get("/#{self.demodulized_name}/#{id}"))
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.find_by_uri(uri)
|
41
|
+
new(get("http://www.govtrack.us#{uri}"))
|
42
|
+
end
|
43
|
+
|
44
|
+
def ==(other)
|
45
|
+
other.equal?(self) || (other.instance_of?(self.class) && other.id == id)
|
46
|
+
end
|
47
|
+
|
48
|
+
def eql?(other)
|
49
|
+
self == other
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.method_missing(method_id, *arguments)
|
53
|
+
#generates dynamic find_by methods, ActiveRecord style.
|
54
|
+
if method_id.to_s =~ /^find_by_([_a-zA-Z]\w*)$/
|
55
|
+
attribute_names = $1.split '_and_'
|
56
|
+
conditions = {}
|
57
|
+
attribute_names.each_with_index do |name,index|
|
58
|
+
conditions[name.to_sym] = arguments[index]
|
59
|
+
end
|
60
|
+
self.find(conditions)
|
61
|
+
else
|
62
|
+
super
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
protected
|
67
|
+
|
68
|
+
def self.demodulized_name
|
69
|
+
self.name.split('::').last.downcase == "votevoter" ? "vote_voter" : self.name.split('::').last.downcase
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module GovTrack
|
2
|
+
class Bill < Base
|
3
|
+
|
4
|
+
def initialize(attributes={})
|
5
|
+
super
|
6
|
+
@introduced_date = Date.parse(@introduced_date) if @introduced_date
|
7
|
+
@current_status_date = Date.parse(@current_status_date) if @current_status_date
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.find(args)
|
11
|
+
args[:bill_type] = args[:bill_type].to_bill_type_number if args[:bill_type]
|
12
|
+
args[:current_status] = args[:current_status].to_current_status_number if args[:current_status]
|
13
|
+
super
|
14
|
+
end
|
15
|
+
|
16
|
+
def sponsor
|
17
|
+
@sponsor.class == GovTrack::Person ? @sponsor : @sponsor = GovTrack::Person.find_by_id(@sponsor['id'])
|
18
|
+
end
|
19
|
+
|
20
|
+
def cosponsors
|
21
|
+
if @cosponsors[0].class == GovTrack::Person
|
22
|
+
@cosponsors
|
23
|
+
else
|
24
|
+
@cosponsors.map! { |cosponsor_uri|
|
25
|
+
GovTrack::Person.find_by_uri(cosponsor_uri)
|
26
|
+
}
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
class Object
|
2
|
+
def to_bill_type_number
|
3
|
+
#Fix for API not accepting bill_type as a string
|
4
|
+
case self.to_s
|
5
|
+
when 'house_resolution'
|
6
|
+
1
|
7
|
+
when 'senate_bill'
|
8
|
+
2
|
9
|
+
when 'house_bill'
|
10
|
+
3
|
11
|
+
when 'senate_resolution'
|
12
|
+
4
|
13
|
+
when 'house_concurrent_resolution'
|
14
|
+
5
|
15
|
+
when 'senate_concurrent_resolution'
|
16
|
+
6
|
17
|
+
when 'house_joint_resolution'
|
18
|
+
7
|
19
|
+
when 'senate_joint_resolution'
|
20
|
+
8
|
21
|
+
else
|
22
|
+
self
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_current_status_number
|
27
|
+
#Fix for API not accepting current_status as a string
|
28
|
+
case self.to_s
|
29
|
+
when 'introduced'
|
30
|
+
1
|
31
|
+
when 'referred'
|
32
|
+
2
|
33
|
+
when 'reported'
|
34
|
+
3
|
35
|
+
when 'pass_over_house'
|
36
|
+
4
|
37
|
+
when 'pass_over_senate'
|
38
|
+
5
|
39
|
+
when 'passed_simpleres'
|
40
|
+
6
|
41
|
+
else
|
42
|
+
self
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def to_display_text
|
47
|
+
case self
|
48
|
+
when "+"
|
49
|
+
"Aye"
|
50
|
+
when "-"
|
51
|
+
"No"
|
52
|
+
when "0"
|
53
|
+
"Not Voting"
|
54
|
+
when "P"
|
55
|
+
"Present"
|
56
|
+
else
|
57
|
+
self
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module GovTrack
|
2
|
+
class PaginatedList < ::Array
|
3
|
+
|
4
|
+
attr_reader :limit, :offset, :total
|
5
|
+
|
6
|
+
def initialize(object_class,meta,objects)
|
7
|
+
if meta
|
8
|
+
@limit = meta['limit']
|
9
|
+
@offset = meta['offset']
|
10
|
+
@total = meta['total_count']
|
11
|
+
end
|
12
|
+
|
13
|
+
super((objects || []).map { |object| object_class.new(object) })
|
14
|
+
end
|
15
|
+
|
16
|
+
def method_missing(method_id, *arguments)
|
17
|
+
#passes methods through to item when list contains only one
|
18
|
+
if self.length == 1
|
19
|
+
self.first.send(method_id, *arguments)
|
20
|
+
else
|
21
|
+
super
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module GovTrack
|
2
|
+
class Person < Base
|
3
|
+
|
4
|
+
def initialize(attributes={})
|
5
|
+
super
|
6
|
+
@birthday = Date.parse(@birthday) if @birthday
|
7
|
+
end
|
8
|
+
|
9
|
+
def current_role
|
10
|
+
@current_role.class == GovTrack::Role ? @current_role : @current_role = GovTrack::Role.find_by_id(@current_role['id'])
|
11
|
+
end
|
12
|
+
|
13
|
+
def roles
|
14
|
+
if @roles[0].class == GovTrack::Role
|
15
|
+
@roles
|
16
|
+
else
|
17
|
+
@roles.map! { |role_uri|
|
18
|
+
GovTrack::Role.find_by_uri(role_uri)
|
19
|
+
}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module GovTrack
|
2
|
+
class Vote < Base
|
3
|
+
|
4
|
+
def initialize(attributes={})
|
5
|
+
super
|
6
|
+
@created = DateTime.parse(@created) if @created
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.find(args)
|
10
|
+
#API doesn't allow searching for bill by ID, so query with congress, bill_type, and number.
|
11
|
+
if args[:related_bill]
|
12
|
+
args[:related_bill__congress] = args[:related_bill].congress
|
13
|
+
args[:related_bill__bill_type] = args[:related_bill].bill_type.to_bill_type_number
|
14
|
+
args[:related_bill__number] = args[:related_bill].number
|
15
|
+
args.delete(:related_bill)
|
16
|
+
end
|
17
|
+
|
18
|
+
super
|
19
|
+
end
|
20
|
+
|
21
|
+
def related_bill
|
22
|
+
@related_bill.class == GovTrack::Bill ? @related_bill : @related_bill = GovTrack::Bill.find_by_id(@related_bill['id'])
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module GovTrack
|
2
|
+
class VoteVoter < Base
|
3
|
+
|
4
|
+
def initialize(attributes={})
|
5
|
+
super
|
6
|
+
@created = DateTime.parse(@created) if @created
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.find(args)
|
10
|
+
#allows searching with Person and Vote objects
|
11
|
+
args.each { |k,v|
|
12
|
+
args[k] = v.id if v.class == GovTrack::Person || v.class == GovTrack::Vote || v.class == GovTrack::PaginatedList
|
13
|
+
}
|
14
|
+
super
|
15
|
+
end
|
16
|
+
|
17
|
+
def person
|
18
|
+
@person.class == GovTrack::Person ? @person : @person = GovTrack::Person.find_by_uri(@person)
|
19
|
+
end
|
20
|
+
|
21
|
+
def vote
|
22
|
+
@vote.class == GovTrack::Vote ? @vote : @vote = GovTrack::Vote.find_by_uri(@vote)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe GovTrack::Bill do
|
4
|
+
|
5
|
+
it "should find an array of bills based on parameters" do
|
6
|
+
bills = GovTrack::Bill.find(congress:112, is_current: "true")
|
7
|
+
bills.should be_an Array
|
8
|
+
bills[0].should be_a GovTrack::Bill
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should iterate through an array of bills based on parameters when supplied with a block" do
|
12
|
+
count = 0
|
13
|
+
GovTrack::Bill.find(congress:95, bill_type: 'house_concurrent_resolution', limit: 70) { |bill| count += 1 }
|
14
|
+
count.should eq GovTrack::Bill.find(congress:95, bill_type: 'house_concurrent_resolution').total
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should find an array of bills based on parameters with a dynamic finder" do
|
18
|
+
bills = GovTrack::Bill.find_by_congress_and_is_current(112, "true")
|
19
|
+
bills.should be_an Array
|
20
|
+
bills[0].should be_a GovTrack::Bill
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should find a bill by id" do
|
24
|
+
bill = GovTrack::Bill.find_by_id(74369)
|
25
|
+
bill.id.should eq "74369"
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should retreive sponsor as a Person and cache it" do
|
29
|
+
bill = GovTrack::Bill.find_by_id(74369)
|
30
|
+
bill.sponsor.should be_a GovTrack::Person
|
31
|
+
|
32
|
+
FakeWeb.allow_net_connect = false
|
33
|
+
bill.sponsor.should be_a GovTrack::Person
|
34
|
+
FakeWeb.allow_net_connect = true
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should retreive cosponsors as a Person array and cache it" do
|
38
|
+
bill = GovTrack::Bill.find_by_id(2343)
|
39
|
+
bill.cosponsors.should be_an Array
|
40
|
+
bill.cosponsors[0].should be_a GovTrack::Person
|
41
|
+
|
42
|
+
FakeWeb.allow_net_connect = false
|
43
|
+
bill.cosponsors.should be_an Array
|
44
|
+
bill.cosponsors[0].should be_a GovTrack::Person
|
45
|
+
FakeWeb.allow_net_connect = true
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should return an empty array if there are no cosponsors" do
|
49
|
+
bill = GovTrack::Bill.find_by_id(74369)
|
50
|
+
bill.cosponsors.should be_empty
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should retreive introduced_date as a Date object" do
|
54
|
+
bill = GovTrack::Bill.find_by_id(2343)
|
55
|
+
bill.introduced_date.should be_a Date
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should retreive current_status_date as a Date object" do
|
59
|
+
bill = GovTrack::Bill.find_by_id(2343)
|
60
|
+
bill.current_status_date.should be_a Date
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe GovTrack::Person do
|
4
|
+
|
5
|
+
it "should find an array of people based on parameters" do
|
6
|
+
people = GovTrack::Person.find(roles__party:"Republican", roles__current: "true")
|
7
|
+
people.should be_an Array
|
8
|
+
people[0].should be_a GovTrack::Person
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should find an array of people based on parameters with a dynamic finder" do
|
12
|
+
people = GovTrack::Person.find_by_roles__party_and_roles__current("Republican", "true")
|
13
|
+
people.should be_an Array
|
14
|
+
people[0].should be_a GovTrack::Person
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should find a person by id" do
|
18
|
+
person = GovTrack::Person.find_by_id(400326)
|
19
|
+
person.id.should eq "400326"
|
20
|
+
person.firstname.should eq "David"
|
21
|
+
person.lastname.should eq "Price"
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should find a person by uri" do
|
25
|
+
person = GovTrack::Person.find_by_uri('/api/v1/person/300038/')
|
26
|
+
person.id.should eq "300038"
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should retreive current_role as a Role and cache it" do
|
30
|
+
person = GovTrack::Person.find_by_id(400326)
|
31
|
+
person.current_role.should be_a GovTrack::Role
|
32
|
+
|
33
|
+
FakeWeb.allow_net_connect = false
|
34
|
+
person.current_role.should be_a GovTrack::Role
|
35
|
+
FakeWeb.allow_net_connect = true
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should retreive roles as a Role array and cache it" do
|
39
|
+
person = GovTrack::Person.find_by_id(400326)
|
40
|
+
person.roles.should be_an Array
|
41
|
+
person.roles[0].should be_a GovTrack::Role
|
42
|
+
|
43
|
+
FakeWeb.allow_net_connect = false
|
44
|
+
person.roles.should be_an Array
|
45
|
+
person.roles[0].should be_a GovTrack::Role
|
46
|
+
FakeWeb.allow_net_connect = true
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should retreive birthday as a Date object" do
|
50
|
+
person = GovTrack::Person.find_by_id(400326)
|
51
|
+
person.birthday.should be_a Date
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe GovTrack::Role do
|
4
|
+
|
5
|
+
it "should find an array of roles based on parameters" do
|
6
|
+
roles = GovTrack::Role.find(state:"MD", current: true)
|
7
|
+
roles.should be_an Array
|
8
|
+
roles[0].should be_a GovTrack::Role
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should find an array of roles based on parameters with a dynamic finder" do
|
12
|
+
roles = GovTrack::Role.find_by_state_and_current("MD", true)
|
13
|
+
roles.should be_an Array
|
14
|
+
roles[0].should be_a GovTrack::Role
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should find a role by id" do
|
18
|
+
role = GovTrack::Role.find_by_id(387)
|
19
|
+
role.id.should eq "387"
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should retreive startdate as a Date object" do
|
23
|
+
role = GovTrack::Role.find_by_id(387)
|
24
|
+
role.startdate.should be_a Date
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should retreive enddate as a Date object" do
|
28
|
+
role = GovTrack::Role.find_by_id(387)
|
29
|
+
role.enddate.should be_a Date
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe GovTrack::Vote do
|
4
|
+
|
5
|
+
it "should find an array of votes based on parameters" do
|
6
|
+
votes = GovTrack::Vote.find(is_alive:true, session: 1)
|
7
|
+
votes.should be_an Array
|
8
|
+
votes[0].should be_a GovTrack::Vote
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should find an array of votes based on parameters with a dynamic finder" do
|
12
|
+
votes = GovTrack::Vote.find_by_is_alive_and_session(true, 1)
|
13
|
+
votes.should be_an Array
|
14
|
+
votes[0].should be_a GovTrack::Vote
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should find a vote" do
|
18
|
+
vote = GovTrack::Vote.find_by_id(1)
|
19
|
+
vote.id.should eq "1"
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should retreive related_bill as a Bill and cache it" do
|
23
|
+
vote = GovTrack::Vote.find_by_id(34577)
|
24
|
+
vote.related_bill.should be_a GovTrack::Bill
|
25
|
+
|
26
|
+
FakeWeb.allow_net_connect = false
|
27
|
+
vote.related_bill.should be_a GovTrack::Bill
|
28
|
+
FakeWeb.allow_net_connect = true
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should retreive created as a DateTime object" do
|
32
|
+
vote = GovTrack::Vote.find_by_id(34577)
|
33
|
+
vote.created.should be_a DateTime
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe GovTrack::VoteVoter do
|
4
|
+
|
5
|
+
it "should find an array of VoteVoters based on parameters" do
|
6
|
+
vote_voters = GovTrack::VoteVoter.find(vote:1, person: 400639)
|
7
|
+
vote_voters.should be_an Array
|
8
|
+
vote_voters[0].should be_a GovTrack::VoteVoter
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should find an array of VoteVoters based on parameters with a dynamic finder" do
|
12
|
+
vote_voters = GovTrack::VoteVoter.find_by_vote_and_person(1, 400639)
|
13
|
+
vote_voters.should be_an Array
|
14
|
+
vote_voters[0].should be_a GovTrack::VoteVoter
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should find a vote voter with votes and people objects" do
|
18
|
+
manny = GovTrack::Person.find_by_firstname_and_lastname("Emanuel","Cleaver").first
|
19
|
+
vote = GovTrack::Vote.find_by_number_and_congress(183,112).first
|
20
|
+
vote_voters = GovTrack::VoteVoter.find_by_person_and_vote(manny, vote)
|
21
|
+
vote_voters.should be_an Array
|
22
|
+
vote_voters[0].should be_a GovTrack::VoteVoter
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should find a vote voter" do
|
26
|
+
vote_voter = GovTrack::VoteVoter.find_by_id(8248471)
|
27
|
+
vote_voter.id.should eq "8248471"
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should retreive person as a Person and cache it" do
|
31
|
+
vote_voter = GovTrack::VoteVoter.find_by_id(8248471)
|
32
|
+
vote_voter.person.should be_a GovTrack::Person
|
33
|
+
|
34
|
+
FakeWeb.allow_net_connect = false
|
35
|
+
vote_voter.person.should be_a GovTrack::Person
|
36
|
+
FakeWeb.allow_net_connect = true
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should retreive vote as a Vote and cache it" do
|
40
|
+
vote_voter = GovTrack::VoteVoter.find_by_id(8248471)
|
41
|
+
vote_voter.vote.should be_a GovTrack::Vote
|
42
|
+
|
43
|
+
FakeWeb.allow_net_connect = false
|
44
|
+
vote_voter.vote.should be_a GovTrack::Vote
|
45
|
+
FakeWeb.allow_net_connect = true
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should retreive created as a DateTime object" do
|
49
|
+
vote_voter = GovTrack::VoteVoter.find_by_id(8248471)
|
50
|
+
vote_voter.created.should be_a DateTime
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
data/spec/helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: govtrack
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Noah Litvin
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-08-10 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: httparty
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.6.1
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.6.1
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rspec
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: fakeweb
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '1.3'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.3'
|
62
|
+
description: A Ruby wrapper for the GovTrack API.
|
63
|
+
email:
|
64
|
+
- noah.litvin@gmail.com
|
65
|
+
executables: []
|
66
|
+
extensions: []
|
67
|
+
extra_rdoc_files: []
|
68
|
+
files:
|
69
|
+
- CHANGELOG.md
|
70
|
+
- LICENSE.md
|
71
|
+
- README.md
|
72
|
+
- TODO.md
|
73
|
+
- govtrack.gemspec
|
74
|
+
- lib/govtrack/base.rb
|
75
|
+
- lib/govtrack/bill.rb
|
76
|
+
- lib/govtrack/helper.rb
|
77
|
+
- lib/govtrack/paginated_list.rb
|
78
|
+
- lib/govtrack/person.rb
|
79
|
+
- lib/govtrack/role.rb
|
80
|
+
- lib/govtrack/version.rb
|
81
|
+
- lib/govtrack/vote.rb
|
82
|
+
- lib/govtrack/vote_voter.rb
|
83
|
+
- lib/govtrack.rb
|
84
|
+
- spec/govtrack/bill_spec.rb
|
85
|
+
- spec/govtrack/paginated_list_spec.rb
|
86
|
+
- spec/govtrack/person_spec.rb
|
87
|
+
- spec/govtrack/role_spec.rb
|
88
|
+
- spec/govtrack/vote_spec.rb
|
89
|
+
- spec/govtrack/vote_voter_spec.rb
|
90
|
+
- spec/helper.rb
|
91
|
+
homepage: https://github.com/noahlitvin/govtrack
|
92
|
+
licenses: []
|
93
|
+
post_install_message:
|
94
|
+
rdoc_options: []
|
95
|
+
require_paths:
|
96
|
+
- lib
|
97
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
99
|
+
requirements:
|
100
|
+
- - ! '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
|
+
none: false
|
105
|
+
requirements:
|
106
|
+
- - ! '>='
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
109
|
+
requirements: []
|
110
|
+
rubyforge_project:
|
111
|
+
rubygems_version: 1.8.24
|
112
|
+
signing_key:
|
113
|
+
specification_version: 3
|
114
|
+
summary: A Ruby wrapper for the GovTrack API.
|
115
|
+
test_files:
|
116
|
+
- spec/govtrack/bill_spec.rb
|
117
|
+
- spec/govtrack/paginated_list_spec.rb
|
118
|
+
- spec/govtrack/person_spec.rb
|
119
|
+
- spec/govtrack/role_spec.rb
|
120
|
+
- spec/govtrack/vote_spec.rb
|
121
|
+
- spec/govtrack/vote_voter_spec.rb
|
122
|
+
- spec/helper.rb
|