jekyll-recker 2.1.0 → 2.2.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: 22a8ca60a3c024ff18544873f31cf10a7f299c7f665ead001ef6ae07f2e00d64
4
- data.tar.gz: 27364e97fbcfcf1143fc1b7844dd537c0f389bb1dae9c426e6e25012248521e7
3
+ metadata.gz: ea539028f1189e2337f3303c646c14a6c479c9a8bc4345e095b4807c6cbc78f0
4
+ data.tar.gz: 54890ff14bc9a52cecf154b1af2f44b64a4536a19c270e7bc741bb5f8be1436f
5
5
  SHA512:
6
- metadata.gz: f3dbda08bd32e67c15f154034dbc38f5eccda42f7324d67524a8302e555e085fa8a9747b6cde6c3524c82b939ae85c45ebf7839b13e286a6b2fd613f66e9857b
7
- data.tar.gz: 34368985d844b3aca8034dee743961562169740d2aef251965d5ee2b7b0c7700037d2d3614f4b39227188c7c5e4b68f14f5af1736cd424480dd9788ef8a9195c
6
+ metadata.gz: f7907b88a8fdf1ceb6cdc8f57042b6cc1424ff09a243f50b6790953ab591b625489e656f5ac35e63f3b2760b6ec5d5e659e0fd6ee19de3d7b3b0ef839d0cc924
7
+ data.tar.gz: 31a39ca124631df4a59216b7734d7f6e33419a3ebfcc717d54a6a53334c5eea44be3db6c4eca1cdecf3d361f417bb58ab1af3bb26a71f4b169b054fefb351daa
@@ -6,8 +6,13 @@ require 'jekyll'
6
6
  #
7
7
  # The greatest jekyll plugin in the world
8
8
  module JekyllRecker
9
- autoload :Mixins, 'jekyll_recker/mixins.rb'
9
+ autoload :Date, 'jekyll_recker/date.rb'
10
+ autoload :Entry, 'jekyll_recker/entry.rb'
11
+ autoload :Graphs, 'jekyll_recker/graphs.rb'
12
+ autoload :Logging, 'jekyll_recker/logging.rb'
13
+ autoload :Math, 'jekyll_recker/math.rb'
10
14
  autoload :Shell, 'jekyll_recker/shell.rb'
15
+ autoload :Site, 'jekyll_recker/site.rb'
11
16
  autoload :Social, 'jekyll_recker/social.rb'
12
17
  autoload :VERSION, 'jekyll_recker/version.rb'
13
18
 
@@ -15,4 +20,5 @@ module JekyllRecker
15
20
  require 'jekyll_recker/commands.rb'
16
21
  require 'jekyll_recker/filters.rb'
17
22
  require 'jekyll_recker/generators.rb'
23
+ require 'jekyll_recker/tags.rb'
18
24
  end
@@ -5,7 +5,7 @@ module JekyllRecker
5
5
  module Commands
6
6
  # Share Command
7
7
  class Share < Jekyll::Command
8
- include Mixins::Logging
8
+ include Logging
9
9
 
10
10
  def self.init_with_program(prog)
11
11
  prog.command(:share) do |c|
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module JekyllRecker
4
+ # Date Module
5
+ module Date
6
+ def slice_by_consecutive(dates)
7
+ dates.slice_when { |p, c| c != p - 1 && c != p + 1 }.to_a
8
+ end
9
+
10
+ def calculate_streaks(dates)
11
+ slice_by_consecutive(dates).map do |pair|
12
+ first, last = pair.minmax
13
+ {
14
+ 'days' => (last - first).to_i,
15
+ 'start' => first,
16
+ 'end' => last
17
+ }
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module JekyllRecker
4
+ # Entry
5
+ class Entry
6
+ def initialize(doc)
7
+ @doc = doc
8
+ end
9
+
10
+ def content
11
+ @doc.content
12
+ end
13
+
14
+ def date
15
+ @date ||= ::Date.parse(@doc.date.strftime('%Y-%m-%d'))
16
+ end
17
+
18
+ def words
19
+ content.split.map do |token|
20
+ token.gsub!(/[^0-9a-z ]/i, '')
21
+ token.downcase
22
+ end
23
+ end
24
+
25
+ def word_count
26
+ @word_count ||= words.size
27
+ end
28
+ end
29
+ end
@@ -3,12 +3,10 @@
3
3
  module JekyllRecker
4
4
  # Filters
