governator 0.1.1 → 0.1.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2098d9cd85a46e4daad82d6bfe5584d6a53e58f1
4
- data.tar.gz: 8e120715c6136e6eba0bd31ed2b7d43433bd0534
3
+ metadata.gz: e89dcfc60bccb89d0080d03ca2b0b606192a19d9
4
+ data.tar.gz: 322faf0a64187c9b9fda0889a98a9adbe5648e50
5
5
  SHA512:
6
- metadata.gz: d25f64ba8634dc88ea8bc3ed980068b79445df8b210684c28677cfc4a27cc5c2cce22a1d9c3063dab5fc3c4bb855bf3c8d8636c63bfa668ea1a2f880fa4b4596
7
- data.tar.gz: e5e302bf2aca6764a9349b4e911c6b822e07afa445942c4a54b087cca564fced0f83bf0521b8eba141de28cec1f0058d6042df5c2bd721796dd8e0bc328d5caa
6
+ metadata.gz: 2600672ed050b4e7431e01c94dd369f494e61a9c93088238f16e05620a8cff1b66df83c27d5a676bb7070a2e83f8f41d1a59de52ea4c0c28db5ef6fc36e01200
7
+ data.tar.gz: 2f6d3be6510ae7087b63fa865498d77d06b7b3f03e7cb31a4c1b9d287dd6fc0cc851d9182e66e7e989f90f0aab4c686b0e7997e385bb30c0423a2b45f0fe04fa
data/.rubocop.yml ADDED
@@ -0,0 +1,5 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.4.1
3
+
4
+ Metrics/LineLength:
5
+ Max: 100
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  # Specify your gem's dependencies in governator.gemspec
data/README.md CHANGED
@@ -26,6 +26,25 @@ Governator.scrape!
26
26
  governors = Governator.governors
