jekyll-recker 1.2.3 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
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: []