jekyll-recker 2.2.0 → 2.3.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: ea539028f1189e2337f3303c646c14a6c479c9a8bc4345e095b4807c6cbc78f0
4
- data.tar.gz: 54890ff14bc9a52cecf154b1af2f44b64a4536a19c270e7bc741bb5f8be1436f
3
+ metadata.gz: 7de0dd41444c7a9cec90c5dfc035b3544efc0096e2b36cab9131c50122ead0b7
4
+ data.tar.gz: ed2122a9180d19f534c5dded62a8abcef9b56a94aad951e63fcdd30b3cf6a22f
5
5
  SHA512:
6
- metadata.gz: f7907b88a8fdf1ceb6cdc8f57042b6cc1424ff09a243f50b6790953ab591b625489e656f5ac35e63f3b2760b6ec5d5e659e0fd6ee19de3d7b3b0ef839d0cc924
7
- data.tar.gz: 31a39ca124631df4a59216b7734d7f6e33419a3ebfcc717d54a6a53334c5eea44be3db6c4eca1cdecf3d361f417bb58ab1af3bb26a71f4b169b054fefb351daa
6
+ metadata.gz: 78c36674f14a242e76bc2c82ffa9410d70e0f5f1cc9da1bbd5a26c47a12609e583101b7876ed7d56ff8e1bb3da45cab7da207cf51d05b8651958a00acf276781
7
+ data.tar.gz: ba89a46a1c2c48a6484bbcfab4b3e62e34c344423c1707ccb6497c086bde93a127517b5bfbba10ba4f749cc6d78cffd6d30e048fa170a823e50c1bf7031d9cf4
@@ -17,7 +17,7 @@ module JekyllRecker
17
17
  end
18
18
 
19
19
  def self.action(args, options)
20
- site = Jekyll::Site.new(configuration_from_options(options))
20
+ site = ::Jekyll::Site.new(configuration_from_options(options))
21
21
  site.reset
22
22
  site.read
23
23
  Social.action(site, args, options)
@@ -17,5 +17,9 @@ module JekyllRecker
17
17
  }
18
18
  end
19
19
  end
20
+
21
+ def time_to_date(time)
22
+ ::Date.parse(time.strftime('%Y-%m-%d'))
23
+ end
20
24
  end
21
25
  end
@@ -3,6 +3,9 @@
3
3
  module JekyllRecker
4
4
  # Entry
5
5
  class Entry
6
+ include Date
7
+ include Filters
8
+
6
9
  def initialize(doc)
7
10
  @doc = doc
8
11
  end
@@ -12,7 +15,19 @@ module JekyllRecker
12
15
  end
13
16
 
14
17
  def date
15
- @date ||= ::Date.parse(@doc.date.strftime('%Y-%m-%d'))
18
+ @date ||= time_to_date(@doc.date)
19
+ end
20
+
21
+ def title
22
+ uyd_date(date)
23
+ end
24
+
25
+ def subtitle
26
+ @doc.data['title']
27
+ end
28
+
29
+ def url
30
+ @doc.url
16
31
  end
17
32
 
18
33
  def words
@@ -1,93 +1,53 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'bundler'
4
-
5
3
  module JekyllRecker
6
4
  # Generators Module
7
5
  module Generators
8
- # Base Generator Functions
6
+ # Base Generator
9
7
  module Base
10
8
  include Date
11
9
  include Logging
12
10
  include Math
13
-
14
- def production?
15
- ENV['JEKYLL_ENV'] == 'production'
16
- end
17
-
18
- def word_counts
19
- @word_counts ||= bodies.map(&:split).map(&:size)
20
- end
21
-
22
- def words
23
- bodies.map(&:split).flatten
24
- end
25
-
26
- def bodies
27
- entries.collect(&:content)
28
- end
29
-
30
- def entries
31
- @site.posts.docs.select(&:published?).sort_by(&:date).reverse
32
- end
33
-
34
- def dates
35
- entries.collect(&:date).map { |t| ::Date.new(t.year, t.month, t.day) }
36
- end
37
11
  end
38
12
 
39
13
  # Stats Generator
40
14
  class Stats < Jekyll::Generator
41
15
  include Base
42
- include Graphs
16
+
17
+ attr_reader :site
43
18
 
44
19
  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'
20
+ @site = Site.new(site)
21
+ generate_stats!
22
+ if @site.production?
23
+ info 'production detected. skipping graphs'
50
24
  else
51
- require 'gruff'
52
- logger.info 'generating graphs'
53
- generate_graphs(entries, swear_results, graphs_dir)
25
+ info 'generating graphs'
26
+ Graphs.generate_graphs(@site)
54
27
  end
55
28
  end
56
29
 
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
66
- }
30
+ def generate_stats!
31
+ info 'calculating statistics'
32
+ site.data['stats'] = {
33
+ 'total_words' => total(site.word_counts),
34
+ 'average_words' => average(site.word_counts),
35
+ 'total_posts' => site.entries.size,
36
+ 'consecutive_posts' => calculate_streaks(site.dates).first['days'],
37
+ 'swears' => calculate_swears
67
38
  }
68
39
  end
69
40
 
70
41
  private
71
42
 
72
- def swear_results
73
- @swear_results ||= count_swears
74
- end
75
-
76
- def graphs_dir
77
- recker = @site.config.fetch('recker', {})
78
- recker.fetch('graphs', 'assets/images/graphs/')
43
+ def calculate_swears
44
+ results = Hash[count_swears]
45
+ results['total'] = total(results.values)
46
+ results
79
47
  end
80
48
 
81
49
  def count_swears
82
- results = Hash.new(0)
83
- bodies.map(&:split).each do |words|
84
- words = words.map(&:downcase)
85
- swears.each do |swear|
86
- count = words.count(swear)
87
- results[swear] += count
88
- end
89
- end
90
- results.reject { |_k, v| v.zero? }.sort_by { |_k, v| -v }
50
+ occurences(swears, site.words).reject { |_k, v| v.zero? }.sort_by { |_k, v| -v }
91
51
  end
92
52
 
93
53
  def swears
@@ -107,6 +67,57 @@ module JekyllRecker
107
67
  ]
108
68
  end
109
69
  end
110
- require 'jekyll_recker/generators/image_resize.rb'
70
+
71
+ # Image Resize Generator
72
+ class ImageResize < Jekyll::Generator
73
+ include Base
74
+
75
+ attr_reader :site
76
+
77
+ def generate(site)
78
+ @site = Site.new(site)
79
+
80
+ if @site.production?
81
+ info 'production detected, skipping images'
82
+ return
83
+ end
84
+
85
+ load_deps!
86
+
87
+ info 'checking images'
88
+ resizeable_images.each do |f, d|
89
+ info "resizing #{f} to fit #{d}"
90
+ image = MiniMagick::Image.new(f)
91
+ image.resize d
92
+ end
93
+ end
94
+
95
+ def too_big?(width, height)
96
+ width > 800 || height > 800
97
+ end
98
+
99
+ def load_deps!
100
+ require 'fastimage'
101
+ require 'mini_magick'
102
+ end
103
+
104
+ def graph?(file)
105
+ file.include?('/graphs/')
106
+ end
107
+
108
+ def resizeable_images
109
+ without_graphs = site.images.reject { |i| graph?(i) }
110
+ with_sizes = without_graphs.map { |f| [f, FastImage.size(f)].flatten }
111
+ with_sizes.select! { |f| too_big?(f[1], f[2]) }
112
+ with_sizes.map do |f, w, h|
113
+ dimensions = if w > h
114
+ '800x600'
115
+ else
116
+ '600x800'
117
+ end
118
+ [f, dimensions]
119
+ end
120
+ end
121
+ end
111
122
  end
112
123
  end
@@ -5,44 +5,55 @@ require 'bundler'
5
5
  module JekyllRecker
6
6
  # Graphs module
7
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
8
+ def self.generate_graphs(site)
9
+ require 'gruff'
10
+ WordCount.new(site).write
11
+ Swears.new(site).write
12
+ end
13
+
14
+ # Base Graph
15
+ module Base
16
+ attr_reader :site
17
+
18
+ def graphs_join(path)
19
+ File.join Bundler.root, @graphs_dir, path
20
+ end
11
21
  end
12
22
 
13
23
  # Word Count Graph
14
24
  class WordCount
15
- def initialize(posts, graphs_dir)
16
- @posts = posts[0..6].reverse
17
- @graphs_dir = graphs_dir
25
+ include Base
26
+
27
+ def initialize(site)
28
+ @site = site
29
+ @graphs_dir = site.graphs_dir
18
30
  end
19
31
 
20
- def graphs_join(path)
21
- File.join Bundler.root, @graphs_dir, path
32
+ def posts
33
+ site.entries[0..6].reverse
34
+ end
35
+
36
+ def word_counts
37
+ site.word_counts[0..6].reverse
22
38
  end
23
39
 
24
40
  def title
25
41
  format = '%m/%d/%y'
26
- first = @posts.first.date.strftime(format)
27
- last = @posts.last.date.strftime(format)
42
+ first = posts.first.date.strftime(format)
43
+ last = posts.last.date.strftime(format)
28
44
  "Word Count: #{first} - #{last}"
29
45
  end
30
46
 
31
47
  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
48
+ Hash[posts.each_with_index.map { |p, i| [i, p.date.strftime('%a')] }]
38
49
  end
39
50
 
40
51
  def write
41
- g = Gruff::Line.new('800x600')
52
+ g = ::Gruff::Line.new('800x600')
42
53
  g.theme = Gruff::Themes::PASTEL
43
54
  g.hide_legend = true
44
55
  g.labels = labels
45
- g.data :words, @posts.collect(&:content).map { |c| number_of_words(c) }
56
+ g.data :words, word_counts
46
57
  g.title = title
47
58
  g.x_axis_label = 'Day'
48
59
  g.y_axis_label = 'Word Count'
@@ -53,20 +64,18 @@ module JekyllRecker
53
64
 
54
65
  # Swears Chart
55
66
  class Swears
56
- attr_reader :results
67
+ include Base
57
68
 
58
- def initialize(results, graphs_dir)
59
- @results = results
60
- @graphs_dir = graphs_dir
61
- end
69
+ attr_reader :results
62
70
 
63
- # TODO: I SUCK
64
- def graphs_join(path)
65
- File.join Bundler.root, @graphs_dir, path
71
+ def initialize(site)
72
+ @results = site.data['stats']['swears'].clone
73
+ @results.delete('total')
74
+ @graphs_dir = site.graphs_dir
66
75
  end
67
76
 
68
77
  def write
69
- g = Gruff::Pie.new('800x600')
78
+ g = ::Gruff::Pie.new('800x600')
70
79
  g.theme = Gruff::Themes::PASTEL
71
80
  g.hide_legend = false
72
81
  g.legend_at_bottom = true
@@ -9,11 +9,12 @@ module JekyllRecker
9
9
  base.extend(self)
10
10
  end
11
11
 
12
+ def info(msg)
13
+ Jekyll.logger.info 'jekyll-recker:', msg
14
+ end
15
+
12
16
  def logger
13
- @logger ||= Logger.new(
14
- STDOUT,
15
- formatter: proc { |_severity, _datetime, _progname, msg| "jekyll-recker: #{msg}\n" }
16
- )
17
+ ::Jekyll.logger
17
18
  end
18
19
  end
19
20
  end
@@ -11,5 +11,13 @@ module JekyllRecker
11
11
  def total(numlist)
12
12
  numlist.inject(0) { |sum, x| sum + x }
13
13
  end
14
+
15
+ def occurences(keys, targets)
16
+ results = Hash.new(0)
17
+ targets.each do |target|
18
+ results[target] += 1 if keys.include? target
19
+ end
20
+ results
21
+ end
14
22
  end
15
23
  end
@@ -11,14 +11,60 @@ module JekyllRecker
11
11
  @entries ||= build_entries
12
12
  end
13
13
 
14
+ def latest
15
+ entries.first
16
+ end
17
+
18
+
14
19
  def production?
15
20
  ENV['JEKYLL_ENV'] == 'production'
16
21
  end
17
22
 
23
+ def data
24
+ @site.data
25
+ end
26
+
27
+ def url
28
+ @site.config['url']
29
+ end
30
+
31
+ def word_counts
32
+ entries.collect(&:word_count)
33
+ end
34
+
35
+ def words
36
+ entries.collect(&:words).flatten
37
+ end
38
+
39
+ def dates
40
+ entries.collect(&:date)
41
+ end
42
+
43
+ def images
44
+ exts = ['.jpg', 'jpeg', '.png', '.svg']
45
+ @site.static_files.collect(&:path).select { |f| exts.include? File.extname(f) }
46
+ end
47
+
48
+ def recker_config
49
+ @site.config.fetch('recker', {})
50
+ end
51
+
52
+ def config
53
+ @site.config
54
+ end
55
+
56
+ def graphs_dir
57
+ recker_config.fetch('graphs', 'assets/images/graphs/')
58
+ end
59
+
18
60
  private