27
27
  ```
28
28
 
29
+ ## Twitter
30
+
31
+ If you want to scrape Twitter handles you will need to initialize the client. Add this to your code (in a Rails app it should probably go in a file called `governator.rb` in `./config/initializers/`)
32
+
33
+ ```ruby
34
+ Governator.config do |config|
35
+ config.use_twitter = true
36
+
37
+ config.twitter do |twitter|
38
+ twitter.consumer_key = YOUR_CONSUMER_KEY
39
+ twitter.consumer_secret = YOUR_TWITTER_CONSUMER_SECRET
40
+ twitter.access_token = YOUR_ACCESS_TOKEN
41
+ twitter.access_token_secret = YOUR_ACCESS_TOKEN_SECRET
42
+ end
43
+ end
44
+ ```
45
+
46
+ As with everything, secrets should never be stored anywhere public, like version control. Set these values as variables on your system.
47
+
29
48
  ## Development
30
49
 
31
50
  After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/gem_tasks'
2
4
 
3
5
  require 'rspec/core/rake_task'
data/bin/console CHANGED
@@ -1,10 +1,18 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'bundler/setup'
4
5
  require 'governator'
5
6
 
6
- # You can add fixtures and/or initialization code here to make experimenting
7
- # with your gem easier. You can also use a different console, if you like.
7
+ Governator.config do |config|
8
+ config.use_twitter = true
9
+ config.twitter do |twitter|
10
+ twitter.consumer_key = ENV['TWITTER_CONSUMER_KEY']
11
+ twitter.consumer_secret = ENV['TWITTER_CONSUMER_SECRET']
12
+ twitter.access_token = ENV['ACCESS_TOKEN']
13
+ twitter.access_token_secret = ENV['ACCESS_TOKEN_SECRET']
14
+ end
15
+ end
8
16
 
9
17
  # (If you use this, don't forget to add pry to your Gemfile!)
10
18
  require 'pry'
data/governator.gemspec CHANGED
@@ -1,4 +1,5 @@
1
1
  # coding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  lib = File.expand_path('../lib', __FILE__)
4
5
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Governator
4
+ class TwitterClient
5
+ def self.client(&block)
6
+ @_client ||= Twitter::REST::Client.new(&block)
7
+ end
8
+
9
+ def self.governors
10
+ @_governors ||= nga_list_members + rga_list_members + cspan_list_members
11
+ end
12
+
13
+ def self.nga_list
14
+ @_nga_list ||= client.lists('NatlGovsAssoc').detect { |l| l.name == 'Governors' }
15
+ end
16
+
17
+ def self.nga_list_members
18
+ @_nga_list_members ||= client.list_members(nga_list, count: 100).attrs[:users]
19
+ end
20
+
21
+ def self.rga_list
22
+ @_rga_list ||= client.lists('The_RGA').detect { |l| l.name == 'GOP Governors' }
23
+ end
24
+
25
+ def self.rga_list_members
26
+ @_rga_list_members ||= client.list_members(rga_list, count: 100).attrs[:users]
27
+ end
28
+
29
+ def self.cspan_list
30
+ @_cspan_list ||= client.lists('cspan').detect { |l| l.name == 'Governors' }
31
+ end
32
+
33
+ def self.cspan_list_members
34
+ @_cspan_list_members ||= client.list_members(cspan_list, count: 100).attrs[:users]
35
+ end
36
+ end
37
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Governator
2
- VERSION = '0.1.1'.freeze
4
+ VERSION = '0.1.2'
3
5
  end
data/lib/governator.rb CHANGED
@@ -7,54 +7,110 @@ require 'twitter'
7
7
  require 'governator/bio_page'
8
8
  require 'governator/name_parser'
9
9
  require 'governator/panel'
10
+ require 'governator/twitter_client'
10
11
  require 'governator/version'
11
12
 
13
+ # Governator.scrape!
14
+ # governors = Governor.governors
12
15
  class Governator
13
- BASE_URI = 'https://www.nga.org'.freeze
16
+ BASE_URI = 'https://www.nga.org'
14
17
  CONN = Faraday.new(url: BASE_URI)
15
18
 
16
- def self.governors
17
- @_governors ||= []
18
- end
19
+ class << self # <-- Begin class methods
20
+ attr_reader :use_twitter
19
21
 
20
- def self.index_page
21
- @_index_page ||= Nokogiri::HTML(CONN.get('/cms/governors/bios').body)
22
- end
22
+ def scrape!
23
+ governors.clear
24
+ panels.each do |panel|
25
+ governor = create(panel)
26
+ puts "Scraped #{governor.official_full} of #{governor.state_name}"
27
+ end
23
28
 
24
- def self.panels
25
- @_panels ||= index_page.css('.panel.panel-default.governors').map do |panel|
26
- Panel.new(panel)
29
+ governors
27
30
  end
28
- end
29
31
 
30
- def self.scrape!
31
- governors.clear
32
- panels.each do |panel|
33
- governor = create(panel)
34
- puts "Scraped #{governor.official_full} of #{governor.state_name}"
32
+ def governors
33
+ @_governors ||= []
35
34
  end
36
35
 
37
- governors
38
- end
36
+ def to_json
37
+ governors.map(&:to_h)
38
+ end
39
+ alias serialize to_json
39
40
 
40
- def self.create(panel)
41
- new(panel).tap do |g|
42
- g.build
43
- g.save
41
+ def config
42
+ yield self
44
43
  end
45
- end
46
44
 
47
- def self.to_json
48
- governors.map(&:to_h)
49
- end
45
+ def twitter(&block)
46
+ TwitterClient.client(&block)
47
+ end
48
+
49
+ def use_twitter=(boolean)
50
+ raise ArgumentError, 'value must be Boolean value' unless [true, false].include? boolean
51
+ @use_twitter = boolean
52
+ end
53
+
54
+ private # private class methods
55
+
56
+ def index_page
57
+ @_index_page ||= Nokogiri::HTML(CONN.get('/cms/governors/bios').body)
58
+ end
59
+
60
+ def panels
61
+ @_panels ||= index_page.css('.panel.panel-default.governors').map do |panel|
62
+ Panel.new(panel)
63
+ end
64
+ end
65
+
66
+ def create(panel)
67
+ new(panel).tap do |g|
68
+ g.send :build
69
+ g.send :save
70
+ end
71
+ end
72
+ end # <-- End class methods
50
73
 
51
74
  attr_reader :panel, :state_name, :bio_page, :official_full, :first, :last,
52
- :middle, :nickname, :suffix, :url, :party, :office_locations
75
+ :middle, :nickname, :suffix, :url, :party, :office_locations,
76
+ :twitter
53
77
 
54
78
  def initialize(panel)
55
79
  @panel = panel
56
80
  end
57
81
 
82
+ def to_h
83
+ {
84
+ photo_url: photo_url,
85
+ state_name: state_name,
86
+ official_full: official_full,
87
+ url: url,
88
+ party: party,
89
+ office_locations: office_locations
90
+ }
91
+ end
92
+
93
+ def inspect
94
+ "#<Governator #{official_full}>"
95
+ end
96
+
97
+ def secondary_office
98
+ { address: bio_page.alt_address, city: bio_page.alt_city, state: bio_page.alt_state,
99
+ zip: bio_page.alt_zip, phone: bio_page.alt_phone, fax: bio_page.alt_fax,
100
+ office_type: bio_page.alt_office_type }
101
+ end
102
+
103
+ def primary_office
104
+ { address: bio_page.address, city: bio_page.city, state: bio_page.state, zip: bio_page.zip,
105
+ phone: bio_page.phone, fax: bio_page.fax, office_type: bio_page.office_type }
106
+ end
107
+
108
+ def photo_url
109
+ @_photo_url ||= "#{BASE_URI}#{panel.image}"
110
+ end
111
+
112
+ private
113
+
58
114
  def build
59
115
  @bio_page = BioPage.new(panel.bio_page)
60
116
  @state_name = panel.state
@@ -64,11 +120,18 @@ class Governator
64
120
 
65
121
  @first, @last, @middle, @nickname, @suffix = NameParser.new(official_full).parse
66
122
  build_office_locations
123
+ fetch_twitter_handle if self.class.use_twitter == true
67
124
  self
68
125
  end
69
126
 
70
- def photo_url
71
- @_photo_url ||= "#{BASE_URI}#{panel.image}"
127
+ def fetch_twitter_handle
128
+ twitter_governor = TwitterClient.governors.detect do |tg|
129
+ tg[:name].match?(last) &&
130
+ tg[:location].match?(state_name) ||
131
+ tg[:description].match?(state_name)
132
+ end
133
+
134
+ @twitter = twitter_governor[:screen_name] if twitter_governor
72
135
  end
73
136
 
74
137
  def build_office_locations
@@ -76,34 +139,8 @@ class Governator
76
139
  @office_locations << secondary_office if bio_page.alt_office_present?
77
140
  end
78
141
 
79
- def primary_office
80
- { address: bio_page.address, city: bio_page.city, state: bio_page.state, zip: bio_page.zip,
81
- phone: bio_page.phone, fax: bio_page.fax, office_type: bio_page.office_type }
82
- end
83
-
84
- def secondary_office
85
- { address: bio_page.alt_address, city: bio_page.alt_city, state: bio_page.alt_state,
86
- zip: bio_page.alt_zip, phone: bio_page.alt_phone, fax: bio_page.alt_fax,
87
- office_type: bio_page.alt_office_type }
88
- end
89
-
90
142
  def save
91
143
  self.class.governors << self
92
144
  self
93
145
  end
94
-
95
- def to_h
96
- {
97
- photo_url: photo_url,
98
- state_name: state_name,
99
- official_full: official_full,
100
- url: url,
101
- party: party,
102
- office_locations: office_locations
103
- }
104
- end
105
-
106
- def inspect
107
- "#<Governator #{official_full}>"
108
- end
109
146
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: governator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - M. Simon Borg
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-06-20 00:00:00.000000000 Z
11
+ date: 2017-06-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -88,6 +88,7 @@ extensions: []
88
88
  extra_rdoc_files: []
89
89
  files:
90
90
  - ".gitignore"
91
+ - ".rubocop.yml"
91
92
  - Gemfile
92
93
  - LICENSE.txt
93
94
  - README.md
@@ -100,6 +101,7 @@ files:
100
101
  - lib/governator/name_parser.rb
101
102
  - lib/governator/page_scraper.rb
102
103
  - lib/governator/panel.rb
104
+ - lib/governator/twitter_client.rb
103
105
  - lib/governator/version.rb
104
106
  homepage: https://github.com/msimonborg/governator
105
107
  licenses: