get-your-rep 0.1.0 → 1.0.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 +4 -4
- data/lib/get-your-rep.rb +44 -34
- data/lib/get-your-rep/delegation.rb +46 -0
- metadata +3 -3
- data/lib/getyourrep/rep.rb +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9b0541c0a6fc00771ce898665eb5dcd1fc0c73a5
|
4
|
+
data.tar.gz: 98b6170d9fa0d37868c826218343002706f43bb2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d1f40c6e1fc82f6019a00f798eee45ceb30e364e0f2dbc43e5f06bec2ddcde4f866aecec9553408867a38c363edd61c6a76a770c6647c6fc6ac74b4c36f06a76
|
7
|
+
data.tar.gz: ebad1ed2bb360ec70761381b36e38562b50bac2f0385fced2ffa2bbcece533401386538fafff33a6b4057d8b1f42a86ecf617e83317f31dd031e837fd0065aa2
|
data/lib/get-your-rep.rb
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
# require 'pry'
|
2
2
|
require 'httparty'
|
3
|
-
require_relative '
|
3
|
+
require_relative 'get-your-rep/delegation.rb'
|
4
4
|
|
5
|
-
# The GetYourRep class has a collection of class methods that retrieve
|
5
|
+
# The GetYourRep class has a collection of class methods that retrieve your elected representatives
|
6
6
|
# from the Google Civic Information API, parse it from JSON, and assemble it into a usable
|
7
|
-
# Ruby
|
7
|
+
# Ruby array-like object called a Delegation.
|
8
8
|
class GetYourRep
|
9
9
|
|
10
|
-
# Call GetYourRep#now to initiate a chain of method calls on self that will instantiate a
|
11
|
-
|
12
|
-
def self.now(address, level = 'national', role = 'representative')
|
10
|
+
# Call GetYourRep#now to initiate a chain of method calls on self that will instantiate a Delegation object and return it.
|
11
|
+
def self.now(address, level: 'national', role: 'representative')
|
13
12
|
@address = voter_address(address)
|
14
13
|
@api_key = ENV['GOOGLE_API_KEY']
|
15
14
|
@level = level
|
@@ -17,20 +16,20 @@ class GetYourRep
|
|
17
16
|
@response = get_rep
|
18
17
|
if @response.empty?
|
19
18
|
puts 'Could not find your rep. Your location search might be too broad, try refining it.'
|
20
|
-
return
|
19
|
+
return Delegation.new
|
21
20
|
elsif @response['error']
|
22
21
|
puts 'Error message received. Confirm and re-enter your address and check your parameters.'
|
23
|
-
return
|
22
|
+
return Delegation.new
|
24
23
|
end
|
25
24
|
parse_rep
|
26
|
-
parse_channels if @official['channels']
|
27
|
-
@
|
25
|
+
parse_channels if @officials.any? { |official| official['channels'] }
|
26
|
+
@reps
|
28
27
|
end
|
29
28
|
|
30
|
-
# Parses a String address and prepares for an HTTP request.
|
29
|
+
# Parses a String address and prepares for an HTTP request. Accepts Strings and Integers as args.
|
31
30
|
def self.voter_address(address)
|
32
|
-
|
33
|
-
raise "Entry must be of
|
31
|
+
address = '0%o' % address if address.is_a?(Integer)
|
32
|
+
raise "Entry must be of types String or Integer" if !address.is_a?(String)
|
34
33
|
address.tr(',', '').split.join('%20')
|
35
34
|
end
|
36
35
|
|
@@ -38,9 +37,9 @@ class GetYourRep
|
|
38
37
|
def self.get_rep
|
39
38
|
level = case @level
|
40
39
|
when 'national'
|
41
|
-
|
40
|
+
'country'
|
42
41
|
when 'state'
|
43
|
-
|
42
|
+
'administrativeArea1'
|
44
43
|
end
|
45
44
|
|
46
45
|
role = case @role
|
@@ -53,31 +52,42 @@ class GetYourRep
|
|
53
52
|
HTTParty.get(url).parsed_response
|
54
53
|
end
|
55
54
|
|
56
|
-
# Parses the JSON response and assembles it into a
|
55
|
+
# Parses the JSON response and assembles it into a Delegation object, except for social media attributes,
|
57
56
|
# which are handles by ::parse_channels.
|
58
57
|
def self.parse_rep
|
59
|
-
@
|
60
|
-
@
|
58
|
+
@reps = Delegation.new
|
59
|
+
@officials = @response['officials']
|
61
60
|
|
62
|
-
|
63
|
-
@
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
61
|
+
i = 0
|
62
|
+
@officials.each do |official|
|
63
|
+
@reps[i] = {}
|
64
|
+
|
65
|
+
@reps[i][:name] = official['name']
|
66
|
+
@reps[i][:office] = @response['offices'].first['name']
|
67
|
+
@reps[i][:party] = official['party']
|
68
|
+
@reps[i][:phone] = official['phones'].first
|
69
|
+
@reps[i][:address_1] = official['address'].first['line1']
|
70
|
+
@reps[i][:address_2] = official['address'].first['line2']
|
71
|
+
@reps[i][:address_3] = official['address'].first['line3']
|
72
|
+
@reps[i][:address_city] = official['address'].first['city'].capitalize
|
73
|
+
@reps[i][:address_state] = official['address'].first['state']
|
74
|
+
@reps[i][:address_zip] = official['address'].first['zip']
|
75
|
+
@reps[i][:email] = official['emails'] if official['emails']
|
76
|
+
@reps[i][:url] = official['urls'].first
|
77
|
+
@reps[i][:photo] = official['photoUrl']
|
78
|
+
i += 1
|
79
|
+
end
|
75
80
|
end
|
76
81
|
|
77
|
-
# Parses social media handles and adds them to the
|
82
|
+
# Parses social media handles and adds them to the Delegation object.
|
78
83
|
def self.parse_channels
|
79
|
-
|
80
|
-
|
84
|
+
i = 0
|
85
|
+
@officials.each do |official|
|
86
|
+
next unless official['channels']
|
87
|
+
official['channels'].each do |channel|
|
88
|
+
@reps[i][channel['type'].downcase.to_sym] = channel['id']
|
89
|
+
end
|
90
|
+
i += 1
|
81
91
|
end
|
82
92
|
end
|
83
93
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# The Delegation class inherits from Array and describes methods that can be called on a Delegation for ease of display and database query.
|
2
|
+
class Delegation < Array
|
3
|
+
|
4
|
+
# Overloads the << operator so the receiving object is not overwritten as an Array, and there are no nested Delegations.
|
5
|
+
def <<(value)
|
6
|
+
if value.is_a?(Delegation) || value.is_a?(Array)
|
7
|
+
self.replace(self + value)
|
8
|
+
else
|
9
|
+
super
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
# Collects the first names of every rep in the Delegation.
|
14
|
+
def first_names
|
15
|
+
self.map { |rep| rep[:name].split[0..-2].join(' ')}
|
16
|
+
end
|
17
|
+
|
18
|
+
# Collects the last names of every rep in the Delegation.
|
19
|
+
def last_names
|
20
|
+
self.map { |rep| rep[:name].split.last }
|
21
|
+
end
|
22
|
+
|
23
|
+
# 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.
|
24
|
+
def business_cards
|
25
|
+
card = []
|
26
|
+
i = 0
|
27
|
+
self.each do |rep|
|
28
|
+
card[i] = []
|
29
|
+
rep.each do |key, value|
|
30
|
+
next if value.nil?
|
31
|
+
case key
|
32
|
+
when :facebook
|
33
|
+
card[i] << "#{key.to_s.capitalize}: #{value}"
|
34
|
+
when :twitter
|
35
|
+
card[i] << "#{key.to_s.capitalize}: #{value}"
|
36
|
+
when :youtube
|
37
|
+
card[i] << "#{key.to_s.capitalize}: #{value}"
|
38
|
+
else
|
39
|
+
card[i] << "#{value}"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
i += 1
|
43
|
+
end
|
44
|
+
card
|
45
|
+
end
|
46
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: get-your-rep
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- msimonborg
|
@@ -39,14 +39,14 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
description: Get your rep with Google's Civic Information API using your address and
|
42
|
-
API key.
|
42
|
+
API key.
|
43
43
|
email: msimonborg@gmail.com
|
44
44
|
executables: []
|
45
45
|
extensions: []
|
46
46
|
extra_rdoc_files: []
|
47
47
|
files:
|
48
48
|
- lib/get-your-rep.rb
|
49
|
-
- lib/
|
49
|
+
- lib/get-your-rep/delegation.rb
|
50
50
|
homepage: https://github.com/msimonborg/get-your-rep
|
51
51
|
licenses:
|
52
52
|
- MIT
|
data/lib/getyourrep/rep.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
# The Rep class inherits from Hash and describes methods that can be called on a Rep
|
2
|
-
class Rep < Hash
|
3
|
-
|
4
|
-
# business_card can be called on an instance of Rep to map it's attributes to an array for easy printing, iteration, and display. It uses #each so it can skip over nil values without mapping them.
|
5
|
-
def business_card
|
6
|
-
card = []
|
7
|
-
self.each do |key, value|
|
8
|
-
next if value.nil?
|
9
|
-
case key
|
10
|
-
when 'facebook'
|
11
|
-
card << "#{key.capitalize}: #{value}"
|
12
|
-
when 'twitter'
|
13
|
-
card << "#{key.capitalize}: #{value}"
|
14
|
-
when 'youtube'
|
15
|
-
card << "#{key.capitalize}: #{value}"
|
16
|
-
else
|
17
|
-
card << "#{value}"
|
18
|
-
end
|
19
|
-
end
|
20
|
-
card
|
21
|
-
end
|
22
|
-
end
|