jekyll-recker 1.6.0 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3e0cc3d6cafa2518fb5819ad8cc4a6db7ecf88e214b0e998468f521d0ec19a37
4
- data.tar.gz: e623e1c53b62d3ccf0a55ac572ef0fc4257e03cdf7faf543baa1f5ce7d0a40ed
3
+ metadata.gz: 853460ad6e8cc68998d94ec9b8370fcc8c91ac36e464c20bb503a430c0b61775
4
+ data.tar.gz: b41ff9a6f988de20e74265844092d6bda6a458f3720e9ac49c8276f07702c0e7
5
5
  SHA512:
6
- metadata.gz: b45d3daae8d8af21c963a412d8430dce81bafaff270a35ca94444b01e74a7d4bd25e422a3ac9afb958bb3693cd7359d4bab70a07776d1da7c3637a38d633eed7
7
- data.tar.gz: 4f6aadcd49f0b0d71232ab67c361d3aac1e5a91887272d39e826e3300afa8e0cf872b2154f6e5371dda74a5fd8ea9ac928bd7a2acc6b98357be2e87b75d25903
6
+ metadata.gz: 3e8981f6cfe48b770faca2e93836c4f85994237e981cb2b767d760cc23f9decfdc4f24f800daf1b759258efd9b9ff060444034cb3d91a4534a471f5ca19306e0
7
+ data.tar.gz: 3d9c4aaacc354e02570cf31c18761a02b529cd6b624a389e6e8effe50db599678850e1ec19ea32e0353e33905a97e72e1e40f9060b1324ce112357473e110a03
@@ -5,19 +5,16 @@ require 'jekyll'
5
5
  module Jekyll
6
6
  # Recker
7
7
  module Recker
8
- require 'jekyll_recker/logger.rb'
9
8
  require 'jekyll_recker/mixins.rb'
10
9
 
11
10
  require 'jekyll_recker/commands.rb'
12
11
  require 'jekyll_recker/configuration.rb'
13
12
  require 'jekyll_recker/error.rb'
14
- require 'jekyll_recker/facebook.rb'
15
13
  require 'jekyll_recker/filters.rb'
16
14
  require 'jekyll_recker/generators.rb'
17
15
  require 'jekyll_recker/shell.rb'
18
- require 'jekyll_recker/slack.rb'
16
+ require 'jekyll_recker/social.rb'
19
17
  require 'jekyll_recker/tags.rb'
20
- require 'jekyll_recker/twitter.rb'
21
18
  require 'jekyll_recker/version.rb'
22
19
  require 'jekyll_recker/words.rb'
23
20
  end
@@ -18,13 +18,9 @@ module Jekyll
18
18
  end
19
19
 
20
20
  def self.action(args, options)
21
- if args.empty? || args.include?('slack')
22
- Recker::Slack.share(dry: options['dry'])
23
- elsif args.empty? || args.include?('twitter')
24
- Recker::Twitter.share(dry: options['dry'])
25
- # elsif args.empty? || args.include?('facebook')
26
- # Recker::Facebook.share(dry: options['dry'])
27
- end
21
+ args += %w[slack twitter] if args.empty?
22
+ Recker::Social::Slack.share(dry: options['dry']) if args.include?('slack')
23
+ Recker::Social::Twitter.share(dry: options['dry']) if args.include?('twitter')
28
24
  rescue ReckerError => e
29
25
  logger.error e.message
30
26
  exit 1
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'logger'
4
+
3
5
  module Jekyll
4
6
  module Recker
5
7
  module Mixins
@@ -14,6 +16,17 @@ module Jekyll
14
16
  end
15
17
  end
16
18
 
19
+ # Introspection
20
+ module Introspection
21
+ def self.included(base)
22
+ base.extend(self)
23
+ end
24
+
25
+ def class_name
26
+ self.class.name.split('::').last
27
+ end
28
+ end
29
+
17
30
  # Logging
18
31
  module Logging