5
5
  module Filters
6
- # Converts a date object to standard Uhh Yeah Dude format.
7
6
  def uyd_date(date)
8
7
  date.strftime('%A, %B %d %Y')
9
8
  end
10
9
 
11
- # Adds commas to a number
12
10
  def pretty(num)
13
11
  num.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse
14
12
  end
@@ -1,164 +1,86 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fastimage'
4
- require 'mini_magick'
3
+ require 'bundler'
5
4
 
6
5
  module JekyllRecker
6
+ # Generators Module
7
7
  module Generators
8
- # Image Resize Generator
9
- class ImageResize < Jekyll::Generator
10
- include Mixins::Logging
8
+ # Base Generator Functions
9
+ module Base
10
+ include Date
11
+ include Logging
12
+ include Math
11
13
 
12
- def generate(site)
13
- @site = site
14
- logger.info 'checking images'
15
- resizeable_images.each do |f, d|
16
- logger.info "resizing #{f} to fit #{d}"
17
- image = MiniMagick::Image.new(f)
18
- image.resize d
19
- end
20
- end
21
-
22
- def image?(file)
23
- ['.jpg', 'jpeg', '.png', '.svg'].include? File.extname(file)
24
- end
25
-
26
- def too_big?(width, height)
27
- width > 800 || height > 800
28
- end
29
-
30
- def images
31
- @site.static_files.collect(&:path).select { |f| image?(f) }
32
- end
33
-
34
- def resizeable_images
35
- with_sizes = images.map { |f| [f, FastImage.size(f)].flatten }
36
- with_sizes.select! { |f| too_big?(f[1], f[2]) }
37
- with_sizes.map do |f, w, h|
38
- dimensions = if w > h
39
- '800x600'
40
- else
41
- '600x800'
42
- end
43
- [f, dimensions]
44
- end
45
- end
46
- end
47
-
48
- # Stats Module
49
- #
50
- # Functions for stats generators.
51
- # @abstract
52
- module Stats
53
- include Mixins::Logging
54
- include Jekyll::Filters
55
-
56
- def key
57
- self.class.const_get(:KEY)
58
- end
59
-
60
- def generate(site)
61
- @site = site
62
- logger.info "crunching stats.#{key}"
63
- @site.data['stats'] ||= {}
64
- @site.data['stats'][key] = crunch
14
+ def production?
15
+ ENV['JEKYLL_ENV'] == 'production'
65
16
  end
66
17
 
67
- def crunch
68
- raise NotImplementedError, '#crunch not implemented!'
18
+ def word_counts
19
+ @word_counts ||= bodies.map(&:split).map(&:size)
69
20
  end
70
21
 
71
- # Calculates the average of a list of numbers.
72
- #
73
- # @param [Array<Numeric>] numlist list of numbers to be averaged.
74
- # @return [Numeric] rounded, calculated average of numlist.
75
- def average(numlist)
76
- calc = numlist.inject { |sum, el| sum + el }.to_f / numlist.size
77
- calc.round
22
+ def words
23
+ bodies.map(&:split).flatten
78
24
  end
79
25
 
80
- # Calculates the total of a list of numbers.
81
- #
82
- # @param [Array<Numeric>] numlist list of numbers to be totaled.
83
- # @return [Numeric] calculated total of numlist.
84
- def total(numlist)
85
- numlist.inject(0) { |sum, x| sum + x }
26
+ def bodies
27
+ entries.collect(&:content)
86
28
  end
87
29
 
88
30
  def entries
89
- @site.posts.docs.select(&:published?)
31
+ @site.posts.docs.select(&:published?).sort_by(&:date).reverse
90
32
  end
91
- end
92
-
93
- # Post Count Generator
94
- class PostCount < Jekyll::Generator
95
- include Stats
96
-
97
- KEY = 'posts'
98
33
 
99
- def crunch
100
- entries.count
34
+ def dates
35
+ entries.collect(&:date).map { |t| ::Date.new(t.year, t.month, t.day) }
101
36
  end
102
37
  end
103
38
 
104
- # Word Count Generator
105
- class Words < Jekyll::Generator
106
- include Stats
39
+ # Stats Generator
40
+ class Stats < Jekyll::Generator
41
+ include Base
42
+ include Graphs
107
43
 
