govkit 0.7.2 → 0.7.3
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.
- 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
|