19
32
  def self.included(base)
@@ -21,7 +34,10 @@ module Jekyll
21
34
  end
22
35
 
23
36
  def logger
24
- Jekyll::Recker.logger
37
+ @logger ||= Logger.new(
38
+ STDOUT,
39
+ formatter: proc { |_severity, _datetime, _progname, msg| "jekyll-recker: #{msg}\n" }
40
+ )
25
41
  end
26
42
  end
27
43
  end
@@ -0,0 +1,173 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'slack-notifier'
4
+ require 'twitter'
5
+
6
+ module Jekyll
7
+ # Recker
8
+ module Recker
9
+ module Social
10
+ # Backend
11
+ #
12
+ # Backend base class for social sharing backends.
13
+ # @abstract
14
+ class Share
15
+ include Mixins::Introspection
16
+ include Mixins::Logging
17
+
18
+ def self.share(dry: false)
19
+ backend = new(dry: dry)
20
+ logger.info "#{backend.name} - building configuration"
21
+ backend.configure!
22
+
23
+ logger.info "#{backend.name} - sharing \"#{backend.latest_title}\""
24
+ backend.post!
25
+ end
26
+
27
+ def initialize(dry: false)
28
+ @dry = dry
29
+ end
30
+
31
+ def dry?
32
+ @dry
33
+ end
34
+
35
+ def config
36
+ @config ||= Jekyll::Recker::Configuration.recker.fetch(config_key)
37
+ end
38
+
39
+ def config_key
40
+ class_name.downcase
41
+ end
42
+ alias name config_key
43
+
44
+ def post_body
45
+ url = File.join Configuration.jekyll['url'], latest.url
46
+ <<~BODY
47
+ #{latest.data['date'].strftime('%A, %B %-d %Y')}
48
+ #{latest.data['title']}
49
+ #{url}
50
+ BODY
51
+ end
52
+
53
+ def latest
54
+ @latest ||= Configuration.latest_post
55
+ end
56
+
57
+ def latest_title
58
+ latest.data['title']
59
+ end
60
+
61
+ def configure!
62
+ raise NotImplementedError
63
+ end
64
+
65
+ def post!
66
+ raise NotImplementedError
67
+ end
68
+ end
69
+
70
+ # Slack
71
+ #
72
+ # Slack social sharing backend
73
+ class Slack < Share
74
+ def configure!
75
+ @creds = {}
76
+ workspaces.each do |key, data|
77
+ webhook = ENV["SLACK_#{key.upcase}_WEBHOOK"] || extract_from_config(data)
78
+ if webhook.nil?
79
+ raise ReckerError, "cannot find slack webhook for #{key} workspace!"
80
+ end
81
+
82
+ @creds[key] = webhook
83
+ end
84
+ end
85
+
86
+ def post!
87
+ message_body = ::Slack::Notifier::Util::LinkFormatter.format(post_body)
88
+ workspaces.each do |key, config|
89
+ logger.info "posting to #{key} workspace"
90
+ if @dry
91
+ logger.info("BEGIN MESSAGE\n#{message_body.strip}\nEND MESSAGE")
92
+ else
93
+ ::Slack::Notifier.new(
94
+ @creds[key].strip,
95
+ channel: config.fetch('channel'),
96
+ username: config.fetch('username'),
97
+ icon_emoji: config.fetch('emoji')
98
+ ).post(text: message_body)
99
+ end
100
+ end
101
+ end
102
+
103
+ private
104
+
105
+ def extract_from_config(data)
106
+ cmd = data['webhook_cmd']
107
+ return nil if cmd.nil?
108
+
109
+ Jekyll::Recker.shell(cmd)
110
+ end
111
+
112
+ def workspaces
113
+ config.each
114
+ end
115
+ end
116
+
117
+ # Twitter
118
+ #
119
+ # Twitter social sharing backend
120
+ class Twitter < Share
121
+ def configure!
122
+ creds = extract_from_env || extract_from_config
123
+ raise ReckerError, 'cannot find twitter credentials!' if creds.nil?
124
+
125
+ @client = ::Twitter::REST::Client.new do |settings|
126
+ settings.consumer_key = creds['consumer_api_key']
127
+ settings.consumer_secret = creds['consumer_api_secret']
128
+ settings.access_token = creds['access_token']
129
+ settings.access_token_secret = creds['access_token_secret']
130
+ end
131
+ end
132
+
133
+ def post!
134
+ if dry?
135
+ logger.info('tweeting in dry mode, printing message')
136
+ logger.info("BEGIN TWEET\n#{post_body}END TWEET")
137
+ else
138
+ @client.update(post_body)
139
+ end
140
+ end
141
+
142
+ private
143
+
144
+ def extract_from_env
145
+ values = cred_fieldnames.map { |k| ENV["TWITTER_#{k.upcase}"] }
146
+
147
+ return nil if values.any? { |v| v.nil? || v.empty? }
148
+
149
+ Hash[cred_fieldnames.zip(values)]
150
+ end
151
+
152
+ def extract_from_config
153
+ values = cred_fieldnames.map do |k|
154
+ Recker.shell(Configuration.twitter["#{k}_cmd"]).strip
155
+ end
156
+
157
+ return nil if values.any? { |v| v.nil? || v.empty? }
158
+
159
+ Hash[cred_fieldnames.zip(values)]
160
+ end
161
+
162
+ def cred_fieldnames
163
+ [
164
+ 'access_token_secret',
165
+ 'access_token',
166
+ 'consumer_api_key',
167
+ 'consumer_api_secret'
168
+ ]
169
+ end
170
+ end
171
+ end
172
+ end
173
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Jekyll
4
4
  module Recker
