jekyll-recker 1.2.3 → 1.8.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/README.md +6 -7
- data/_includes/figure.html +14 -0
- data/_includes/footer.html +10 -1
- data/_includes/head.html +21 -0
- data/_includes/nav.html +3 -6
- data/_includes/pager.html +13 -0
- data/_layouts/home.html +13 -9
- data/_layouts/page.html +13 -8
- data/_layouts/post.html +20 -28
- data/lib/jekyll-recker.rb +17 -17
- data/lib/jekyll_recker/commands.rb +27 -0
- data/lib/jekyll_recker/configuration.rb +37 -0
- data/lib/jekyll_recker/error.rb +6 -0
- data/lib/jekyll_recker/extensions.rb +38 -0
- data/lib/jekyll_recker/filters.rb +13 -0
- data/lib/jekyll_recker/generators.rb +110 -0
- data/lib/jekyll_recker/mixins.rb +43 -0
- data/lib/{jekyll-recker → jekyll_recker}/shell.rb +5 -5
- data/lib/jekyll_recker/social.rb +175 -0
- data/lib/jekyll_recker/tags.rb +14 -0
- data/lib/jekyll_recker/utils.rb +37 -0
- data/lib/jekyll_recker/version.rb +5 -0
- metadata +103 -24
- data/_layouts/default.html +0 -16
- data/assets/inconsolata.css +0 -27
- data/assets/jekyll-recker.scss +0 -107
- data/assets/open-sans.css +0 -63
- data/lib/jekyll-recker/commands.rb +0 -12
- data/lib/jekyll-recker/commands/share.rb +0 -25
- data/lib/jekyll-recker/commands/slack.rb +0 -31
- data/lib/jekyll-recker/commands/tweet.rb +0 -31
- data/lib/jekyll-recker/configuration.rb +0 -35
- data/lib/jekyll-recker/error.rb +0 -8
- data/lib/jekyll-recker/generators.rb +0 -17
- data/lib/jekyll-recker/logger.rb +0 -20
- data/lib/jekyll-recker/mixins.rb +0 -27
- data/lib/jekyll-recker/slack.rb +0 -70
- data/lib/jekyll-recker/stats.rb +0 -109
- data/lib/jekyll-recker/tags.rb +0 -16
- data/lib/jekyll-recker/twitter.rb +0 -83
- data/lib/jekyll-recker/version.rb +0 -7
- data/lib/jekyll-recker/words.rb +0 -82
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
module JekyllRecker
|
6
|
+
module Mixins
|
7
|
+
# Descendants
|
8
|
+
module Descendants
|
9
|
+
def self.included(base)
|
10
|
+
base.extend(self)
|
11
|
+
end
|
12
|
+
|
13
|
+
def descendants
|
14
|
+
ObjectSpace.each_object(Class).select { |klass| klass < self }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# Introspection
|
19
|
+
module Introspection
|
20
|
+
def self.included(base)
|
21
|
+
base.extend(self)
|
22
|
+
end
|
23
|
+
|
24
|
+
def class_name
|
25
|
+
self.class.name.split('::').last
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Logging
|
30
|
+
module Logging
|
31
|
+
def self.included(base)
|
32
|
+
base.extend(self)
|
33
|
+
end
|
34
|
+
|
35
|
+
def logger
|
36
|
+
@logger ||= Logger.new(
|
37
|
+
STDOUT,
|
38
|
+
formatter: proc { |_severity, _datetime, _progname, msg| "jekyll-recker: #{msg}\n" }
|
39
|
+
)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -2,13 +2,13 @@
|
|
2
2
|
|
3
3
|
require 'open3'
|
4
4
|
|
5
|
-
module
|
6
|
-
#
|
7
|
-
module
|
5
|
+
module JekyllRecker
|
6
|
+
# Shell
|
7
|
+
module Shell
|
8
8
|
# ShellCommandFailed
|
9
|
-
class ShellCommandFailed <
|
9
|
+
class ShellCommandFailed < JekyllRecker::Error; end
|
10
10
|
|
11
|
-
def self.
|
11
|
+
def self.run(cmd)
|
12
12
|
out, err, status = Open3.capture3(cmd)
|
13
13
|
return out if status.success?
|
14
14
|
|
@@ -0,0 +1,175 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'slack-notifier'
|
4
|
+
require 'twitter'
|
5
|
+
|
6
|
+
module JekyllRecker
|
7
|
+
module Social
|
8
|
+
def self.action(args, options)
|
9
|
+
args += %w[slack twitter] if args.empty?
|
10
|
+
Slack.share(dry: options['dry']) if args.include?('slack')
|
11
|
+
Twitter.share(dry: options['dry']) if args.include?('twitter')
|
12
|
+
end
|
13
|
+
# Backend
|
14
|
+
#
|
15
|
+
# Backend base class for social sharing backends.
|
16
|
+
# @abstract
|
17
|
+
class Share
|
18
|
+
include Mixins::Introspection
|
19
|
+
include Mixins::Logging
|
20
|
+
|
21
|
+
def self.share(dry: false)
|
22
|
+
backend = new(dry: dry)
|
23
|
+
logger.info "#{backend.name} - building configuration"
|
24
|
+
backend.configure!
|
25
|
+
|
26
|
+
logger.info "#{backend.name} - sharing \"#{backend.latest_title}\""
|
27
|
+
backend.post!
|
28
|
+
end
|
29
|
+
|
30
|
+
def initialize(dry: false)
|
31
|
+
@dry = dry
|
32
|
+
end
|
33
|
+
|
34
|
+
def dry?
|
35
|
+
@dry
|
36
|
+
end
|
37
|
+
|
38
|
+
def config
|
39
|
+
@config ||= JekyllRecker::Configuration.recker.fetch(config_key)
|
40
|
+
end
|
41
|
+
|
42
|
+
def config_key
|
43
|
+
class_name.downcase
|
44
|
+
end
|
45
|
+
alias name config_key
|
46
|
+
|
47
|
+
def post_body
|
48
|
+
url = File.join Configuration.jekyll['url'], latest.url
|
49
|
+
<<~BODY
|
50
|
+
#{latest.data['date'].strftime('%A, %B %-d %Y')}
|
51
|
+
#{latest.data['title']}
|
52
|
+
#{url}
|
53
|
+
BODY
|
54
|
+
end
|
55
|
+
|
56
|
+
def latest
|
57
|
+
@latest ||= Configuration.latest_post
|
58
|
+
end
|
59
|
+
|
60
|
+
def latest_title
|
61
|
+
latest.data['title']
|
62
|
+
end
|
63
|
+
|
64
|
+
def configure!
|
65
|
+
raise NotImplementedError
|
66
|
+
end
|
67
|
+
|
68
|
+
def post!
|
69
|
+
raise NotImplementedError
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# Slack
|
74
|
+
#
|
75
|
+
# Slack social sharing backend
|
76
|
+
class Slack < Share
|
77
|
+
def configure!
|
78
|
+
@creds = {}
|
79
|
+
workspaces.each do |key, data|
|
80
|
+
webhook = ENV["SLACK_#{key.upcase}_WEBHOOK"] || extract_from_config(data)
|
81
|
+
if webhook.nil?
|
82
|
+
raise ReckerError, "cannot find slack webhook for #{key} workspace!"
|
83
|
+
end
|
84
|
+
|
85
|
+
@creds[key] = webhook
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def post!
|
90
|
+
message_body = ::Slack::Notifier::Util::LinkFormatter.format(post_body)
|
91
|
+
workspaces.each do |key, config|
|
92
|
+
logger.info "posting to #{key} workspace"
|
93
|
+
if @dry
|
94
|
+
logger.info("BEGIN MESSAGE\n#{message_body.strip}\nEND MESSAGE")
|
95
|
+
else
|
96
|
+
::Slack::Notifier.new(
|
97
|
+
@creds[key].strip,
|
98
|
+
channel: config.fetch('channel'),
|
99
|
+
username: config.fetch('username'),
|
100
|
+
icon_emoji: config.fetch('emoji')
|
101
|
+
).post(text: message_body)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
private
|
107
|
+
|
108
|
+
def extract_from_config(data)
|
109
|
+
cmd = data['webhook_cmd']
|
110
|
+
return nil if cmd.nil?
|
111
|
+
|
112
|
+
Shell.run(cmd)
|
113
|
+
end
|
114
|
+
|
115
|
+
def workspaces
|
116
|
+
config.each
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
# Twitter
|
121
|
+
#
|
122
|
+
# Twitter social sharing backend
|
123
|
+
class Twitter < Share
|
124
|
+
def configure!
|
125
|
+
creds = extract_from_env || extract_from_config
|
126
|
+
raise ReckerError, 'cannot find twitter credentials!' if creds.nil?
|
127
|
+
|
128
|
+
@client = ::Twitter::REST::Client.new do |settings|
|
129
|
+
settings.consumer_key = creds['consumer_api_key']
|
130
|
+
settings.consumer_secret = creds['consumer_api_secret']
|
131
|
+
settings.access_token = creds['access_token']
|
132
|
+
settings.access_token_secret = creds['access_token_secret']
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def post!
|
137
|
+
if dry?
|
138
|
+
logger.info('tweeting in dry mode, printing message')
|
139
|
+
logger.info("BEGIN TWEET\n#{post_body}END TWEET")
|
140
|
+
else
|
141
|
+
@client.update(post_body)
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
private
|
146
|
+
|
147
|
+
def extract_from_env
|
148
|
+
values = cred_fieldnames.map { |k| ENV["TWITTER_#{k.upcase}"] }
|
149
|
+
|
150
|
+
return nil if values.any? { |v| v.nil? || v.empty? }
|
151
|
+
|
152
|
+
Hash[cred_fieldnames.zip(values)]
|
153
|
+
end
|
154
|
+
|
155
|
+
def extract_from_config
|
156
|
+
values = cred_fieldnames.map do |k|
|
157
|
+
Shell.run(Configuration.twitter["#{k}_cmd"]).strip
|
158
|
+
end
|
159
|
+
|
160
|
+
return nil if values.any? { |v| v.nil? || v.empty? }
|
161
|
+
|
162
|
+
Hash[cred_fieldnames.zip(values)]
|
163
|
+
end
|
164
|
+
|
165
|
+
def cred_fieldnames
|
166
|
+
[
|
167
|
+
'access_token_secret',
|
168
|
+
'access_token',
|
169
|
+
'consumer_api_key',
|
170
|
+
'consumer_api_secret'
|
171
|
+
]
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module JekyllRecker
|
4
|
+
module Tags
|
5
|
+
# Returns the VERSION of the running jekyll-recker gem.
|
6
|
+
class Version < Liquid::Tag
|
7
|
+
def render(_context)
|
8
|
+
VERSION
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
Liquid::Template.register_tag('recker_version', JekyllRecker::Tags::Version)
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module JekyllRecker
|
4
|
+
# Utils
|
5
|
+
module Utils
|
6
|
+
def self.array_to_and_list(array)
|
7
|
+
case array.length
|
8
|
+
when 0
|
9
|
+
''
|
10
|
+
when 1
|
11
|
+
array.first
|
12
|
+
when 2
|
13
|
+
"#{array.first} and #{array.last}"
|
14
|
+
else
|
15
|
+
array[0...-1].join(', ') + ", and #{array.last}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.and_list_to_array(str)
|
20
|
+
str = str.gsub(' and ', ', ')
|
21
|
+
str.split(',').map(&:strip).reject(&:empty?)
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.prettify_number(number)
|
25
|
+
number.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.prettify_path(path, home = nil)
|
29
|
+
home ||= File.expand_path('~/')
|
30
|
+
path.sub(home, '~')
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.to_word_list(str)
|
34
|
+
str.split(' ')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,99 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-recker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.8.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-
|
11
|
+
date: 2020-07-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bump
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: pry
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rubocop
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: yard
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
13
97
|
- !ruby/object:Gem::Dependency
|
14
98
|
name: jekyll
|
15
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -61,34 +145,29 @@ extra_rdoc_files: []
|
|
61
145
|
files:
|
62
146
|
- LICENSE
|
63
147
|
- README.md
|
148
|
+
- _includes/figure.html
|
64
149
|
- _includes/footer.html
|
150
|
+
- _includes/head.html
|
65
151
|
- _includes/header.html
|
66
152
|
- _includes/nav.html
|
67
|
-
-
|
153
|
+
- _includes/pager.html
|
68
154
|
- _layouts/home.html
|
69
155
|
- _layouts/page.html
|
70
156
|
- _layouts/post.html
|
71
|
-
- assets/inconsolata.css
|
72
|
-
- assets/jekyll-recker.scss
|
73
|
-
- assets/open-sans.css
|
74
157
|
- lib/jekyll-recker.rb
|
75
|
-
- lib/
|
76
|
-
- lib/
|
77
|
-
- lib/
|
78
|
-
- lib/
|
79
|
-
- lib/
|
80
|
-
- lib/
|
81
|
-
- lib/
|
82
|
-
- lib/
|
83
|
-
- lib/
|
84
|
-
- lib/
|
85
|
-
- lib/
|
86
|
-
- lib/
|
87
|
-
|
88
|
-
- lib/jekyll-recker/twitter.rb
|
89
|
-
- lib/jekyll-recker/version.rb
|
90
|
-
- lib/jekyll-recker/words.rb
|
91
|
-
homepage: https://www.alexrecker.com/jekyll-recker.html
|
158
|
+
- lib/jekyll_recker/commands.rb
|
159
|
+
- lib/jekyll_recker/configuration.rb
|
160
|
+
- lib/jekyll_recker/error.rb
|
161
|
+
- lib/jekyll_recker/extensions.rb
|
162
|
+
- lib/jekyll_recker/filters.rb
|
163
|
+
- lib/jekyll_recker/generators.rb
|
164
|
+
- lib/jekyll_recker/mixins.rb
|
165
|
+
- lib/jekyll_recker/shell.rb
|
166
|
+
- lib/jekyll_recker/social.rb
|
167
|
+
- lib/jekyll_recker/tags.rb
|
168
|
+
- lib/jekyll_recker/utils.rb
|
169
|
+
- lib/jekyll_recker/version.rb
|
170
|
+
homepage: https://www.github.com/arecker/jekyll-recker/
|
92
171
|
licenses:
|
93
172
|
- GPLv3
|
94
173
|
metadata: {}
|
@@ -110,5 +189,5 @@ requirements: []
|
|
110
189
|
rubygems_version: 3.0.3
|
111
190
|
signing_key:
|
112
191
|
specification_version: 4
|
113
|
-
summary:
|
192
|
+
summary: The Greatest Jekyll Plugin in the World
|
114
193
|
test_files: []
|