19
61
 
20
62
  def build_entries
21
- @site.posts.docs.select(&:published?).sort_by(&:date).reverse.map { |p| Entry.new(p) }
63
+ @site.posts.docs
64
+ .select(&:published?)
65
+ .sort_by(&:date)
66
+ .reverse
67
+ .map { |p| Entry.new(p) }
22
68
  end
23
69
  end
24
70
  end
@@ -19,17 +19,19 @@ module JekyllRecker
19
19
  class Share
20
20
  include Logging
21
21
 
22
+ attr_reader :site
23
+
22
24
  def self.share(site, dry: false)
23
25
  backend = new(site, dry: dry)
24
- logger.info "#{backend.name} - building configuration"
26
+ info "#{backend.name} - building configuration"
25
27
  backend.configure!
26
28
 
27
- logger.info "#{backend.name} - sharing \"#{backend.latest_title}\""
29
+ info "#{backend.name} - sharing \"#{backend.latest_title}\""
28
30
  backend.post!
29
31
  end
30
32
 
31
33
  def initialize(site, dry: false)
32
- @site = site
34
+ @site = Site.new(site)
33
35
  @dry = dry
34
36
  end
35
37
 
@@ -38,29 +40,28 @@ module JekyllRecker
38
40
  end
39
41
 
40
42
  def config
41
- @site.config.fetch('recker', {}).fetch(config_key, {})
43
+ site.recker_config.fetch(config_key, {})
42
44
  end
43
45
 
44
46
  def config_key
45
47
  self.class.const_get(:KEY)
46
48
  end
47
- alias name :config_key
49
+ alias :name :config_key
48
50
 
49
51
  def post_body
50
- url = File.join @site.config['url'], latest.url
51
52
  <<~BODY
52
- #{latest.data['date'].strftime('%A, %B %-d %Y')}
53
- #{latest.data['title']}
54
- #{url}
53
+ #{latest.title}
54
+ #{latest.subtitle}
55
+ #{File.join site.url, latest.url}
55
56
  BODY
56
57
  end
57
58
 
58
- def latest
59
- @latest ||= @site.posts.docs.last
59
+ def latest_title
60
+ latest.title
60
61
  end
61
62
 
62
- def latest_title
63
- latest.data['title']
63
+ def latest
64
+ site.latest
64
65
  end
65
66
 
66
67
  def configure!
@@ -91,9 +92,9 @@ module JekyllRecker
91
92
  def post!
92
93
  message_body = ::Slack::Notifier::Util::LinkFormatter.format(post_body)
93
94
  workspaces.each do |key, config|
94
- logger.info "posting to #{key} workspace"
95
+ info "posting to #{key} workspace"
95
96
  if @dry
96
- logger.info("BEGIN MESSAGE\n#{message_body.strip}\nEND MESSAGE")
97
+ puts "BEGIN MESSAGE\n#{message_body.strip}\nEND MESSAGE"
97
98
  else
98
99
  ::Slack::Notifier.new(
99
100
  @creds[key].strip,
@@ -139,8 +140,8 @@ module JekyllRecker
139
140
 
140
141
  def post!
141
142
  if dry?
142
- logger.info('tweeting in dry mode, printing message')
143
- logger.info("BEGIN TWEET\n#{post_body}END TWEET")
143
+ info('tweeting in dry mode, printing message')
144
+ puts "BEGIN TWEET\n#{post_body}END TWEET"
144
145
  else
145
146
  @client.update(post_body)
146
147
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module JekyllRecker
4
- VERSION = '2.2.0'
4
+ VERSION = '2.3.0'
5
5
  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: 2.2.0
4
+ version: 2.3.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-25 00:00:00.000000000 Z
11
+ date: 2020-07-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -37,7 +37,6 @@ files:
37
37
  - lib/jekyll_recker/entry.rb
38
38
  - lib/jekyll_recker/filters.rb
39
39
  - lib/jekyll_recker/generators.rb
40
- - lib/jekyll_recker/generators/image_resize.rb
41
40
  - lib/jekyll_recker/graphs.rb
42
41
  - lib/jekyll_recker/logging.rb
43
42
  - lib/jekyll_recker/math.rb
@@ -1,58 +0,0 @@
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