5
- VERSION = '1.6.0'
5
+ VERSION = '1.7.0'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-recker
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.0
4
+ version: 1.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Recker
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-28 00:00:00.000000000 Z
11
+ date: 2020-07-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bump
@@ -108,20 +108,6 @@ dependencies:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: '3.8'
111
- - !ruby/object:Gem::Dependency
112
- name: koala
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - ">="
116
- - !ruby/object:Gem::Version
117
- version: '0'
118
- type: :runtime
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - ">="
123
- - !ruby/object:Gem::Version
124
- version: '0'
125
111
  - !ruby/object:Gem::Dependency
126
112
  name: slack-notifier
127
113
  requirement: !ruby/object:Gem::Requirement
@@ -172,15 +158,12 @@ files:
172
158
  - lib/jekyll_recker/commands.rb
173
159
  - lib/jekyll_recker/configuration.rb
174
160
  - lib/jekyll_recker/error.rb
175
- - lib/jekyll_recker/facebook.rb
176
161
  - lib/jekyll_recker/filters.rb
177
162
  - lib/jekyll_recker/generators.rb
178
- - lib/jekyll_recker/logger.rb
179
163
  - lib/jekyll_recker/mixins.rb
180
164
  - lib/jekyll_recker/shell.rb
181
- - lib/jekyll_recker/slack.rb
165
+ - lib/jekyll_recker/social.rb
182
166
  - lib/jekyll_recker/tags.rb
183
- - lib/jekyll_recker/twitter.rb
184
167
  - lib/jekyll_recker/version.rb
185
168
  - lib/jekyll_recker/words.rb
186
169
  homepage: https://www.github.com/arecker/jekyll-recker/
