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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -7
  3. data/_includes/figure.html +14 -0
  4. data/_includes/footer.html +10 -1
  5. data/_includes/head.html +21 -0
  6. data/_includes/nav.html +3 -6
  7. data/_includes/pager.html +13 -0
  8. data/_layouts/home.html +13 -9
  9. data/_layouts/page.html +13 -8
  10. data/_layouts/post.html +20 -28
  11. data/lib/jekyll-recker.rb +17 -17
  12. data/lib/jekyll_recker/commands.rb +27 -0
  13. data/lib/jekyll_recker/configuration.rb +37 -0
  14. data/lib/jekyll_recker/error.rb +6 -0
  15. data/lib/jekyll_recker/extensions.rb +38 -0
  16. data/lib/jekyll_recker/filters.rb +13 -0
  17. data/lib/jekyll_recker/generators.rb +110 -0
  18. data/lib/jekyll_recker/mixins.rb +43 -0
  19. data/lib/{jekyll-recker → jekyll_recker}/shell.rb +5 -5
  20. data/lib/jekyll_recker/social.rb +175 -0
  21. data/lib/jekyll_recker/tags.rb +14 -0
  22. data/lib/jekyll_recker/utils.rb +37 -0
  23. data/lib/jekyll_recker/version.rb +5 -0
  24. metadata +103 -24
  25. data/_layouts/default.html +0 -16
  26. data/assets/inconsolata.css +0 -27
  27. data/assets/jekyll-recker.scss +0 -107
  28. data/assets/open-sans.css +0 -63
  29. data/lib/jekyll-recker/commands.rb +0 -12
  30. data/lib/jekyll-recker/commands/share.rb +0 -25
  31. data/lib/jekyll-recker/commands/slack.rb +0 -31
  32. data/lib/jekyll-recker/commands/tweet.rb +0 -31
  33. data/lib/jekyll-recker/configuration.rb +0 -35
  34. data/lib/jekyll-recker/error.rb +0 -8
  35. data/lib/jekyll-recker/generators.rb +0 -17
  36. data/lib/jekyll-recker/logger.rb +0 -20
  37. data/lib/jekyll-recker/mixins.rb +0 -27
  38. data/lib/jekyll-recker/slack.rb +0 -70
  39. data/lib/jekyll-recker/stats.rb +0 -109
  40. data/lib/jekyll-recker/tags.rb +0 -16
  41. data/lib/jekyll-recker/twitter.rb +0 -83
  42. data/lib/jekyll-recker/version.rb +0 -7
  43. 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 Jekyll
6
- # Recker
7
- module Recker
5
+ module JekyllRecker
6
+ # Shell
7
+ module Shell
8
8
  # ShellCommandFailed
9
- class ShellCommandFailed < ReckerError; end
9
+ class ShellCommandFailed < JekyllRecker::Error; end
10
10
 
11
- def self.shell(cmd)
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
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module JekyllRecker
4
+ VERSION = '1.8.0'
5
+ 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.2.3
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-04-05 00:00:00.000000000 Z
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
- - _layouts/default.html
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/jekyll-recker/commands.rb
76
- - lib/jekyll-recker/commands/share.rb
77
- - lib/jekyll-recker/commands/slack.rb
78
- - lib/jekyll-recker/commands/tweet.rb
79
- - lib/jekyll-recker/configuration.rb
80
- - lib/jekyll-recker/error.rb
81
- - lib/jekyll-recker/generators.rb
82
- - lib/jekyll-recker/logger.rb
83
- - lib/jekyll-recker/mixins.rb
84
- - lib/jekyll-recker/shell.rb
85
- - lib/jekyll-recker/slack.rb
86
- - lib/jekyll-recker/stats.rb
87
- - lib/jekyll-recker/tags.rb
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: This is the jekyll theme for my personal website.
192
+ summary: The Greatest Jekyll Plugin in the World
114
193
  test_files: []