jekyll-recker 1.6.0 → 1.7.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 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