108
- KEY = 'words'
109
-
110
- def crunch
111
- total_counts = entries.collect(&:content).map { |c| number_of_words(c) }
112
- {
113
- 'average' => average(total_counts),
114
- 'total' => total(total_counts)
115
- }
44
+ def generate(site)
45
+ @site = site
46
+ logger.info 'calculating statistics'
47
+ @site.data['stats'] = data
48
+ if production?
49
+ logger.info 'production detected. skipping graphs'
50
+ else
51
+ require 'gruff'
52
+ logger.info 'generating graphs'
53
+ generate_graphs(entries, swear_results, graphs_dir)
54
+ end
116
55
  end
117
- end
118
56
 
119
- # Streak Count Generator
120
- class Streaks < Jekyll::Generator
121
- include Stats
122
-
123
- KEY = 'days'
124
-
125
- def crunch
126
- streaks.take(1).map do |count, dates|
127
- {
128
- 'days' => count,
129
- 'start' => dates[0],
130
- 'end' => dates[1]
57
+ def data
58
+ {
59
+ 'total_words' => total(word_counts),
60
+ 'average_words' => average(word_counts),
61
+ 'total_posts' => entries.size,
62
+ 'consecutive_posts' => calculate_streaks(dates).first['days'],
63
+ 'swears' => {
64
+ 'total' => swear_results.map(&:last).reduce(0, :+),
65
+ 'words' => swear_results
131
66
  }
132
- end.first
67
+ }
133
68
  end
134
69
 
135
70
  private
136
71
 
137
- def streaks
138
- _streaks = []
139
- entry_dates.slice_when do |prev, curr|
140
- curr != prev - 1
141
- end.each do |dates|
142
- first, last = dates.minmax
143
- _streaks << [(last - first).to_i, [first, last]]
144
- end
145
- _streaks
72
+ def swear_results
73
+ @swear_results ||= count_swears
146
74
  end
147
75
 
148
- def entry_dates
149
- entries.collect(&:date).map { |t| Date.new(t.year, t.month, t.day) }.sort.reverse
76
+ def graphs_dir
77
+ recker = @site.config.fetch('recker', {})
78
+ recker.fetch('graphs', 'assets/images/graphs/')
150
79
  end
151
- end
152
80
 
153
- # Swear Count Generator
154
- class Swears < Jekyll::Generator
155
- include Stats
156
-
157
- KEY = 'swears'
158
-
159
- def crunch
81
+ def count_swears
160
82
  results = Hash.new(0)
161
- entries.collect(&:content).map(&:split).each do |words|
83
+ bodies.map(&:split).each do |words|
162
84
  words = words.map(&:downcase)
163
85
  swears.each do |swear|
164
86
  count = words.count(swear)
@@ -168,48 +90,23 @@ module JekyllRecker
168
90
  results.reject { |_k, v| v.zero? }.sort_by { |_k, v| -v }
169
91
  end
170
92
 
171
- private
172
-
173
93
  def swears
174
- [
175
- 'ass',
176
- 'asshole',
177
- 'booger',
178
- 'crap',
179
- 'damn',
180
- 'fart',
181
- 'fuck',
182
- 'hell',
183
- 'jackass',
184
- 'piss',
185
- 'poop',
186
- 'shit',
94
+ %w[
95
+ ass
96
+ asshole
97
+ booger
98
+ crap
99
+ damn
100
+ fart
101
+ fuck
102
+ hell
103
+ jackass
104
+ piss
105
+ poop
106
+ shit
187
107
  ]
188
108
  end
189
109
  end
190
-
191
- # Memory Size Generator
192
- class Memory < Jekyll::Generator
193
- include Stats
194
-
195
- KEY = 'memory'
196
-
197
- def crunch
198
- results = Hash.new(0)
199
- entries.each do |entry|
200
- results['chars'] += entry.content.size
201
- results['spaces'] += entry.content.count(' ')
202
- results['size'] += entry.content.bytes.to_a.length
203
- end
204
- results['size'] = bytes_to_megabytes(results['size'])
205
- results
206
- end
207
-
208
- private
209
-
210
- def bytes_to_megabytes(bytes)
211
- (bytes / (1024.0 * 1024.0)).to_f.round(4)
212
- end
213
- end
110
+ require 'jekyll_recker/generators/image_resize.rb'
214
111
  end
215
112
  end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module JekyllRecker
4
+ module Generators
5
+ # Image Resize Generator
6
+ class ImageResize < Jekyll::Generator
7
+ include Base
8
+
9
+ def generate(site)
10
+ @site = site
11
+ if production?
12
+ logger.info 'production detected, skipping images'
13
+ return
14
+ else
15
+ logger.info 'loading image resizing deps'
16
+ require 'fastimage'
17
+ require 'mini_magick'
18
+ end
19
+ logger.info 'checking images'
20
+ resizeable_images.each do |f, d|
21
+ logger.info "resizing #{f} to fit #{d}"
22
+ image = MiniMagick::Image.new(f)
23
+ image.resize d
24
+ end
25
+ end
26
+
27
+ def image?(file)
28
+ ['.jpg', 'jpeg', '.png', '.svg'].include? File.extname(file)
29
+ end
30
+
31
+ def too_big?(width, height)
32
+ width > 800 || height > 800
33
+ end
34
+
35
+ def graph?(file)
36
+ file.include?('/graphs/')
37
+ end
38
+
39
+ def images
40
+ @site.static_files.collect(&:path).select { |f| image?(f) }
41
+ end
42
+
43
+ def resizeable_images
44
+ without_graphs = images.reject { |i| graph?(i) }
45
+ with_sizes = without_graphs.map { |f| [f, FastImage.size(f)].flatten }
46
+ with_sizes.select! { |f| too_big?(f[1], f[2]) }
47
+ with_sizes.map do |f, w, h|
48
+ dimensions = if w > h
49
+ '800x600'
50
+ else
51
+ '600x800'
52
+ end
53
+ [f, dimensions]
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler'
4
+
5
+ module JekyllRecker
6
+ # Graphs module
7
+ module Graphs
8
+ def generate_graphs(posts, swears, graphs_dir)
9
+ WordCount.new(posts, graphs_dir).write
10
+ Swears.new(swears, graphs_dir).write
11
+ end
12
+
13
+ # Word Count Graph
14
+ class WordCount
15
+ def initialize(posts, graphs_dir)
16
+ @posts = posts[0..6].reverse
17
+ @graphs_dir = graphs_dir
18
+ end
19
+
20
+ def graphs_join(path)
21
+ File.join Bundler.root, @graphs_dir, path
22
+ end
23
+
24
+ def title
25
+ format = '%m/%d/%y'
26
+ first = @posts.first.date.strftime(format)
27
+ last = @posts.last.date.strftime(format)
28
+ "Word Count: #{first} - #{last}"
29
+ end
30
+
31
+ def labels
32
+ Hash[@posts.each_with_index.map { |p, i| [i, p.date.strftime('%a')] }]
33
+ end
34
+
35
+ # TODO: copied from jekyll
36
+ def number_of_words(input)
37
+ input.split.length
38
+ end
39
+
40
+ def write
41
+ g = Gruff::Line.new('800x600')
42
+ g.theme = Gruff::Themes::PASTEL
43
+ g.hide_legend = true
44
+ g.labels = labels
45
+ g.data :words, @posts.collect(&:content).map { |c| number_of_words(c) }
46
+ g.title = title
47
+ g.x_axis_label = 'Day'
48
+ g.y_axis_label = 'Word Count'
49
+ g.minimum_value = 0
50
+ g.write(graphs_join('words.png'))
51
+ end
52
+ end
53
+
54
+ # Swears Chart
55
+ class Swears
56
+ attr_reader :results
57
+
58
+ def initialize(results, graphs_dir)
59
+ @results = results
60
+ @graphs_dir = graphs_dir
61
+ end
62
+
63
+ # TODO: I SUCK
64
+ def graphs_join(path)
65
+ File.join Bundler.root, @graphs_dir, path
66
+ end
67
+
68
+ def write
69
+ g = Gruff::Pie.new('800x600')
70
+ g.theme = Gruff::Themes::PASTEL
71
+ g.hide_legend = false
72
+ g.legend_at_bottom = true
73
+ g.minimum_value = 0
74
+ results.each { |w, n| g.data w, n }
75
+ g.write(graphs_join('swears.png'))
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'logger'
4
+
5
+ module JekyllRecker
6
+ # Logging
7
+ module Logging
8
+ def self.included(base)
9
+ base.extend(self)
10
+ end
11
+
12
+ def logger
13
+ @logger ||= Logger.new(
14
+ STDOUT,
15
+ formatter: proc { |_severity, _datetime, _progname, msg| "jekyll-recker: #{msg}\n" }
16
+ )
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module JekyllRecker
4
+ # Math Module
5
+ module Math
6
+ def average(numlist)
7
+ calc = numlist.inject { |sum, el| sum + el }.to_f / numlist.size
8
+ calc.round
9
+ end
10
+
11
+ def total(numlist)
12
+ numlist.inject(0) { |sum, x| sum + x }
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module JekyllRecker
4
+ # Site
5
+ class Site
6
+ def initialize(site)
7
+ @site = site
8
+ end
9
+
10
+ def entries
11
+ @entries ||= build_entries
12
+ end
13
+
14
+ def production?
15
+ ENV['JEKYLL_ENV'] == 'production'
16
+ end
17
+
18
+ private
19
+
20
+ def build_entries
21
+ @site.posts.docs.select(&:published?).sort_by(&:date).reverse.map { |p| Entry.new(p) }
22
+ end
23
+ end
24
+ end
@@ -4,6 +4,7 @@ require 'slack-notifier'
4
4
  require 'twitter'
5
5
 
6
6
  module JekyllRecker
7
+ # Social Module
7
8
  module Social
8
9
  def self.action(site, args, options)
9
10
  args += %w[slack twitter] if args.empty?
@@ -16,7 +17,7 @@ module JekyllRecker
16
17
  # Backend base class for social sharing backends.
17
18
  # @abstract
18
19
  class Share
19
- include Mixins::Logging
20
+ include Logging
20
21
 
21
22
  def self.share(site, dry: false)
22
23
  backend = new(site, dry: dry)
@@ -81,9 +82,7 @@ module JekyllRecker
81
82
  @creds = {}
82
83
  workspaces.each do |key, data|
83
84
  webhook = ENV["SLACK_#{key.upcase}_WEBHOOK"] || extract_from_config(data)
84
- if webhook.nil?
85
- raise "cannot find slack webhook for #{key} workspace!"
86
- end
85
+ raise "cannot find slack webhook for #{key} workspace!" if webhook.nil?
87
86
 
88
87
  @creds[key] = webhook
89
88
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module JekyllRecker
4
+ # Tags
5
+ module Tags
6
+ # Render the current plugin version
7
+ class Version < Liquid::Tag
8
+ def render(_ctx)
9
+ "v#{JekyllRecker::VERSION}"
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ Liquid::Template.register_tag('version', JekyllRecker::Tags::Version)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module JekyllRecker
4
- VERSION = '2.1.0'
4
+ VERSION = '2.2.0'
5
5
  end
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-recker
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.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-07-19 00:00:00.000000000 Z
11
+ date: 2020-07-25 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: fastimage
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: jekyll
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -38,48 +24,6 @@ dependencies:
38
24
  - - "~>"
39
25
  - !ruby/object:Gem::Version
40
26
  version: '3.8'
41
- - !ruby/object:Gem::Dependency
42
- name: mini_magick
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :runtime
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: slack-notifier
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :runtime
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: twitter
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :runtime
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
27
  description:
84
28
  email:
85
29
  - alex@reckerfamily.com
@@ -89,11 +33,18 @@ extra_rdoc_files: []
89
33
  files:
90
34
  - lib/jekyll-recker.rb
91
35
  - lib/jekyll_recker/commands.rb
36
+ - lib/jekyll_recker/date.rb
37
+ - lib/jekyll_recker/entry.rb
92
38
  - lib/jekyll_recker/filters.rb
93
39
  - lib/jekyll_recker/generators.rb
94
- - lib/jekyll_recker/mixins.rb
40
+ - lib/jekyll_recker/generators/image_resize.rb
41
+ - lib/jekyll_recker/graphs.rb
42
+ - lib/jekyll_recker/logging.rb
43
+ - lib/jekyll_recker/math.rb
95
44
  - lib/jekyll_recker/shell.rb
45
+ - lib/jekyll_recker/site.rb
96
46
  - lib/jekyll_recker/social.rb
47
+ - lib/jekyll_recker/tags.rb
97
48
  - lib/jekyll_recker/version.rb
98
49
  homepage: https://www.github.com/arecker/blog
99
50
  licenses:
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'logger'
4
-
5
- module JekyllRecker
6
- module Mixins
7
- # Logging
8
- module Logging
9
- def self.included(base)
10
- base.extend(self)
11
- end
12
-
13
- def logger
14
- @logger ||= Logger.new(
15
- STDOUT,
16
- formatter: proc { |_severity, _datetime, _progname, msg| "jekyll-recker: #{msg}\n" }
17
- )
18
- end
19
- end
20
- end
21
- end