@@ -1,97 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'koala'
4
-
5
- module Jekyll
6
- module Recker
7
- # Facebook Client
8
- class Facebook
9
- include Mixins::Logging
10
-
11
- def self.share(dry: false)
12
- client = new(dry: dry)
13
- logger.info 'discovering credentials'
14
- client.discover_credentials!
15
- logger.info "sharing #{client.latest.data['title']}"
16
- client.post_latest!
17
- end
18
-
19
- def initialize(dry: false)
20
- @dry = dry
21
- end
22
-
23
- def discover_credentials!
24
- @creds = extract_from_env || extract_from_config
25
- raise ReckerError, 'cannot find facebook credentials!' if @creds.nil?
26
-
27
- set_credentials!
28
- end
29
-
30
- def post_latest!
31
- if @dry
32
- logger.info('posting in dry mode, printing message')
33
- logger.info("BEGIN POST\n#{post_body.strip}\nEND POST")
34
- else
35
- @graph.put_connections("me", "feed", message: "I am writing on my wall!")
36
- end
37
- end
38
-
39
- def latest
40
- Configuration.latest_post
41
- end
42
-
43
- private
44
-
45
- def post_body
46
- url = File.join Configuration.jekyll['url'], latest.url
47
- <<~POST
48
- #{latest.data['date'].strftime('%A, %B %-d %Y')}
49
- #{latest.data['title']}
50
- #{url}
51
- POST
52
- end
53
-
54
- def set_credentials!
55
- Koala.configure do |config|
56
- config.access_token = @creds['access_token']
57
- # config.app_access_token = @creds['app_access_token']
58
- config.app_id = @creds['app_id']
59
- config.app_secret = @creds['app_secret']
60
- end
61
- @client = Koala::Facebook::API.new(@creds['access_token'])
62
- end
63
-
64
- def extract_from_env
65
- values = cred_fieldnames.map { |k| ENV["FACEBOOK_#{k.upcase}"] }
66
-
67
- return nil if values.any? { |v| v.nil? || v.empty? }
68
-
69
- Hash[cred_fieldnames.zip(values)]
70
- end
71
-
72
- def extract_from_config
73
- values = cred_fieldnames.map do |k|
74
- cmd = Configuration.facebook.fetch("#{k}_cmd", '').strip
75
- if cmd.empty?
76
- nil
77
- else
78
- Recker.shell(Configuration.facebook["#{k}_cmd"]).strip
79
- end
80
- end
81
-
82
- return nil if values.any? { |v| v.nil? || v.empty? }
83
-
84
- Hash[cred_fieldnames.zip(values)]
85
- end
86
-
87
- def cred_fieldnames
88
- # app_access_token
89
- %w[
90
- access_token
91
- app_id
92
- app_secret
93
- ]
94
- end
95
- end
96
- end
97
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'logger'
4
-
5
- module Jekyll
6
- # Recker
7
- module Recker
8
- def self.logger
9
- @logger ||= make_logger
10
- end
11
-
12
- def self.make_logger
13
- logger = Logger.new(STDOUT)
14
- logger.formatter = proc do |_severity, _datetime, _progname, msg|
15
- "jekyll-recker: #{msg}\n"
16
- end
17
- logger
18
- end
19
- end
20
- end
@@ -1,79 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'slack-notifier'
4
-
5
- module Jekyll
6
- # Recker
7
- module Recker
8
- # Slack
9
- class Slack
10
- include Jekyll::Recker::Mixins::Logging
11
-
12
- def self.share(dry: false)
13
- each_in_config(dry: dry) do |client|
14
- logger.info "#{client.key}: discovering webhook"
15
- client.discover_webhook!
16
- logger.info "#{client.key}: posting #{client.latest.data['title']}"
17
- client.post_latest!
18
- end
19
- end
20
-
21
- def self.each_in_config(dry: false)
22
- Configuration.slack.map do |key, body|
23
- yield new(key, body, dry: dry)
24
- end
25
- end
26
-
27
- attr_reader :key
28
-
29
- def initialize(config_key, config_body, dry: false)
30
- @key = config_key
31
- @data = config_body
32
- @webhook = nil
33
- @dry = dry
34
- end
35
-
36
- def discover_webhook!
37
- @webhook = ENV["SLACK_#{@key.upcase}_WEBHOOK"] || extract_from_config
38
- raise ReckerError, 'cannot find slack credentials!' if @webhook.nil?
39
- end
40
-
41
- def latest
42
- @latest ||= Configuration.latest_post
43
- end
44
-
45
- def post_latest!
46
- if @dry
47
- logger.info('postign in dry mode, printing message')
48
- logger.info("BEGIN MESSAGE\n#{message_body.strip}\nEND MESSAGE")
49
- else
50
- ::Slack::Notifier.new(
51
- @webhook.strip,
52
- channel: @data.fetch('channel'),
53
- username: @data.fetch('username'),
54
- icon_emoji: @data.fetch('emoji')
55
- ).post(text: message_body)
56
- end
57
- end
58
-
59
- private
60
-
61
- def message_body
62
- url = File.join Configuration.jekyll['url'], latest.url
63
- body = <<~MSG
64
- #{latest.data['date'].strftime('%A, %B %-d %Y')}
65
- #{latest.data['title']}
66
- #{url}
67
- MSG
68
- ::Slack::Notifier::Util::LinkFormatter.format(body)
69
- end
70
-
71
- def extract_from_config
72
- cmd = @data['webhook_cmd']
73
- return nil if cmd.nil?
74
-
75
- Recker.shell(cmd)
76
- end
77
- end
78
- end
79
- end
@@ -1,91 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'twitter'
4
-
5
- module Jekyll
6
- module Recker
7
- # Twitter Client
8
- class Twitter
9
- include Mixins::Logging
10
-
11
- def self.share(dry: false)
12
- client = new(dry: dry)
13
- logger.info 'discovering credentials'
14
- client.discover_credentials!
15
- logger.info "tweeting #{client.latest.data['title']}"
16
- client.post_latest!
17
- end
18
-
19
- def initialize(dry: false)
20
- @dry = dry
21
- end
22
-
23
- def discover_credentials!
24
- @creds = extract_from_env || extract_from_config
25
- raise ReckerError, 'cannot find twitter credentials!' if @creds.nil?
26
-
27
- set_credentials!
28
- end
29
-
30
- def post_latest!
31
- if @dry
32
- logger.info('tweeting in dry mode, printing message')
33
- logger.info("BEGIN TWEET\n#{tweet_body.strip}\nEND TWEET")
34
- else
35
- @client.update(tweet_body)
36
- end
37
- end
38
-
39
- def latest
40
- Configuration.latest_post
41
- end
42
-
43
- private
44
-
45
- def tweet_body
46
- url = File.join Configuration.jekyll['url'], latest.url
47
- <<~TWEET
48
- #{latest.data['date'].strftime('%A, %B %-d %Y')}
49
- #{latest.data['title']}
50
- #{url}
51
- TWEET
52
- end
53
-
54
- def set_credentials!
55
- @client ||= ::Twitter::REST::Client.new do |settings|
56
- settings.consumer_key = @creds['consumer_api_key']
57
- settings.consumer_secret = @creds['consumer_api_secret']
58
- settings.access_token = @creds['access_token']
59
- settings.access_token_secret = @creds['access_token_secret']
60
- end
61
- end
62
-
63
- def extract_from_env
64
- values = cred_fieldnames.map { |k| ENV["TWITTER_#{k.upcase}"] }
65
-
66
- return nil if values.any? { |v| v.nil? || v.empty? }
67
-
68
- Hash[cred_fieldnames.zip(values)]
69
- end
70
-
71
- def extract_from_config
72
- values = cred_fieldnames.map do |k|
73
- Recker.shell(Configuration.twitter["#{k}_cmd"]).strip
74
- end
75
-
76
- return nil if values.any? { |v| v.nil? || v.empty? }
77
-
78
- Hash[cred_fieldnames.zip(values)]
79
- end
80
-
81
- def cred_fieldnames
82
- %w[
83
- access_token_secret
84
- access_token
85
- consumer_api_key
86
- consumer_api_secret
87
- ]
88
- end
89
- end
90
- end
91
- end