get_your_rep 0.1.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4c39c75a50253c1577d10857f573ecaa22d15db5
4
+ data.tar.gz: 864d2b90e058ced10c772a335b8955267e1c72b9
5
+ SHA512:
6
+ metadata.gz: c3953b26969bd0c12c19e30c114c1d7c2110dba4800d7370b5907a61b31d550720ab8a3c73774ddafa5bf07a57cbfad62601d2de7a3cedd55442550b6145104a
7
+ data.tar.gz: 682ed118c5cf9e013f2bcfe525a113b5946cbd4aeebf005d9402e0bf08b02e0125fde00a01c2ee564860681f8ac4a98bb62c559ad3a91b77ce5be3aab64fcbd0
@@ -0,0 +1,23 @@
1
+ ##
2
+ # Core class extensions.
3
+ module CoreExtensions
4
+ ##
5
+ # Extend the core Array class.
6
+ module Array
7
+ ##
8
+ # Patches for GetYourRep namespace.
9
+ module GetYourRepMutations
10
+
11
+ # Converts an Array to a Delegation
12
+ def to_del
13
+ GetYourRep::Delegation.new(self)
14
+ end
15
+
16
+ # Converts an Array to a Representative
17
+ def to_rep
18
+ GetYourRep::Representative[to_h]
19
+ end
20
+
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,24 @@
1
+ ##
2
+ # Core class extensions.
3
+ module CoreExtensions
4
+ ##
5
+ # Extend the core Hash class.
6
+ module Hash
7
+ ##
8
+ # Patches for GetYourRep namespace.
9
+ module GetYourRepMutations
10
+
11
+ # Wraps a Hash in a Delegation
12
+ def to_del
13
+ del = GetYourRep::Delegation.new
14
+ del << self
15
+ end
16
+
17
+ # Converts a Hash to a Representative
18
+ def to_rep
19
+ GetYourRep::Representative[self]
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,26 @@
1
+ require 'httparty'
2
+ require 'geocoder'
3
+ require 'get_your_rep/open_states'
4
+ require 'get_your_rep/delegation'
5
+ require 'get_your_rep/representative'
6
+ require 'get_your_rep/google'
7
+ require 'core_extensions/array/get_your_rep_mutations'
8
+ require 'core_extensions/hash/get_your_rep_mutations'
9
+
10
+ ##
11
+ # Monkey patch the Array and Hash classes with .to_rep and .to_del methods.
12
+ Array.include CoreExtensions::Array::GetYourRepMutations
13
+ Hash.include CoreExtensions::Hash::GetYourRepMutations
14
+
15
+ ##
16
+ # Top level namespace.
17
+ module GetYourRep
18
+
19
+ ##
20
+ # Get all reps using Google for state executives and national reps,
21
+ # and OpenStates for state reps.
22
+ def self.all(address)
23
+ @reps = Google.top_level_reps(address)
24
+ @reps << OpenStates.now(address)
25
+ end
26
+ end
@@ -0,0 +1,87 @@
1
+ module GetYourRep
2
+
3
+ # The Delegation class inherits from Array and describes methods that can be called on a Delegation for ease of display and database query.
4
+ class Delegation < Array
5
+
6
+ # Overloads the << operator so the receiving object is not overwritten as an Array, and there are no nested Delegations.
7
+ def <<(value)
8
+
9
+ if value.is_a?(Delegation) || value.is_a?(Array)
10
+ self.replace(self + value)
11
+ else
12
+ super
13
+ end
14
+
15
+ end
16
+
17
+ # Overloads the + operator to return a new Delegation instead of an Array.
18
+ def +(value)
19
+ super.to_del
20
+ end
21
+
22
+ # Overloads #reverse to return a new Delegation instead of an Array.
23
+ def reverse
24
+ self.replace(super)
25
+ end
26
+
27
+ # Collects the first names of every rep in the Delegation.
28
+ def first_names
29
+ self.map { |rep| rep.first_name }
30
+ end
31
+
32
+ # Collects the last names of every rep in the Delegation.
33
+ def last_names
34
+ self.map { |rep| rep.last_name }
35
+ end
36
+
37
+ # Maps all rep business cards.
38
+ def business_cards
39
+ self.map { |rep| rep.business_card }
40
+ end
41
+
42
+ # Get the [1] index.
43
+ def second
44
+ self[1]
45
+ end
46
+
47
+ # Get the [2] index.
48
+ def third
49
+ self[2]
50
+ end
51
+
52
+ # Get the [3] index.
53
+ def fourth
54
+ self[3]
55
+ end
56
+
57
+ # Get the [4] index.
58
+ def fifth
59
+ self[4]
60
+ end
61
+
62
+ # Get the [5] index.
63
+ def sixth
64
+ self[5]
65
+ end
66
+
67
+ # Get the [6] index.
68
+ def seventh
69
+ self[6]
70
+ end
71
+
72
+ # Get the [7] index.
73
+ def eigth
74
+ self[7]
75
+ end
76
+
77
+ # Get the [8] index.
78
+ def ninth
79
+ self[8]
80
+ end
81
+
82
+ # Get the [9] index.
83
+ def tenth
84
+ self[9]
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,188 @@
1
+ module GetYourRep
2
+
3
+ # Retrieve your elected representatives from the Google Civic Information API, parse it from
4
+ # JSON, and assemble it into a usable Ruby Hash-like object called a Representative.
5
+ # Representatives are then wrapped in an Array-like object called a Delegation.
6
+ #
7
+ # You must configure your own Google API key as an environment variable using the constant name
8
+ # 'GOOGLE_API_KEY' in order for this gem to work.
9
+ class Google
10
+
11
+ # The Google API key is used to access data from the Google Civic Information API. You must
12
+ # obtain your own and configure it as an environment variable on your system.
13
+ API_KEY = ENV['GOOGLE_API_KEY']
14
+
15
+ # Initiates a chain of class method calls that will instantiate a
16
+ # Delegation object and return it.
17
+ # Supported options for :level are "national"(default) and "state".
18
+ # Supported options for :role are "representative"(default), "senator", "executive" and "vice executive".
19
+ def self.now(address, level: 'national', role: 'representative')
20
+ address = convert_zip_to_address(address) if address_is_a_zip?(address)
21
+ @address = parse_address(address)
22
+ @level = level
23
+ @role = role
24
+ get_rep
25
+ end
26
+
27
+ #Returns reps in Congress and State Legislature, plus Governor and Lieutenant Governor.
28
+ def self.all(address)
29
+ top_level_reps(address)
30
+
31
+ @role = 'representative'
32
+ state_rep = get_rep
33
+
34
+ @role = 'senator'
35
+ state_sen = get_rep
36
+
37
+ #Check the Open States API if Google can't find state reps.
38
+ if state_rep.empty? && state_sen.empty?
39
+ @reps << GetYourRep::OpenStates.now(@coordinates)
40
+ else
41
+ @reps << state_rep
42
+ @reps << state_sen
43
+ end
44
+
45
+ end
46
+
47
+ def self.top_level_reps(address)
48
+ @reps = now(address)
49
+
50
+ @role = 'senator'
51
+ @reps << get_rep
52
+
53
+ @level = 'state'
54
+ @role = 'executive'
55
+ @reps << get_rep
56
+
57
+ @role = 'vice executive'
58
+ @reps << get_rep
59
+ end
60
+
61
+ # Parses a String address and prepares for an HTTP request. Accepts Strings and Integers as args.
62
+ def self.parse_address(address)
63
+ address = '0%o' % address if address.is_a?(Integer)
64
+ raise "Entry must be of types String or Integer" if !address.is_a?(String)
65
+ address = address.tr(',', '').split.join('%20')
66
+ end
67
+
68
+ # Unparses a parsed address
69
+ # def self.unparsed_address(address)
70
+ # address.split('%20').join(' ')
71
+ # end
72
+
73
+ # Check if an address value is a zip code or a full address.
74
+ def self.address_is_a_zip?(address)
75
+ address = '0%o' % address if address.is_a?(Integer)
76
+ raise "Entry must be of types String or Integer" if !address.is_a?(String)
77
+ !(address =~ /^\d{5}(-\d{4})?$/).nil?
78
+ end
79
+
80
+ # Convert a zip code to a street address using Geocoder to convert zip to coordinates
81
+ # and coordinates to an address.
82
+ def self.convert_zip_to_address(address)
83
+ @coordinates = Geocoder.coordinates(address)
84
+ address = Geocoder.address(@coordinates)
85
+ trim_street_number(address)
86
+ end
87
+
88
+ # If a street number is a range reduce it to one number.
89
+ def self.trim_street_number(address)
90
+ address = address.split(' ')
91
+ address[0] = address[0].split('-').shift
92
+ address.join(' ')
93
+ end
94
+
95
+ # Sets parameters for and executes Google API request.
96
+ def self.get_rep
97
+
98
+ level = case @level
99
+ when 'national'
100
+ 'country'
101
+ when 'state'
102
+ 'administrativeArea1'
103
+ else
104
+ @level
105
+ end
106
+
107
+ role = case @role
108
+ when 'representative'
109
+ 'legislatorLowerBody'
110
+ when 'senator'
111
+ 'legislatorUpperBody'
112
+ when 'executive'
113
+ 'headOfGovernment'
114
+ when 'vice executive'
115
+ 'deputyHeadOfGovernment'
116
+ else
117
+ @role
118
+ end
119
+
120
+ url = "https://www.googleapis.com/civicinfo/v2/representatives?address=#{@address}%20&includeOffices=true&levels=#{level}&roles=#{role}&fields=offices%2Cofficials&key=#{API_KEY}"
121
+ @response = HTTParty.get(url).parsed_response
122
+ deliver_response
123
+ end
124
+
125
+ def self.deliver_response
126
+ if @response.empty?
127
+ puts "'Google can't find a rep with that address. Checking the Open States API."
128
+ return GetYourRep::Delegation.new
129
+ elsif @response['error']
130
+ puts 'Error message received. Confirm and re-enter your address and check your parameters.'
131
+ puts @response
132
+ return GetYourRep::Delegation.new
133
+ end
134
+ parse_rep
135
+ @delegation
136
+ end
137
+
138
+ # Parses the JSON response and assembles it into a Delegation object,
139
+ # except for social media attributes, which are handles by .parse_channels.
140
+ def self.parse_rep
141
+
142
+ @delegation = GetYourRep::Delegation.new
143
+ @officials = @response['officials']
144
+
145
+ @officials.each do |official|
146
+ @delegation << GetYourRep::Representative[
147
+ :name, official['name'],
148
+ :office, @response['offices'].first['name'],
149
+ :party, official['party'],
150
+ :phone, official['phones'],
151
+ :office_locations, offices(official),
152
+ :email, official['emails'] || [],
153
+ :url, (official['urls'].first if official['urls']),
154
+ :photo, official['photoUrl'],
155
+ ]
156
+ parse_channels(official) if official['channels']
157
+ end
158
+ end
159
+
160
+ def self.offices(official)
161
+ offices = []
162
+
163
+ official['address'].each do |office|
164
+ office_hash = {}
165
+
166
+ if office['line1'].downcase.match(/(state|house|senate|assembly|capitol|dirksen|reyburn|rayburn|legislative|legislature|government)+/)
167
+ office_hash[:type] = 'capitol'
168
+ else
169
+ office_hash[:type] = 'district'
170
+ end
171
+
172
+ office_hash[:line_1] = office['line1']
173
+ office_hash[:line_2] = office['line_2']
174
+ office_hash[:line_3] = "#{office['city'].capitalize}, #{office['state']} #{office['zip']}"
175
+ offices << office_hash
176
+ end
177
+
178
+ offices
179
+ end
180
+
181
+ # Parses social media handles and adds them to the Delegation object.
182
+ def self.parse_channels(official)
183
+ official['channels'].each do |channel|
184
+ @delegation.last[channel['type'].downcase.to_sym] = channel['id']
185
+ end
186
+ end
187
+ end
188
+ end
@@ -0,0 +1,105 @@
1
+ module GetYourRep
2
+
3
+ # Retrieve your elected state representatives from the Open States API, parse it from
4
+ # JSON, and assemble it into a usable Ruby Hash-like object called a Representative.
5
+ # Representatives are then wrapped in an Array-like object called a Delegation.
6
+ class OpenStates
7
+
8
+ # Initiates a chain of class method calls that will instantiate a
9
+ # Delegation object and return it.
10
+ def self.now(address)
11
+ @coordinates = get_coordinates(address)
12
+ @response = get_rep
13
+
14
+ if @response.empty?
15
+ puts 'Could not find your rep. Your location search might be too broad, try refining it.'
16
+ return GetYourRep::Delegation.new
17
+ elsif @response.first['error']
18
+ puts 'Error message received. Confirm and re-enter your address and check your parameters.'
19
+ puts @response
20
+ return GetYourRep::Delegation.new
21
+ end
22
+
23
+ parse_rep
24
+ @delegation
25
+ end
26
+
27
+ # Geocodes an address and returns the coordinates.
28
+ def self.get_coordinates(address)
29
+ return address if address.is_a?(Array)
30
+ address = '0%o' % address if address.is_a?(Integer)
31
+ raise "Entry must be coordinates or of types String or Integer" if !address.is_a?(String)
32
+ Geocoder.coordinates(address)
33
+ end
34
+
35
+ # Sets parameters for and executes Open States API request.
36
+ def self.get_rep
37
+ lat = @coordinates.first
38
+ long = @coordinates.last
39
+ url = "http://openstates.org/api/v1/legislators/geo/?lat=#{lat}&long=#{long}"
40
+ HTTParty.get(url).parsed_response
41
+ end
42
+
43
+ # Parses the JSON response and assembles it into a Delegation object.
44
+ def self.parse_rep
45
+
46
+ @delegation = GetYourRep::Delegation.new
47
+
48
+ @response.each do |rep|
49
+ @delegation << GetYourRep::Representative[
50
+ :name, rep['full_name'].split(', ').reverse.join(' '),
51
+ :office, "#{rep['state'].upcase} #{rep['chamber'].capitalize} Chamber, #{rep['district']}",
52
+ :party, rep['party'],
53
+ :phone, phone(rep),
54
+ :office_locations, offices(rep),
55
+ :email, email(rep),
56
+ :url, rep['url'],
57
+ :photo, rep['photo_url'],
58
+ :committees, committees(rep)
59
+ ]
60
+ end
61
+ end
62
+
63
+ def self.offices(rep)
64
+ rep['offices'].map do |office|
65
+
66
+ office_hash = {}
67
+ office_hash[:type] = office['type']
68
+ address = office['address'].split("\n")
69
+
70
+ if address.size == 1
71
+ address = office['address'].split(', ')
72
+ end
73
+
74
+ if office['name'].downcase != "capitol office" &&
75
+ office['name'].downcase != "district office"
76
+
77
+ address.unshift(office['name'])
78
+ end
79
+
80
+ i = 1
81
+ address.each do |line|
82
+ office_hash["line_#{i}".to_sym] = line
83
+ i += 1
84
+ end
85
+
86
+ office_hash
87
+ end
88
+ end
89
+
90
+ # Parses the phone, giving preference to district office..
91
+ def self.phone(rep)
92
+ rep['offices'].map { |office| office['phone']} - [nil]
93
+ end
94
+
95
+ # Parses the email address.
96
+ def self.email(rep)
97
+ rep['offices'].map { |office| office['email'] } - [nil]
98
+ end
99
+
100
+ # Parses committee involvement.
101
+ def self.committees(rep)
102
+ rep['roles'].map { |role| role['committee'] } - [nil]
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,272 @@
1
+ module GetYourRep
2
+
3
+ # Stores rep info in key/value pairs, and makes values accessible by instance method.
4
+ class Representative < Hash
5
+
6
+ # Maps attributes to a simple array for easy printing, iteration, and display. It uses #each rather than #map so it can skip over nil values without mapping them.
7
+ def business_card
8
+
9
+ card = []
10
+
11
+ self.each do |key, value|
12
+ next if value.nil?
13
+ if key == :facebook || key == :twitter || key == :youtube || key == :googleplus
14
+ card << "#{key.to_s.capitalize}: #{value}"
15
+ else
16
+ card << "#{value}"
17
+ end
18
+ end
19
+
20
+ card
21
+ end
22
+
23
+ # Get the :name value.
24
+ def name
25
+ @name = self[:name]
26
+ end
27
+
28
+ # Set the :name value.
29
+ def name=(value)
30
+ @name = value
31
+ self[:name] = @name
32
+ end
33
+
34
+ # Strips the first name out of the full name if there's no :first_name.
35
+ def first_name
36
+
37
+ return self[:first_name] if self[:first_name]
38
+
39
+ if (name.split.count > 3) || (name.split[-2].downcase == name.split[-2])
40
+ name.split[0..-3].join(' ')
41
+ else
42
+ name.split[0..-2].join(' ')
43
+ end
44
+
45
+ end
46
+
47
+ # Get the :middle_name value.
48
+ def middle_name
49
+ @middle_name = self[:middle_name]
50
+ end
51
+
52
+ # Strips the surname out of the full name if there's no :last_name.
53
+ def last_name
54
+
55
+ return self[:last_name] if self[:last_name]
56
+
57
+ if (name.split.count > 3) || (name.split[-2].downcase == name.split[-2])
58
+ name.split[-2..-1].join(' ')
59
+ else
60
+ name.split.last
61
+ end
62
+
63
+ end
64
+
65
+ # Get the :office value.
66
+ def office
67
+ @office = self[:office]
68
+ end
69
+
70
+ # Set the :office value.
71
+ def office=(value)
72
+ @office = value
73
+ self[:office] = @office
74
+ end
75
+
76
+ # Get the :party value.
77
+ def party
78
+ @party = self[:party]
79
+ end
80
+
81
+ # Set the :party value.
82
+ def party=(value)
83
+ @party = value
84
+ self[:party] = @party
85
+ end
86
+
87
+ # Get the :phone value.
88
+ def phone
89
+ @phone = self[:phone]
90
+ end
91
+
92
+ # Set the :phone value.
93
+ def phone=(value)
94
+ @phone = value
95
+ self[:phone] = @phone
96
+ end
97
+
98
+ # Get the :alt_phone value.
99
+ # def alt_phone
100
+ # @alt_phone = self[:alt_phone]
101
+ # end
102
+
103
+ # Set the :alt_phone value.
104
+ # def alt_phone=(value)
105
+ # @alt_phone = value
106
+ # self[:alt_phone] = @alt_phone
107
+ # end
108
+
109
+ # Get the :alt_address_1 value.
110
+ # def alt_address_1
111
+ # @alt_address_1 = self[:alt_address_1]
112
+ # end
113
+
114
+ # Set the :alt_address_1 value.
115
+ # def alt_address_1=(value)
116
+ # @alt_address_1 = value
117
+ # self[:alt_address_1] = @alt_address_1
118
+ # end
119
+
120
+ # Get the :alt_address_2 value.
121
+ # def alt_address_2
122
+ # @alt_address_2 = self[:alt_address_2]
123
+ # end
124
+
125
+ # Set the :alt_address_2 value.
126
+ # def alt_address_2=(value)
127
+ # @alt_address_2 = value
128
+ # self[:alt_address_2] = @alt_address_2
129
+ # end
130
+
131
+ # Get the :alt_address_3 value.
132
+ # def alt_address_3
133
+ # @alt_address_3 = self[:alt_address_3]
134
+ # end
135
+
136
+ # Set the :alt_address_3 value.
137
+ # def alt_address_3=(value)
138
+ # @alt_address_3 = value
139
+ # self[:alt_address_3] = @alt_address_3
140
+ # end
141
+
142
+ # Get the :address_1 value.
143
+ # def address_1
144
+ # @address_1 = self[:address_1]
145
+ # end
146
+
147
+ # Set the :address_1 value.
148
+ # def address_1=(value)
149
+ # @address_1 = value
150
+ # self[:address_1] = @address_1
151
+ # end
152
+
153
+ # Get the :address_2 value.
154
+ # def address_2
155
+ # @address_2 = self[:address_2]
156
+ # end
157
+
158
+ # Set the :address_2 value.
159
+ # def address_2=(value)
160
+ # @address_2 = value
161
+ # self[:address_2] = @address_2
162
+ # end
163
+
164
+ # Get the :address_3 value.
165
+ # def address_3
166
+ # @address_3 = self[:address_3]
167
+ # end
168
+
169
+ # Set the :address_3 value.
170
+ # def address_3=(value)
171
+ # @address_3 = value
172
+ # self[:address_3] = @address_3
173
+ # end
174
+
175
+ def office_locations
176
+ @office_locations = self[:office_locations]
177
+ end
178
+
179
+ def office_locations=(value)
180
+ @office_locations = value
181
+ self[:office_locations] = @office_locations
182
+ end
183
+
184
+ # Get the :email value.
185
+ def email
186
+ @email = self[:email]
187
+ end
188
+
189
+ # Set the :email value.
190
+ def email=(value)
191
+ @email = value
192
+ self[:email] = @email
193
+ end
194
+
195
+ # Get the :committees value.
196
+ def committees
197
+ @committees = self[:committees]
198
+ end
199
+
200
+ # Set the :committees value.
201
+ def committees=(value)
202
+ @committees = value
203
+ self[:committees] = @committees
204
+ end
205
+
206
+ # Get the :url value.
207
+ def url
208
+ @url = self[:url]
209
+ end
210
+
211
+ # Set the :url value.
212
+ def url=(value)
213
+ @url = value
214
+ self[:url] = @url
215
+ end
216
+
217
+ # Get the :photo value.
218
+ def photo
219
+ @photo = self[:photo]
220
+ end
221
+
222
+ # Set the :photo value.
223
+ def photo=(value)
224
+ @photo = value
225
+ self[:photo] = @photo
226
+ end
227
+
228
+ # Get the :twitter value.
229
+ def twitter
230
+ @twitter = self[:twitter]
231
+ end
232
+
233
+ # Set the :twitter value.
234
+ def twitter=(value)
235
+ @twitter = value
236
+ self[:twitter] = @twitter
237
+ end
238
+
239
+ # Get the :facebook value.
240
+ def facebook
241
+ @facebook = self[:facebook]
242
+ end
243
+
244
+ # Set the :facebook value.
245
+ def facebook=(value)
246
+ @facebook = value
247
+ self[:facebook] = @facebook
248
+ end
249
+
250
+ # Get the :youtube value.
251
+ def youtube
252
+ @youtube = self[:youtube]
253
+ end
254
+
255
+ # Set the :youtube value.
256
+ def youtube=(value)
257
+ @youtube = value
258
+ self[:youtube] = @youtube
259
+ end
260
+
261
+ # Get the :googleplus value.
262
+ def googleplus
263
+ @googleplus = self[:googleplus]
264
+ end
265
+
266
+ # Set the :googleplus value.
267
+ def googleplus=(value)
268
+ @googleplus = value
269
+ self[:googleplus] = @googleplus
270
+ end
271
+ end
272
+ end
metadata ADDED
@@ -0,0 +1,157 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: get_your_rep
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - msimonborg
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-12-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: httparty
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: geocoder
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.4'
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 1.4.1
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: '1.4'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 1.4.1
47
+ - !ruby/object:Gem::Dependency
48
+ name: pry
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: minitest
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '5.10'
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: 5.10.1
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: '5.10'
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: 5.10.1
81
+ - !ruby/object:Gem::Dependency
82
+ name: minitest-reporters
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '1.1'
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: 1.1.13
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '1.1'
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: 1.1.13
101
+ - !ruby/object:Gem::Dependency
102
+ name: rake
103
+ requirement: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - "~>"
106
+ - !ruby/object:Gem::Version
107
+ version: '10'
108
+ type: :development
109
+ prerelease: false
110
+ version_requirements: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - "~>"
113
+ - !ruby/object:Gem::Version
114
+ version: '10'
115
+ description: Get your rep with Google's Civic Information API using your address and
116
+ API key. Also access the Open States API for additional information about state
117
+ legislators. Formerly get-your-rep. New API, new guts, faster performance, more
118
+ extensible, better results. Zip codes are geocoded for improved data returns. Namespaced
119
+ to avoid naming collisions. Generally better programmed. Changes to API may persist
120
+ until 1.0. Documentation will be updated soon.
121
+ email: msimonborg@gmail.com
122
+ executables: []
123
+ extensions: []
124
+ extra_rdoc_files: []
125
+ files:
126
+ - lib/core_extensions/array/get_your_rep_mutations.rb
127
+ - lib/core_extensions/hash/get_your_rep_mutations.rb
128
+ - lib/get_your_rep.rb
129
+ - lib/get_your_rep/delegation.rb
130
+ - lib/get_your_rep/google.rb
131
+ - lib/get_your_rep/open_states.rb
132
+ - lib/get_your_rep/representative.rb
133
+ homepage: https://github.com/msimonborg/get-your-rep
134
+ licenses:
135
+ - MIT
136
+ metadata: {}
137
+ post_install_message:
138
+ rdoc_options: []
139
+ require_paths:
140
+ - lib
141
+ required_ruby_version: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: 2.0.0
146
+ required_rubygems_version: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ requirements: []
152
+ rubyforge_project:
153
+ rubygems_version: 2.5.2
154
+ signing_key:
155
+ specification_version: 4
156
+ summary: Get yo' rep!
157
+ test_files: []