congress 0.1.1 → 0.2.0
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.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +0 -0
- data/.gitignore +5 -35
- data/.rspec +1 -2
- data/.rubocop.yml +81 -0
- data/.travis.yml +22 -4
- data/CONTRIBUTING.md +49 -0
- data/Gemfile +20 -6
- data/LICENSE.md +1 -1
- data/README.md +3 -60
- data/Rakefile +23 -3
- data/congress.gemspec +3 -2
- data/lib/congress/client.rb +38 -35
- data/lib/congress/connection.rb +16 -6
- data/lib/congress/request.rb +3 -2
- data/lib/congress/version.rb +1 -1
- data/lib/congress.rb +20 -20
- data/spec/congress/client_spec.rb +100 -89
- data/spec/congress_spec.rb +26 -9
- data/spec/fixtures/google_geocoding.json +1 -0
- data/spec/helper.rb +13 -3
- data.tar.gz.sig +0 -0
- metadata +63 -71
- metadata.gz.sig +0 -0
data/lib/congress.rb
CHANGED
@@ -1,27 +1,27 @@
|
|
1
1
|
require 'congress/client'
|
2
2
|
|
3
3
|
module Congress
|
4
|
-
|
5
|
-
|
6
|
-
def configure
|
7
|
-
yield self
|
8
|
-
end
|
4
|
+
extend self # rubocop:disable ModuleFunction
|
5
|
+
attr_accessor :key
|
9
6
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
def method_missing(method, *args, &block)
|
19
|
-
return super unless new.respond_to?(method)
|
20
|
-
new.send(method, *args, &block)
|
21
|
-
end
|
7
|
+
# Alias for Congress::Client.new
|
8
|
+
#
|
9
|
+
# @return [Congress::Client]
|
10
|
+
def new(key = key)
|
11
|
+
yield self if block_given?
|
12
|
+
return @client if instance_variable_defined?(:@client) && @client.key == key
|
13
|
+
@client = Congress::Client.new(key)
|
14
|
+
end
|
22
15
|
|
23
|
-
|
24
|
-
|
25
|
-
|
16
|
+
# Delegate to Congress::Client
|
17
|
+
def method_missing(method, *args, &block)
|
18
|
+
return super unless new.respond_to?(method)
|
19
|
+
new.send(method, *args, &block)
|
26
20
|
end
|
21
|
+
|
22
|
+
# @return [Boolean]
|
23
|
+
def respond_to?(method, include_private = false) new.respond_to?(method, include_private) end if RUBY_VERSION < '1.9' # rubocop:disable SingleLineMethods
|
24
|
+
|
25
|
+
# @return [Boolean]
|
26
|
+
def respond_to_missing?(method_name, include_private = false) new.respond_to?(method_name, include_private) end if RUBY_VERSION >= '1.9' # rubocop:disable SingleLineMethods
|
27
27
|
end
|
@@ -1,194 +1,205 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
3
|
describe Congress::Client do
|
4
|
+
let(:gmaps_api) { 'http://maps.googleapis.com/maps/api/geocode/json?address=2169%20Mission%20Street,%20San%20Francisco,%20CA%2094110&language=en&sensor=false' }
|
5
|
+
|
4
6
|
before do
|
5
|
-
@client = Congress::Client.new
|
6
|
-
Congress.configure do |config|
|
7
|
-
config.key = "abc123"
|
8
|
-
end
|
7
|
+
@client = Congress::Client.new('abc123')
|
9
8
|
end
|
10
9
|
|
11
10
|
describe '#legislators' do
|
12
11
|
before do
|
13
|
-
stub_get('/legislators
|
12
|
+
stub_get('/legislators').
|
14
13
|
to_return(:status => 200, :body => fixture('legislators.json'))
|
15
14
|
end
|
16
15
|
it "fetches current legislators' names, IDs, biography, and social media" do
|
17
16
|
legislators = @client.legislators
|
18
|
-
a_get('/legislators
|
19
|
-
|
20
|
-
legislators['
|
21
|
-
legislators['results'].first.bioguide_id.should == "K000385"
|
17
|
+
expect(a_get('/legislators').with(:headers => {'X-APIKEY' => 'abc123'})).to have_been_made
|
18
|
+
expect(legislators['count']).to eq(539)
|
19
|
+
expect(legislators['results'].first.bioguide_id).to eq('K000385')
|
22
20
|
end
|
23
21
|
end
|
24
22
|
|
25
23
|
describe '#legislators_locate' do
|
26
|
-
context
|
24
|
+
context 'with a zip code passed' do
|
27
25
|
before do
|
28
|
-
stub_get('/legislators/locate?
|
26
|
+
stub_get('/legislators/locate?zip=94107').
|
29
27
|
to_return(:status => 200, :body => fixture('legislators_locate.json'))
|
30
28
|
end
|
31
|
-
it
|
29
|
+
it 'fetches representatives and senators for a zip code' do
|
32
30
|
legislators_locate = @client.legislators_locate(94107)
|
33
|
-
a_get('/legislators/locate?
|
34
|
-
|
35
|
-
legislators_locate['
|
36
|
-
legislators_locate['results'].first.bioguide_id.should == "P000197"
|
31
|
+
expect(a_get('/legislators/locate?zip=94107').with(:headers => {'X-APIKEY' => 'abc123'})).to have_been_made
|
32
|
+
expect(legislators_locate['count']).to eq(3)
|
33
|
+
expect(legislators_locate['results'].first.bioguide_id).to eq('P000197')
|
37
34
|
end
|
38
35
|
end
|
39
|
-
context
|
36
|
+
context 'with a latitude and longitude passed' do
|
40
37
|
before do
|
41
|
-
stub_get('/legislators/locate?
|
38
|
+
stub_get('/legislators/locate?latitude=37.775&longitude=-122.418').
|
42
39
|
to_return(:status => 200, :body => fixture('legislators_locate.json'))
|
43
40
|
end
|
44
|
-
it
|
41
|
+
it 'fetches representatives and senators for a latitude/longitude pair' do
|
45
42
|
legislators_locate = @client.legislators_locate(37.775, -122.418)
|
46
|
-
a_get('/legislators/locate?
|
47
|
-
|
48
|
-
legislators_locate['
|
49
|
-
|
43
|
+
expect(a_get('/legislators/locate?latitude=37.775&longitude=-122.418').with(:headers => {'X-APIKEY' => 'abc123'})).to have_been_made
|
44
|
+
expect(legislators_locate['count']).to eq(3)
|
45
|
+
expect(legislators_locate['results'].first.bioguide_id).to eq('P000197')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
context 'with an address passed' do
|
49
|
+
before do
|
50
|
+
stub_get('/legislators/locate?latitude=37.775&longitude=-122.418').
|
51
|
+
to_return(:status => 200, :body => fixture('legislators_locate.json'))
|
52
|
+
stub_request(:get, gmaps_api).to_return(:status => 200, :body => fixture('google_geocoding.json'))
|
53
|
+
end
|
54
|
+
it 'fetches representatives and senators for an address' do
|
55
|
+
legislators_locate = @client.legislators_locate('2169 Mission Street, San Francisco, CA 94110')
|
56
|
+
expect(a_request(:get, gmaps_api)).to have_been_made
|
57
|
+
expect(a_get('/legislators/locate?latitude=37.775&longitude=-122.418').with(:headers => {'X-APIKEY' => 'abc123'})).to have_been_made
|
58
|
+
expect(legislators_locate['count']).to eq(3)
|
59
|
+
expect(legislators_locate['results'].first.bioguide_id).to eq('P000197')
|
50
60
|
end
|
51
61
|
end
|
52
|
-
context
|
53
|
-
it
|
54
|
-
|
55
|
-
@client.legislators_locate
|
56
|
-
}.should raise_error ArgumentError
|
62
|
+
context 'with no arguments passed' do
|
63
|
+
it 'raises an argument error' do
|
64
|
+
expect { @client.legislators_locate }.to raise_error ArgumentError
|
57
65
|
end
|
58
66
|
end
|
59
67
|
end
|
60
68
|
|
61
69
|
describe '#districts_locate' do
|
62
|
-
context
|
70
|
+
context 'with a zip code passed' do
|
63
71
|
before do
|
64
|
-
stub_get('/districts/locate?
|
72
|
+
stub_get('/districts/locate?zip=94107').
|
65
73
|
to_return(:status => 200, :body => fixture('districts_locate.json'))
|
66
74
|
end
|
67
|
-
it
|
75
|
+
it 'fetches congressional districts for a zip code' do
|
68
76
|
districts_locate = @client.districts_locate(94107)
|
69
|
-
a_get('/districts/locate?
|
70
|
-
|
71
|
-
districts_locate['
|
72
|
-
districts_locate['results'].first.district.should == 12
|
77
|
+
expect(a_get('/districts/locate?zip=94107').with(:headers => {'X-APIKEY' => 'abc123'})).to have_been_made
|
78
|
+
expect(districts_locate['count']).to eq(1)
|
79
|
+
expect(districts_locate['results'].first.district).to eq(12)
|
73
80
|
end
|
74
81
|
end
|
75
|
-
context
|
82
|
+
context 'with a latitude and longitude passed' do
|
76
83
|
before do
|
77
|
-
stub_get('/districts/locate?
|
84
|
+
stub_get('/districts/locate?latitude=37.775&longitude=-122.418').
|
78
85
|
to_return(:status => 200, :body => fixture('districts_locate.json'))
|
79
86
|
end
|
80
|
-
it
|
87
|
+
it 'fetches congressional districts for a latitude/longitude pair' do
|
81
88
|
districts_locate = @client.districts_locate(37.775, -122.418)
|
82
|
-
a_get('/districts/locate?
|
83
|
-
|
84
|
-
districts_locate['
|
85
|
-
|
89
|
+
expect(a_get('/districts/locate?latitude=37.775&longitude=-122.418').with(:headers => {'X-APIKEY' => 'abc123'})).to have_been_made
|
90
|
+
expect(districts_locate['count']).to eq(1)
|
91
|
+
expect(districts_locate['results'].first.district).to eq(12)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
context 'with an address passed' do
|
95
|
+
before do
|
96
|
+
stub_get('/districts/locate?latitude=37.775&longitude=-122.418').
|
97
|
+
to_return(:status => 200, :body => fixture('districts_locate.json'))
|
98
|
+
stub_request(:get, gmaps_api).to_return(:status => 200, :body => fixture('google_geocoding.json'))
|
99
|
+
end
|
100
|
+
it 'fetches congressional districts for an address' do
|
101
|
+
districts_locate = @client.districts_locate('2169 Mission Street, San Francisco, CA 94110')
|
102
|
+
expect(a_request(:get, gmaps_api)).to have_been_made
|
103
|
+
expect(a_get('/districts/locate?latitude=37.775&longitude=-122.418').with(:headers => {'X-APIKEY' => 'abc123'})).to have_been_made
|
104
|
+
expect(districts_locate['count']).to eq(1)
|
105
|
+
expect(districts_locate['results'].first.district).to eq(12)
|
86
106
|
end
|
87
107
|
end
|
88
|
-
context
|
89
|
-
it
|
90
|
-
|
91
|
-
@client.districts_locate
|
92
|
-
}.should raise_error ArgumentError
|
108
|
+
context 'with no arguments passed' do
|
109
|
+
it 'raises an argument error' do
|
110
|
+
expect { @client.districts_locate }.to raise_error ArgumentError
|
93
111
|
end
|
94
112
|
end
|
95
113
|
end
|
96
114
|
|
97
115
|
describe '#committees' do
|
98
116
|
before do
|
99
|
-
stub_get('/committees
|
117
|
+
stub_get('/committees').
|
100
118
|
to_return(:status => 200, :body => fixture('committees.json'))
|
101
119
|
end
|
102
|
-
it
|
120
|
+
it 'fetches current committees, subcommittees, and their membership' do
|
103
121
|
committees = @client.committees
|
104
|
-
a_get('/committees
|
105
|
-
|
106
|
-
committees['
|
107
|
-
committees['results'].first.chamber.should == "senate"
|
122
|
+
expect(a_get('/committees').with(:headers => {'X-APIKEY' => 'abc123'})).to have_been_made
|
123
|
+
expect(committees['count']).to eq(120)
|
124
|
+
expect(committees['results'].first.chamber).to eq('senate')
|
108
125
|
end
|
109
126
|
end
|
110
127
|
|
111
128
|
describe '#bills' do
|
112
129
|
before do
|
113
|
-
stub_get('/bills
|
130
|
+
stub_get('/bills').
|
114
131
|
to_return(:status => 200, :body => fixture('bills.json'))
|
115
132
|
end
|
116
|
-
it
|
133
|
+
it 'fetches legislation in the House and Senate' do
|
117
134
|
bills = @client.bills
|
118
|
-
a_get('/bills
|
119
|
-
|
120
|
-
bills['
|
121
|
-
bills['results'].first.bill_id.should == "s730-113"
|
135
|
+
expect(a_get('/bills').with(:headers => {'X-APIKEY' => 'abc123'})).to have_been_made
|
136
|
+
expect(bills['count']).to eq(28614)
|
137
|
+
expect(bills['results'].first.bill_id).to eq('s730-113')
|
122
138
|
end
|
123
139
|
end
|
124
140
|
|
125
141
|
describe '#bills_search' do
|
126
142
|
before do
|
127
|
-
stub_get('/bills/search
|
143
|
+
stub_get('/bills/search').
|
128
144
|
to_return(:status => 200, :body => fixture('bills_search.json'))
|
129
145
|
end
|
130
|
-
it
|
146
|
+
it 'fetches legislation' do
|
131
147
|
bills_search = @client.bills_search
|
132
|
-
a_get('/bills/search
|
133
|
-
|
134
|
-
bills_search['
|
135
|
-
bills_search['results'].first.bill_type.should == "hr"
|
148
|
+
expect(a_get('/bills/search').with(:headers => {'X-APIKEY' => 'abc123'})).to have_been_made
|
149
|
+
expect(bills_search['count']).to eq(28614)
|
150
|
+
expect(bills_search['results'].first.bill_type).to eq('hr')
|
136
151
|
end
|
137
152
|
end
|
138
153
|
|
139
154
|
describe '#votes' do
|
140
155
|
before do
|
141
|
-
stub_get('/votes
|
156
|
+
stub_get('/votes').
|
142
157
|
to_return(:status => 200, :body => fixture('votes.json'))
|
143
158
|
end
|
144
|
-
it
|
159
|
+
it 'fetches roll call votes in Congress' do
|
145
160
|
votes = @client.votes
|
146
|
-
a_get('/votes
|
147
|
-
|
148
|
-
votes['
|
149
|
-
votes['results'].first.roll_id.should == "h106-2013"
|
161
|
+
expect(a_get('/votes').with(:headers => {'X-APIKEY' => 'abc123'})).to have_been_made
|
162
|
+
expect(votes['count']).to eq(4647)
|
163
|
+
expect(votes['results'].first.roll_id).to eq('h106-2013')
|
150
164
|
end
|
151
165
|
end
|
152
166
|
|
153
167
|
describe '#floor_updates' do
|
154
168
|
before do
|
155
|
-
stub_get('/floor_updates
|
169
|
+
stub_get('/floor_updates').
|
156
170
|
to_return(:status => 200, :body => fixture('floor_updates.json'))
|
157
171
|
end
|
158
|
-
it
|
172
|
+
it 'fetches to-the-minute updates from the floor of the House and Senate' do
|
159
173
|
floor_updates = @client.floor_updates
|
160
|
-
a_get('/floor_updates
|
161
|
-
|
162
|
-
floor_updates['
|
163
|
-
floor_updates['results'].first.chamber.should == "senate"
|
174
|
+
expect(a_get('/floor_updates').with(:headers => {'X-APIKEY' => 'abc123'})).to have_been_made
|
175
|
+
expect(floor_updates['count']).to eq(3066)
|
176
|
+
expect(floor_updates['results'].first.chamber).to eq('senate')
|
164
177
|
end
|
165
178
|
end
|
166
179
|
|
167
180
|
describe '#hearings' do
|
168
181
|
before do
|
169
|
-
stub_get('/hearings
|
182
|
+
stub_get('/hearings').
|
170
183
|
to_return(:status => 200, :body => fixture('hearings.json'))
|
171
184
|
end
|
172
|
-
it
|
185
|
+
it 'fetches committee hearings in Congress' do
|
173
186
|
hearings = @client.hearings
|
174
|
-
a_get('/hearings
|
175
|
-
|
176
|
-
hearings['
|
177
|
-
hearings['results'].first.committee_id.should == "SSFR"
|
187
|
+
expect(a_get('/hearings').with(:headers => {'X-APIKEY' => 'abc123'})).to have_been_made
|
188
|
+
expect(hearings['count']).to eq(1279)
|
189
|
+
expect(hearings['results'].first.committee_id).to eq('SSFR')
|
178
190
|
end
|
179
191
|
end
|
180
192
|
|
181
193
|
describe '#upcoming_bills' do
|
182
194
|
before do
|
183
|
-
stub_get('/upcoming_bills
|
195
|
+
stub_get('/upcoming_bills').
|
184
196
|
to_return(:status => 200, :body => fixture('upcoming_bills.json'))
|
185
197
|
end
|
186
|
-
it
|
198
|
+
it 'fetches bills scheduled for debate in the future, as announced by party leadership' do
|
187
199
|
upcoming_bills = @client.upcoming_bills
|
188
|
-
a_get('/upcoming_bills
|
189
|
-
|
190
|
-
upcoming_bills['
|
191
|
-
upcoming_bills['results'].first.bill_id.should == "s3457-113"
|
200
|
+
expect(a_get('/upcoming_bills').with(:headers => {'X-APIKEY' => 'abc123'})).to have_been_made
|
201
|
+
expect(upcoming_bills['count']).to eq(9)
|
202
|
+
expect(upcoming_bills['results'].first.bill_id).to eq('s3457-113')
|
192
203
|
end
|
193
204
|
end
|
194
205
|
|
data/spec/congress_spec.rb
CHANGED
@@ -1,18 +1,35 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
3
|
describe Congress do
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
before do
|
5
|
+
Congress.key = 'abc1234'
|
6
|
+
end
|
7
|
+
describe '.new' do
|
8
|
+
it 'returns a Congress::Client' do
|
9
|
+
expect(Congress.new).to be_a Congress::Client
|
10
|
+
end
|
11
|
+
it 'sets key with a blog' do
|
12
|
+
Congress.new do |c|
|
13
|
+
c.key = 'abc123'
|
14
|
+
end
|
15
|
+
expect(Congress.key).to eq('abc123')
|
16
|
+
end
|
17
|
+
context 'with no api key' do
|
18
|
+
it 'raises an argument error' do
|
19
|
+
expect { Congress.new(nil) }.to raise_error ArgumentError
|
20
|
+
end
|
7
21
|
end
|
8
22
|
end
|
9
23
|
|
10
|
-
describe
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
24
|
+
describe '.method_missing' do
|
25
|
+
before do
|
26
|
+
stub_get('/legislators').
|
27
|
+
to_return(:status => 200, :body => fixture('legislators.json'))
|
28
|
+
end
|
29
|
+
it 'delegates to an instance of Congress::Client' do
|
30
|
+
client = Congress.new
|
31
|
+
expect(client).to receive(:legislators)
|
32
|
+
Congress.legislators
|
16
33
|
end
|
17
34
|
end
|
18
35
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
{"results":[{"address_components":[{"long_name":"2169","short_name":"2169","types":["street_number"]},{"long_name":"Mission Street","short_name":"Mission St","types":["route"]},{"long_name":"Mission District","short_name":"Mission District","types":["neighborhood","political"]},{"long_name":"San Francisco","short_name":"SF","types":["locality","political"]},{"long_name":"San Francisco County","short_name":"San Francisco County","types":["administrative_area_level_2","political"]},{"long_name":"California","short_name":"CA","types":["administrative_area_level_1","political"]},{"long_name":"United States","short_name":"US","types":["country","political"]},{"long_name":"94110","short_name":"94110","types":["postal_code"]}],"formatted_address":"2169 Mission Street, San Francisco, CA 94110, USA","geometry":{"bounds":{"northeast":{"lat":37.7626032,"lng":-122.4194605},"southwest":{"lat":37.7626021,"lng":-122.4194789}},"location":{"lat":37.775,"lng":-122.418},"location_type":"RANGE_INTERPOLATED","viewport":{"northeast":{"lat":37.7639516302915,"lng":-122.4181207197085},"southwest":{"lat":37.7612536697085,"lng":-122.4208186802915}}},"types":["street_address"]}],"status":"OK"}
|
data/spec/helper.rb
CHANGED
@@ -5,20 +5,30 @@ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
|
5
5
|
SimpleCov::Formatter::HTMLFormatter,
|
6
6
|
Coveralls::SimpleCov::Formatter
|
7
7
|
]
|
8
|
-
|
8
|
+
|
9
|
+
SimpleCov.start do
|
10
|
+
add_filter '/spec/'
|
11
|
+
minimum_coverage(100)
|
12
|
+
end
|
9
13
|
|
10
14
|
require 'congress'
|
11
15
|
require 'rspec'
|
12
16
|
require 'webmock/rspec'
|
13
17
|
|
18
|
+
RSpec.configure do |config|
|
19
|
+
config.expect_with :rspec do |c|
|
20
|
+
c.syntax = :expect
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
14
24
|
WebMock.disable_net_connect!(:allow => 'coveralls.io')
|
15
25
|
|
16
26
|
def a_get(path)
|
17
|
-
a_request(:get,
|
27
|
+
a_request(:get, Congress::Client::ENDPOINT + path)
|
18
28
|
end
|
19
29
|
|
20
30
|
def stub_get(path)
|
21
|
-
stub_request(:get,
|
31
|
+
stub_request(:get, Congress::Client::ENDPOINT + path)
|
22
32
|
end
|
23
33
|
|
24
34
|
def fixture_path
|
data.tar.gz.sig
CHANGED
Binary file
|