get_your_rep 0.1.9 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +55 -0
- data/.rubocop.yml +40 -0
- data/Gemfile +5 -0
- data/LICENSE +21 -0
- data/README.md +84 -0
- data/Rakefile +12 -0
- data/bin/console +16 -0
- data/bin/setup +6 -0
- data/config.reek +18 -0
- data/exe/reps +8 -0
- data/get_your_rep.gemspec +32 -0
- data/lib/get_your_rep.rb +18 -19
- data/lib/get_your_rep/cli.rb +113 -0
- data/lib/get_your_rep/delegation.rb +47 -65
- data/lib/get_your_rep/errors.rb +79 -0
- data/lib/get_your_rep/get_your_rep_module.rb +76 -0
- data/lib/get_your_rep/google.rb +50 -172
- data/lib/get_your_rep/office_location.rb +42 -0
- data/lib/get_your_rep/open_states.rb +43 -101
- data/lib/get_your_rep/patriotic.rb +82 -0
- data/lib/get_your_rep/representative.rb +87 -253
- data/lib/get_your_rep/responses/base.rb +34 -0
- data/lib/get_your_rep/responses/google_office.rb +35 -0
- data/lib/get_your_rep/responses/google_rep.rb +75 -0
- data/lib/get_your_rep/responses/open_states_office.rb +40 -0
- data/lib/get_your_rep/responses/open_states_rep.rb +50 -0
- data/lib/get_your_rep/version.rb +4 -0
- metadata +48 -15
- data/lib/core_extensions/array/get_your_rep_mutations.rb +0 -23
- data/lib/core_extensions/hash/get_your_rep_mutations.rb +0 -24
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GetYourRep
|
3
|
+
# Base class for external responses
|
4
|
+
class Base
|
5
|
+
# Accepts an options hash and creates setter and getter attribute methods from the hash keys.
|
6
|
+
# After initializing methods the values are added to the attributes.
|
7
|
+
# Taken with gratitude from davidbella https://gist.github.com/davidbella/6918455
|
8
|
+
def initialize(options = {})
|
9
|
+
options.each do |attr, value|
|
10
|
+
create_setters_from_opts(attr)
|
11
|
+
create_getters_from_opts(attr)
|
12
|
+
add_value_to_attr(attr, value)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def add_value_to_attr(attr, value)
|
19
|
+
send("#{attr}=".to_sym, value)
|
20
|
+
end
|
21
|
+
|
22
|
+
def create_getters_from_opts(attr)
|
23
|
+
self.class.send(:define_method, attr.to_sym) do
|
24
|
+
instance_variable_get('@' + attr.to_s)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def create_setters_from_opts(attr)
|
29
|
+
self.class.send(:define_method, "#{attr}=".to_sym) do |val|
|
30
|
+
instance_variable_set('@' + attr.to_s, val)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require_relative './base'
|
3
|
+
|
4
|
+
module GetYourRep
|
5
|
+
# Parses office location information from a Google response.
|
6
|
+
class GoogleOffice < Base
|
7
|
+
# These attributes are defined so they can be called even
|
8
|
+
# if they are not defined during initialization.
|
9
|
+
attr_accessor :line1, :line2
|
10
|
+
|
11
|
+
# Builds the hash to pass as constructor options for a new OfficeLocation.
|
12
|
+
def build_hash
|
13
|
+
office_hash = {}
|
14
|
+
office_hash[:type] = determine_office_type
|
15
|
+
office_hash[:line_1] = line1
|
16
|
+
office_hash[:line_2] = line2
|
17
|
+
office_hash[:city] = city.capitalize
|
18
|
+
office_hash[:state] = state.upcase
|
19
|
+
office_hash[:zip] = zip
|
20
|
+
office_hash
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def determine_office_type
|
26
|
+
if line1.downcase =~
|
27
|
+
/(state|house|senate|assembly|capitol|dirksen|reyburn|rayburn|legislative|legislature|government)+/
|
28
|
+
|
29
|
+
'capitol'
|
30
|
+
else
|
31
|
+
'district'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require_relative './base'
|
3
|
+
|
4
|
+
module GetYourRep
|
5
|
+
# Parses rep information from Google response.
|
6
|
+
class GoogleRep < Base
|
7
|
+
# An array of phone numbers. Default = []
|
8
|
+
attr_accessor :phones
|
9
|
+
# An array of email addresses. Default = []
|
10
|
+
attr_accessor :emails
|
11
|
+
# An array of websites. Default = []
|
12
|
+
attr_accessor :urls
|
13
|
+
# An array of office addresses to be passes to a GoogleOffice instance for parsing. Default = []
|
14
|
+
attr_accessor :address
|
15
|
+
# An array of social media handles. Default = []
|
16
|
+
attr_accessor :channels
|
17
|
+
# Passes the GetYourRep::Representative constructor hash to different methods for assembly.
|
18
|
+
attr_accessor :hash
|
19
|
+
# The office name must be parsed from an array passed to the build_hash method.
|
20
|
+
# the office_array is an array of hashes and is a sibling to the officials array from which
|
21
|
+
# the rep info is parsed.
|
22
|
+
attr_accessor :office_name
|
23
|
+
|
24
|
+
# Sets array attributes to empty arrays and and builds other attributes from options hash.
|
25
|
+
def initialize(options = {})
|
26
|
+
self.phones = []
|
27
|
+
self.emails = []
|
28
|
+
self.urls = []
|
29
|
+
self.address = []
|
30
|
+
self.channels = []
|
31
|
+
super
|
32
|
+
end
|
33
|
+
|
34
|
+
# Build a hash from attributes to be passed to the GetYourRep::Representative constructor method.
|
35
|
+
def build_hash(offices_array, index)
|
36
|
+
find_office_name(offices_array, index)
|
37
|
+
self.hash = { name: name,
|
38
|
+
office: office_name,
|
39
|
+
party: party,
|
40
|
+
phones: phones,
|
41
|
+
office_locations: office_locations,
|
42
|
+
email: emails,
|
43
|
+
url: url,
|
44
|
+
photo: photoUrl }
|
45
|
+
parse_channels
|
46
|
+
hash
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def find_office_name(offices_array, index)
|
52
|
+
office_data_hash = offices_array.detect { |office| office['officialIndices'].include?(index) }
|
53
|
+
self.office_name = office_data_hash['name']
|
54
|
+
end
|
55
|
+
|
56
|
+
def office_locations
|
57
|
+
address.map do |office|
|
58
|
+
location = GoogleOffice.new(office)
|
59
|
+
office_hash = location.build_hash
|
60
|
+
OfficeLocation.new(office_hash)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def url
|
65
|
+
urls.first
|
66
|
+
end
|
67
|
+
|
68
|
+
# Parses social media handles and adds them to the Delegation object.
|
69
|
+
def parse_channels
|
70
|
+
channels.each do |channel|
|
71
|
+
hash[channel['type'].downcase.to_sym] = channel['id']
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require_relative './base'
|
3
|
+
|
4
|
+
module GetYourRep
|
5
|
+
# Parses office location information from Open States responses.
|
6
|
+
class OpenStatesOffice < Base
|
7
|
+
# These accessor attributes are parsed from the :address attribute created at instantiation.
|
8
|
+
attr_accessor :line_1, :line_2, :city, :state, :zip
|
9
|
+
|
10
|
+
# Assign elements of the address array to office attributes.
|
11
|
+
def parse_address
|
12
|
+
address_to_ary
|
13
|
+
state_and_zip = address.pop.split(' ')
|
14
|
+
self.state = state_and_zip.first
|
15
|
+
self.zip = state_and_zip.last
|
16
|
+
self.city = address.pop
|
17
|
+
self.line_1 = address.shift
|
18
|
+
self.line_2 = address[0]
|
19
|
+
end
|
20
|
+
|
21
|
+
# Splits the address string into an array for hash assembly.
|
22
|
+
def address_to_ary
|
23
|
+
self.address = address.gsub("\n", ', ')
|
24
|
+
self.address = address.split(', ')
|
25
|
+
return if name.casecmp('capitol office') || name.casecmp('district office')
|
26
|
+
address.unshift(name)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Builds the hash to pass as constructor options for a new OfficeLocation.
|
30
|
+
def build_hash
|
31
|
+
parse_address
|
32
|
+
{ type: type,
|
33
|
+
line_1: line_1,
|
34
|
+
line_2: line_2,
|
35
|
+
city: city,
|
36
|
+
state: state,
|
37
|
+
zip: zip }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require_relative './base'
|
3
|
+
|
4
|
+
module GetYourRep
|
5
|
+
# Parses rep information from Open States responses.
|
6
|
+
class OpenStatesRep < Base
|
7
|
+
# These attributes hold arrays of information, and are empty arrays by default.
|
8
|
+
attr_reader :email, :phones
|
9
|
+
|
10
|
+
def initialize(options = {}) # :nodoc:
|
11
|
+
super
|
12
|
+
@email = []
|
13
|
+
@phones = []
|
14
|
+
end
|
15
|
+
|
16
|
+
# Build a hash from attributes to be passed to the GetYourRep::Representative constructor method.
|
17
|
+
def build_hash
|
18
|
+
{ name: full_name.split(', ').reverse.join(' '),
|
19
|
+
office: office,
|
20
|
+
party: party,
|
21
|
+
phones: phones - [nil],
|
22
|
+
office_locations: office_locations,
|
23
|
+
email: email - [nil],
|
24
|
+
url: url,
|
25
|
+
photo: photo_url,
|
26
|
+
committees: committees }
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def office
|
32
|
+
"#{state.upcase} #{chamber.capitalize} Chamber, #{district}"
|
33
|
+
end
|
34
|
+
|
35
|
+
def office_locations
|
36
|
+
offices.map do |office|
|
37
|
+
location = OpenStatesOffice.new(office)
|
38
|
+
@email << office['email']
|
39
|
+
@phones << office['phone']
|
40
|
+
office_hash = location.build_hash
|
41
|
+
OfficeLocation.new(office_hash)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# Parses committee involvement.
|
46
|
+
def committees
|
47
|
+
roles.map { |role| role['committee'] } - [nil]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: get_your_rep
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- msimonborg
|
8
8
|
autorequire:
|
9
|
-
bindir:
|
9
|
+
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|
@@ -44,6 +44,20 @@ dependencies:
|
|
44
44
|
- - ">="
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: 1.4.1
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: colorize
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.8.1
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 0.8.1
|
47
61
|
- !ruby/object:Gem::Dependency
|
48
62
|
name: pry
|
49
63
|
requirement: !ruby/object:Gem::Requirement
|
@@ -104,37 +118,56 @@ dependencies:
|
|
104
118
|
requirements:
|
105
119
|
- - "~>"
|
106
120
|
- !ruby/object:Gem::Version
|
107
|
-
version: '
|
121
|
+
version: '12.0'
|
108
122
|
type: :development
|
109
123
|
prerelease: false
|
110
124
|
version_requirements: !ruby/object:Gem::Requirement
|
111
125
|
requirements:
|
112
126
|
- - "~>"
|
113
127
|
- !ruby/object:Gem::Version
|
114
|
-
version: '
|
115
|
-
description: Get your rep
|
116
|
-
|
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.
|
128
|
+
version: '12.0'
|
129
|
+
description: Get your rep(s) from Google's Civic Information API and Open States.
|
130
|
+
Formerly get-your-rep.
|
121
131
|
email: msimonborg@gmail.com
|
122
|
-
executables:
|
132
|
+
executables:
|
133
|
+
- reps
|
123
134
|
extensions: []
|
124
135
|
extra_rdoc_files: []
|
125
136
|
files:
|
126
|
-
-
|
127
|
-
-
|
137
|
+
- ".gitignore"
|
138
|
+
- ".rubocop.yml"
|
139
|
+
- Gemfile
|
140
|
+
- LICENSE
|
141
|
+
- README.md
|
142
|
+
- Rakefile
|
143
|
+
- bin/console
|
144
|
+
- bin/setup
|
145
|
+
- config.reek
|
146
|
+
- exe/reps
|
147
|
+
- get_your_rep.gemspec
|
128
148
|
- lib/get_your_rep.rb
|
149
|
+
- lib/get_your_rep/cli.rb
|
129
150
|
- lib/get_your_rep/delegation.rb
|
151
|
+
- lib/get_your_rep/errors.rb
|
152
|
+
- lib/get_your_rep/get_your_rep_module.rb
|
130
153
|
- lib/get_your_rep/google.rb
|
154
|
+
- lib/get_your_rep/office_location.rb
|
131
155
|
- lib/get_your_rep/open_states.rb
|
156
|
+
- lib/get_your_rep/patriotic.rb
|
132
157
|
- lib/get_your_rep/representative.rb
|
158
|
+
- lib/get_your_rep/responses/base.rb
|
159
|
+
- lib/get_your_rep/responses/google_office.rb
|
160
|
+
- lib/get_your_rep/responses/google_rep.rb
|
161
|
+
- lib/get_your_rep/responses/open_states_office.rb
|
162
|
+
- lib/get_your_rep/responses/open_states_rep.rb
|
163
|
+
- lib/get_your_rep/version.rb
|
133
164
|
homepage: https://github.com/msimonborg/get-your-rep
|
134
165
|
licenses:
|
135
166
|
- MIT
|
136
167
|
metadata: {}
|
137
|
-
post_install_message:
|
168
|
+
post_install_message: If you are upgrading from get_your_rep ~> 0.1, version 1.0 may
|
169
|
+
break your app. It is a good idea to upgrade, but please read the documentation
|
170
|
+
first!
|
138
171
|
rdoc_options: []
|
139
172
|
require_paths:
|
140
173
|
- lib
|
@@ -1,23 +0,0 @@
|
|
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
|
@@ -1,24 +0,0 @@
|
|
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
|