govkit 0.7.2 → 0.7.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +2 -0
- data/Gemfile +11 -5
- data/README.md +1 -1
- data/Rakefile +29 -13
- data/VERSION +1 -1
- data/govkit.gemspec +25 -36
- data/lib/gov_kit.rb +16 -5
- data/lib/gov_kit/configuration.rb +5 -5
- data/lib/gov_kit/follow_the_money.rb +5 -2
- data/lib/gov_kit/open_congress.rb +3 -11
- data/lib/gov_kit/open_congress/bill.rb +32 -29
- data/lib/gov_kit/open_congress/person.rb +21 -20
- data/lib/gov_kit/open_states.rb +10 -15
- data/lib/gov_kit/railtie.rb +0 -2
- data/lib/gov_kit/resource.rb +0 -1
- data/lib/gov_kit/transparency_data.rb +1 -1
- data/lib/gov_kit/vote_smart.rb +81 -6
- data/{init.rb → rails/init.rb} +0 -0
- data/spec/fixtures/open_states/401.response +9 -9
- data/spec/fixtures/open_states/404.response +9 -9
- data/spec/fixtures/open_states/bill.response +9 -240
- data/spec/fixtures/open_states/bill_find.response +9 -0
- data/spec/fixtures/open_states/bill_query.response +9 -1990
- data/spec/fixtures/open_states/committee_find.response +9 -53
- data/spec/fixtures/open_states/committee_query.response +9 -190
- data/spec/fixtures/open_states/legislator_find.response +9 -0
- data/spec/fixtures/open_states/legislator_query.response +9 -144
- data/spec/fixtures/open_states/state.response +9 -60
- data/spec/follow_the_money_spec.rb +20 -16
- data/spec/open_congress_spec.rb +23 -35
- data/spec/open_states_spec.rb +63 -78
- data/spec/search_engines_spec.rb +10 -13
- data/spec/spec_helper.rb +16 -8
- data/spec/transparency_data_spec.rb +19 -35
- metadata +140 -145
- data/spec/fixtures/open_states/410.response +0 -6
- data/spec/fixtures/open_states/legislator.response +0 -34
@@ -1,25 +1,22 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
|
-
# Provides "String.singularize"
|
4
|
-
# which is used by resource_for_collection, in resource.rb
|
5
|
-
require 'active_support/inflector'
|
6
|
-
|
7
3
|
module GovKit::FollowTheMoney
|
8
4
|
describe GovKit::FollowTheMoney do
|
9
5
|
|
10
6
|
before(:all) do
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
[
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
7
|
+
unless FakeWeb.allow_net_connect?
|
8
|
+
base_uri = GovKit::FollowTheMoneyResource.base_uri.gsub(/\./, '\.')
|
9
|
+
|
10
|
+
urls = [
|
11
|
+
['/base_level\.industries\.list\.php\?.*page=0', 'business-page0.response'],
|
12
|
+
['/base_level\.industries\.list\.php\?.*page=1', 'business-page1.response'],
|
13
|
+
['/candidates\.contributions\.php\?imsp_candidate_id=111933', 'contribution.response'],
|
14
|
+
['/candidates\.contributions\.php\?imsp_candidate_id=0', 'unauthorized.response'],
|
15
|
+
]
|
16
|
+
|
17
|
+
urls.each do |u|
|
18
|
+
FakeWeb.register_uri(:get, %r|#{base_uri}#{u[0]}|, :response => File.join(FIXTURES_DIR, 'follow_the_money', u[1]))
|
19
|
+
end
|
23
20
|
end
|
24
21
|
end
|
25
22
|
|
@@ -30,11 +27,17 @@ module GovKit::FollowTheMoney
|
|
30
27
|
end
|
31
28
|
|
32
29
|
it "should raise NotAuthorized if the api key is not valid" do
|
30
|
+
api_key = GovKit.configuration.ftm_apikey
|
31
|
+
|
32
|
+
GovKit.configuration.ftm_apikey = nil
|
33
|
+
|
33
34
|
lambda do
|
34
35
|
@contribution = Contribution.find(0)
|
35
36
|
end.should raise_error(GovKit::NotAuthorized)
|
36
37
|
|
37
38
|
@contribution.should be_nil
|
39
|
+
|
40
|
+
GovKit.configuration.ftm_apikey = api_key
|
38
41
|
end
|
39
42
|
|
40
43
|
describe Business do
|
@@ -49,6 +52,7 @@ module GovKit::FollowTheMoney
|
|
49
52
|
|
50
53
|
describe Contribution do
|
51
54
|
it "should get a list of campaign contributions for a given person" do
|
55
|
+
pending 'This API call is restricted'
|
52
56
|
@contributions = Contribution.find(111933)
|
53
57
|
@contributions.should be_an_instance_of(Array)
|
54
58
|
@contributions.each do |c|
|
data/spec/open_congress_spec.rb
CHANGED
@@ -4,30 +4,28 @@ module GovKit::OpenCongress
|
|
4
4
|
describe GovKit::OpenCongress do
|
5
5
|
before(:all) do
|
6
6
|
@oc_objs = [Bill, Person]
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
urls.each do |u|
|
24
|
-
FakeWeb.register_uri(:get, "#{base_uri}#{u[0]}", :response => File.join(FIXTURES_DIR, 'open_congress', u[1]))
|
7
|
+
|
8
|
+
unless FakeWeb.allow_net_connect?
|
9
|
+
base_uri = "http://api.opencongress.org/"
|
10
|
+
|
11
|
+
urls = [
|
12
|
+
[ "people?format=json&district=1&state=FL", "fl01.response" ],
|
13
|
+
[ "people?format=json&district=0&state=ZZ", "empty.response" ],
|
14
|
+
[ "most_blogged_representatives_this_week?format=json", "person.response" ],
|
15
|
+
[ "bills?format=json&number=0", "empty.response" ],
|
16
|
+
[ "bills?format=json&number=501", "501.response" ],
|
17
|
+
[ "most_blogged_bills_this_week?format=json", "bill.response" ]
|
18
|
+
]
|
19
|
+
|
20
|
+
urls.each do |u|
|
21
|
+
FakeWeb.register_uri(:get, "#{base_uri}#{u[0]}", :response => File.join(FIXTURES_DIR, 'open_congress', u[1]))
|
22
|
+
end
|
25
23
|
end
|
26
24
|
end
|
27
25
|
|
28
26
|
it "should construct a url properly" do
|
29
27
|
@oc_objs.each do |klass|
|
30
|
-
klass.construct_url(klass.to_s.split("::").last, {}).should == "http://
|
28
|
+
klass.construct_url(klass.to_s.split("::").last, {}).should == "http://api.opencongress.org/#{klass.to_s.split("::").last}?format=json"
|
31
29
|
end
|
32
30
|
end
|
33
31
|
|
@@ -40,9 +38,7 @@ module GovKit::OpenCongress
|
|
40
38
|
describe Person do
|
41
39
|
context "#find" do
|
42
40
|
it "should find a specific person" do
|
43
|
-
|
44
|
-
@person = Person.find(:district => 1, :state => "FL").first
|
45
|
-
end.should_not raise_error
|
41
|
+
@person = Person.find(:district => 1, :state => "FL").first
|
46
42
|
|
47
43
|
@person.should be_an_instance_of(Person)
|
48
44
|
@person.firstname.should == "Jeff"
|
@@ -50,9 +46,7 @@ module GovKit::OpenCongress
|
|
50
46
|
end
|
51
47
|
|
52
48
|
it "should return an empty array when no person fits the criteria" do
|
53
|
-
|
54
|
-
@person = Person.find(:district => 0, :state => "ZZ")
|
55
|
-
end.should_not raise_error
|
49
|
+
@person = Person.find(:district => 0, :state => "ZZ")
|
56
50
|
|
57
51
|
@person.should be_an_instance_of(Array)
|
58
52
|
@person.empty?.should be_true
|
@@ -61,9 +55,7 @@ module GovKit::OpenCongress
|
|
61
55
|
|
62
56
|
context "#most blogged representatives this week" do
|
63
57
|
it "should find reps" do
|
64
|
-
|
65
|
-
@person = Person.most_blogged_representatives_this_week.first
|
66
|
-
end.should_not raise_error
|
58
|
+
@person = Person.most_blogged_representatives_this_week.first
|
67
59
|
|
68
60
|
@person.should be_an_instance_of(Person)
|
69
61
|
@person.firstname.should == "Jeff"
|
@@ -75,13 +67,11 @@ module GovKit::OpenCongress
|
|
75
67
|
describe Bill do
|
76
68
|
context "#find" do
|
77
69
|
it "should find a specific bill" do
|
78
|
-
|
79
|
-
@bill = Bill.find(:number => 501).first
|
80
|
-
end.should_not raise_error
|
70
|
+
@bill = Bill.find(:number => 501).first
|
81
71
|
|
82
72
|
@bill.should be_an_instance_of(Bill)
|
83
73
|
@bill.number.should == 501
|
84
|
-
@bill.bill_type.should == "h"
|
74
|
+
@bill.bill_type.should == (FakeWeb.allow_net_connect? ? "hr" : "h")
|
85
75
|
end
|
86
76
|
|
87
77
|
it "should return an empty array when no bill fits the criteria" do
|
@@ -94,9 +84,7 @@ module GovKit::OpenCongress
|
|
94
84
|
|
95
85
|
context "#most blogged bills this week" do
|
96
86
|
it "should find specific bills" do
|
97
|
-
|
98
|
-
@bill = Bill.most_blogged_bills_this_week.first
|
99
|
-
end.should_not raise_error
|
87
|
+
@bill = Bill.most_blogged_bills_this_week.first
|
100
88
|
|
101
89
|
@bill.should be_an_instance_of(Bill)
|
102
90
|
@bill.number.should == 2678
|
data/spec/open_states_spec.rb
CHANGED
@@ -1,80 +1,73 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
|
-
# Provides "String.singularize"
|
4
|
-
# which is used by resource_for_collection, in resource.rb
|
5
|
-
require 'active_support/inflector'
|
6
|
-
|
7
|
-
# Provides string.last()
|
8
|
-
# which is used by method_missing in resource.rb
|
9
|
-
require 'active_support/core_ext/string'
|
10
|
-
|
11
3
|
module GovKit::OpenStates
|
12
4
|
describe GovKit::OpenStates do
|
13
5
|
before(:all) do
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
# ['/legislators/\?(.*)state=zz(.*)', '404.response'],
|
59
|
-
|
60
|
-
|
61
|
-
urls.each do |u|
|
62
|
-
FakeWeb.register_uri(:get, %r|#{base_uri}#{u[0]}|, :response => File.join(FIXTURES_DIR, 'open_states', u[1]))
|
6
|
+
unless FakeWeb.allow_net_connect?
|
7
|
+
base_uri = GovKit::OpenStatesResource.base_uri.gsub(/\./, '\.')
|
8
|
+
|
9
|
+
# @todo The fixtures are out-of-date.
|
10
|
+
urls = [
|
11
|
+
['/bills/ca/20092010/lower/AB%20667/', 'bill.response'],
|
12
|
+
['/bills/\?.*q=cooperatives.*', 'bill_find.response'],
|
13
|
+
['/bills/\?.*state=tx.*', 'bill_query.response'],
|
14
|
+
['/legislators/CAL000088/\?', 'legislator_find.response'],
|
15
|
+
['/legislators/XXL123456/\?', '401.response'],
|
16
|
+
['/legislators/CAL999999/\?', '404.response'],
|
17
|
+
['/legislators/\?.*state=zz.*', '404.response'],
|
18
|
+
['/legislators/\?.*state=ca.*', 'legislator_query.response'],
|
19
|
+
['/committees/MDC000012/', 'committee_find.response'],
|
20
|
+
['/committees/\?.*state=md', 'committee_query.response'],
|
21
|
+
['/metadata/ca/\?', 'state.response']
|
22
|
+
]
|
23
|
+
|
24
|
+
# First convert each of the uri strings above into regexp's before
|
25
|
+
# passing them on to register_uri.
|
26
|
+
#
|
27
|
+
# Internally, before checking if a new uri string matches one of the registered uri's,
|
28
|
+
# FakeWeb normalizes it by parsing it with URI.parse(string), and then
|
29
|
+
# calling URI.normalize on the resulting URI. This appears to reorder any
|
30
|
+
# query parameters alphabetically by key.
|
31
|
+
#
|
32
|
+
# So the uri
|
33
|
+
# http://openstates.sunlightlabs.com/api/v1/legislators/?state=zz&output=json&apikey=
|
34
|
+
# would actually not match a registered uri of
|
35
|
+
# ['/legislators/\?state=zz', '404.response'],
|
36
|
+
# or
|
37
|
+
# ['/legislators/\?state=zz*', '404.response'],
|
38
|
+
# or even
|
39
|
+
# ['/legislators/\?state=zz&output=json&apikey=', '404.response'],
|
40
|
+
#
|
41
|
+
# But it would match a registered uri of
|
42
|
+
# ['/legislators/\?apikey=&output=json&state=zz', '404.response'],
|
43
|
+
# or
|
44
|
+
# ['/legislators/\?(.*)state=zz(.*)', '404.response'],
|
45
|
+
|
46
|
+
|
47
|
+
urls.each do |u|
|
48
|
+
FakeWeb.register_uri(:get, %r|#{base_uri}#{u[0]}|, :response => File.join(FIXTURES_DIR, 'open_states', u[1]))
|
49
|
+
end
|
63
50
|
end
|
64
51
|
end
|
65
52
|
|
66
53
|
it "should have the base uri set properly" do
|
67
54
|
[State, Bill, Legislator].each do |klass|
|
68
|
-
klass.base_uri.should == "http://openstates.
|
55
|
+
klass.base_uri.should == "http://openstates.org/api/v1"
|
69
56
|
end
|
70
57
|
end
|
71
58
|
|
72
59
|
it "should raise NotAuthorized if the api key is not valid" do
|
60
|
+
api_key = GovKit.configuration.sunlight_apikey
|
61
|
+
|
62
|
+
GovKit.configuration.sunlight_apikey = nil
|
63
|
+
|
73
64
|
lambda do
|
74
|
-
@legislator = Legislator.find
|
65
|
+
@legislator = Legislator.find 'XXL123456'
|
75
66
|
end.should raise_error(GovKit::NotAuthorized)
|
76
67
|
|
77
68
|
@legislator.should be_nil
|
69
|
+
|
70
|
+
GovKit.configuration.sunlight_apikey = api_key
|
78
71
|
end
|
79
72
|
|
80
73
|
describe State do
|
@@ -89,7 +82,7 @@ module GovKit::OpenStates
|
|
89
82
|
|
90
83
|
@state.should be_an_instance_of(State)
|
91
84
|
@state.name.should == "California"
|
92
|
-
@state.sessions.size.should ==
|
85
|
+
@state.terms.first.sessions.size.should == 9
|
93
86
|
end
|
94
87
|
end
|
95
88
|
end
|
@@ -98,7 +91,7 @@ module GovKit::OpenStates
|
|
98
91
|
context "#find" do
|
99
92
|
it "should find a bill by state abbreviation, session, chamber, bill_id" do
|
100
93
|
lambda do
|
101
|
-
@bill = Bill.find('ca', '20092010', '
|
94
|
+
@bill = Bill.find('ca', '20092010', 'AB 667', 'lower')
|
102
95
|
end.should_not raise_error
|
103
96
|
|
104
97
|
@bill.should be_an_instance_of(Bill)
|
@@ -114,29 +107,21 @@ module GovKit::OpenStates
|
|
114
107
|
@bills.each do |b|
|
115
108
|
b.should be_an_instance_of(Bill)
|
116
109
|
end
|
117
|
-
@bills.collect(&:bill_id).should include("SB
|
118
|
-
end
|
119
|
-
|
120
|
-
it "should return a single bill result as an array" do
|
121
|
-
@bills = Bill.search('professions')
|
122
|
-
|
123
|
-
@bills.should be_an_instance_of(Array)
|
124
|
-
@bills.collect(&:bill_id).should include("AB667")
|
110
|
+
@bills.collect(&:bill_id).should include("SB 207")
|
125
111
|
end
|
126
|
-
|
127
112
|
end
|
128
113
|
|
129
114
|
context "#latest" do
|
130
115
|
it "should get the latest bills by given criteria" do
|
131
116
|
lambda do
|
132
|
-
@latest = Bill.latest('
|
117
|
+
@latest = Bill.latest('2012-11-01', :state => 'tx')
|
133
118
|
end.should_not raise_error
|
134
119
|
|
135
120
|
@latest.should be_an_instance_of(Array)
|
136
121
|
@latest.each do |b|
|
137
122
|
b.should be_an_instance_of(Bill)
|
138
123
|
end
|
139
|
-
@latest.collect(&:bill_id).should include("
|
124
|
+
@latest.collect(&:bill_id).should include("HB 41")
|
140
125
|
end
|
141
126
|
end
|
142
127
|
end
|
@@ -145,16 +130,16 @@ module GovKit::OpenStates
|
|
145
130
|
context "#find" do
|
146
131
|
it "should find a specific legislator" do
|
147
132
|
lambda do
|
148
|
-
@legislator = Legislator.find(
|
133
|
+
@legislator = Legislator.find('CAL000088')
|
149
134
|
end.should_not raise_error
|
150
135
|
|
151
136
|
@legislator.should be_an_instance_of(Legislator)
|
152
|
-
@legislator.first_name.should == "
|
153
|
-
@legislator.last_name.should == "
|
137
|
+
@legislator.first_name.should == "Bob"
|
138
|
+
@legislator.last_name.should == "Blumenfield"
|
154
139
|
end
|
155
140
|
|
156
141
|
it "should return an empty array if the legislator is not found" do
|
157
|
-
@legislator = Legislator.find(
|
142
|
+
@legislator = Legislator.find('CAL999999')
|
158
143
|
|
159
144
|
@legislator.should eql([])
|
160
145
|
end
|
@@ -202,10 +187,10 @@ module GovKit::OpenStates
|
|
202
187
|
end.should_not raise_error
|
203
188
|
|
204
189
|
@committees.should be_an_instance_of(Array)
|
205
|
-
@committees.length.should eql(
|
190
|
+
@committees.length.should eql(21)
|
206
191
|
com = @committees[0]
|
207
192
|
com.should be_an_instance_of(Committee)
|
208
|
-
com['id'].should eql('
|
193
|
+
com['id'].should eql('MDC000001')
|
209
194
|
end
|
210
195
|
end
|
211
196
|
end
|
data/spec/search_engines_spec.rb
CHANGED
@@ -3,19 +3,16 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
3
3
|
module GovKit::SearchEngines
|
4
4
|
describe GovKit::SearchEngines do
|
5
5
|
before(:all) do
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
urls.each do |u|
|
18
|
-
FakeWeb.register_uri(:get, "#{google_news_uri}#{u[0]}", :response => File.join(FIXTURES_DIR, 'search_engines', u[1]))
|
6
|
+
unless FakeWeb.allow_net_connect?
|
7
|
+
google_news_uri = "http://news.google.com/"
|
8
|
+
|
9
|
+
urls = [
|
10
|
+
[ "news?q=congress&output=rss&num=50", "google_news.response" ]
|
11
|
+
]
|
12
|
+
|
13
|
+
urls.each do |u|
|
14
|
+
FakeWeb.register_uri(:get, "#{google_news_uri}#{u[0]}", :response => File.join(FIXTURES_DIR, 'search_engines', u[1]))
|
15
|
+
end
|
19
16
|
end
|
20
17
|
end
|
21
18
|
|
data/spec/spec_helper.rb
CHANGED
@@ -3,6 +3,22 @@ require 'rspec'
|
|
3
3
|
require 'fakeweb'
|
4
4
|
require File.dirname(__FILE__) + '/../lib/govkit'
|
5
5
|
|
6
|
+
# Set to true to run tests against the live URLs, and add the following to
|
7
|
+
# spec/support/api_keys.rb:
|
8
|
+
#
|
9
|
+
# unless FakeWeb.allow_net_connect?
|
10
|
+
# GovKit.configure do |config|
|
11
|
+
# config.sunlight_apikey = 'YOUR_SUNLIGHT_API_KEY'
|
12
|
+
# config.votesmart_apikey = 'YOUR_VOTESMART_API_KEY'
|
13
|
+
# config.ftm_apikey = 'YOUR_FTM_API_KEY'
|
14
|
+
# end
|
15
|
+
# end
|
16
|
+
FakeWeb.allow_net_connect = false
|
17
|
+
|
18
|
+
# Requires supporting ruby files with custom matchers and macros, etc,
|
19
|
+
# in spec/support/ and its subdirectories.
|
20
|
+
Dir[File.join(File.dirname(__FILE__), 'support', '**', '*.rb')].each {|f| require f}
|
21
|
+
|
6
22
|
# prevent the use of `` in tests
|
7
23
|
RSpec.configure do |c|
|
8
24
|
end
|
@@ -25,12 +41,4 @@ module Kernel
|
|
25
41
|
end
|
26
42
|
end
|
27
43
|
|
28
|
-
FakeWeb.allow_net_connect = false
|
29
|
-
|
30
44
|
FIXTURES_DIR = File.join(File.dirname(__FILE__), 'fixtures')
|
31
|
-
|
32
|
-
GovKit.configure do |config|
|
33
|
-
config.openstates_apikey = 'YOUR_OPENSTATES_API_KEY'
|
34
|
-
config.votesmart_apikey = 'YOUR_VOTESMART_API_KEY'
|
35
|
-
config.ftm_apikey = 'YOUR_FTM_API_KEY'
|
36
|
-
end
|