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
data/lib/jekyll-recker/stats.rb
DELETED
@@ -1,109 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'date'
|
4
|
-
|
5
|
-
module Jekyll
|
6
|
-
module Recker
|
7
|
-
# Stats
|
8
|
-
module Stats
|
9
|
-
include Jekyll::Recker::LoggingMixin
|
10
|
-
|
11
|
-
def self.crunch(site)
|
12
|
-
stats = {}
|
13
|
-
BaseCruncher.descendants.each do |cruncher_class|
|
14
|
-
cruncher = cruncher_class.new(site)
|
15
|
-
logger.info "crunching stats.#{cruncher.stats_key}"
|
16
|
-
stats[cruncher.stats_key] = cruncher.crunch
|
17
|
-
end
|
18
|
-
stats
|
19
|
-
end
|
20
|
-
|
21
|
-
# Base Cruncher
|
22
|
-
class BaseCruncher
|
23
|
-
include Jekyll::Filters
|
24
|
-
include DescendantsMixin
|
25
|
-
|
26
|
-
def initialize(site)
|
27
|
-
@site = site
|
28
|
-
end
|
29
|
-
|
30
|
-
private
|
31
|
-
|
32
|
-
attr_reader :journal
|
33
|
-
|
34
|
-
def average(numlist)
|
35
|
-
calc = numlist.inject { |sum, el| sum + el }.to_f / numlist.size
|
36
|
-
calc.round
|
37
|
-
end
|
38
|
-
|
39
|
-
def total(numlist)
|
40
|
-
numlist.inject(0) { |sum, x| sum + x }
|
41
|
-
end
|
42
|
-
|
43
|
-
def entries
|
44
|
-
@site.posts.docs.select(&:published?)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
# PostCountCruncher
|
49
|
-
class PostCountCruncher < BaseCruncher
|
50
|
-
def stats_key
|
51
|
-
'posts'
|
52
|
-
end
|
53
|
-
|
54
|
-
def crunch
|
55
|
-
entries.count.pretty
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
# WordCountCruncher
|
60
|
-
class WordCountCruncher < BaseCruncher
|
61
|
-
def stats_key
|
62
|
-
'words'
|
63
|
-
end
|
64
|
-
|
65
|
-
def crunch
|
66
|
-
total_counts = entries.collect(&:content).map { |c| number_of_words(c) }
|
67
|
-
{
|
68
|
-
'average' => average(total_counts).pretty,
|
69
|
-
'total' => total(total_counts).pretty
|
70
|
-
}
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
# Streak Cruncher
|
75
|
-
class StreakCruncher < BaseCruncher
|
76
|
-
def stats_key
|
77
|
-
'days'
|
78
|
-
end
|
79
|
-
|
80
|
-
def crunch
|
81
|
-
streaks.take(1).map do |count, dates|
|
82
|
-
{
|
83
|
-
'days' => count.pretty,
|
84
|
-
'start' => dates[0],
|
85
|
-
'end' => dates[1]
|
86
|
-
}
|
87
|
-
end.first
|
88
|
-
end
|
89
|
-
|
90
|
-
private
|
91
|
-
|
92
|
-
def streaks
|
93
|
-
_streaks = []
|
94
|
-
entry_dates.slice_when do |prev, curr|
|
95
|
-
curr != prev - 1
|
96
|
-
end.each do |dates|
|
97
|
-
first, last = dates.minmax
|
98
|
-
_streaks << [(last - first).to_i, [first, last]]
|
99
|
-
end
|
100
|
-
_streaks
|
101
|
-
end
|
102
|
-
|
103
|
-
def entry_dates
|
104
|
-
entries.collect(&:date).map { |t| Date.new(t.year, t.month, t.day) }.sort.reverse
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
data/lib/jekyll-recker/tags.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Jekyll
|
4
|
-
module Recker
|
5
|
-
module Tags
|
6
|
-
# Version
|
7
|
-
class Version < Liquid::Tag
|
8
|
-
def render(_context)
|
9
|
-
VERSION
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
Liquid::Template.register_tag('recker_version', Jekyll::Recker::Tags::Version)
|
@@ -1,83 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'twitter'
|
4
|
-
|
5
|
-
module Jekyll
|
6
|
-
module Recker
|
7
|
-
# Twitter Client
|
8
|
-
class Twitter
|
9
|
-
include LoggingMixin
|
10
|
-
|
11
|
-
def initialize(dry: false)
|
12
|
-
@dry = dry
|
13
|
-
end
|
14
|
-
|
15
|
-
def discover_credentials!
|
16
|
-
@creds = extract_from_env || extract_from_config
|
17
|
-
raise ReckerError, 'cannot find twitter credentials!' if @creds.nil?
|
18
|
-
|
19
|
-
set_credentials!
|
20
|
-
end
|
21
|
-
|
22
|
-
def post_latest!
|
23
|
-
if @dry
|
24
|
-
logger.info('tweeting in dry mode, printing message')
|
25
|
-
logger.info("BEGIN TWEET\n#{tweet_body.strip}\nEND TWEET")
|
26
|
-
else
|
27
|
-
@client.update(tweet_body)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def latest
|
32
|
-
Configuration.latest_post
|
33
|
-
end
|
34
|
-
|
35
|
-
private
|
36
|
-
|
37
|
-
def tweet_body
|
38
|
-
url = File.join Configuration.jekyll['url'], latest.url
|
39
|
-
<<~TWEET
|
40
|
-
#{latest.data['date'].strftime('%A, %B %-d %Y')}
|
41
|
-
#{latest.data['title']}
|
42
|
-
#{url}
|
43
|
-
TWEET
|
44
|
-
end
|
45
|
-
|
46
|
-
def set_credentials!
|
47
|
-
@client ||= ::Twitter::REST::Client.new do |settings|
|
48
|
-
settings.consumer_key = @creds['consumer_api_key']
|
49
|
-
settings.consumer_secret = @creds['consumer_api_secret']
|
50
|
-
settings.access_token = @creds['access_token']
|
51
|
-
settings.access_token_secret = @creds['access_token_secret']
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def extract_from_env
|
56
|
-
values = cred_fieldnames.map { |k| ENV[k.upcase] }
|
57
|
-
|
58
|
-
return nil if values.any? { |v| v.nil? || v.empty? }
|
59
|
-
|
60
|
-
Hash[cred_fieldnames.zip(values)]
|
61
|
-
end
|
62
|
-
|
63
|
-
def extract_from_config
|
64
|
-
values = cred_fieldnames.map do |k|
|
65
|
-
Recker.shell(Configuration.twitter["#{k}_cmd"]).strip
|
66
|
-
end
|
67
|
-
|
68
|
-
return nil if values.any? { |v| v.nil? || v.empty? }
|
69
|
-
|
70
|
-
Hash[cred_fieldnames.zip(values)]
|
71
|
-
end
|
72
|
-
|
73
|
-
def cred_fieldnames
|
74
|
-
%w[
|
75
|
-
access_token_secret
|
76
|
-
access_token
|
77
|
-
consumer_api_key
|
78
|
-
consumer_api_secret
|
79
|
-
]
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
data/lib/jekyll-recker/words.rb
DELETED
@@ -1,82 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Jekyll
|
4
|
-
module Recker
|
5
|
-
# Words
|
6
|
-
module Words
|
7
|
-
def self.array_to_and_list(array)
|
8
|
-
case array.length
|
9
|
-
when 0
|
10
|
-
''
|
11
|
-
when 1
|
12
|
-
array.first
|
13
|
-
when 2
|
14
|
-
"#{array.first} and #{array.last}"
|
15
|
-
else
|
16
|
-
array[0...-1].join(', ') + ", and #{array.last}"
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.and_list_to_array(str)
|
21
|
-
str = str.gsub(' and ', ', ')
|
22
|
-
str.split(',').map(&:strip).reject(&:empty?)
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.prettify_number(number)
|
26
|
-
number.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse
|
27
|
-
end
|
28
|
-
|
29
|
-
def self.prettify_path(path, home = nil)
|
30
|
-
home ||= File.expand_path('~/')
|
31
|
-
path.sub(home, '~')
|
32
|
-
end
|
33
|
-
|
34
|
-
def self.to_word_list(str)
|
35
|
-
str.split(' ')
|
36
|
-
end
|
37
|
-
|
38
|
-
def self.to_weighted_list(arr)
|
39
|
-
arr.uniq.map do |word|
|
40
|
-
[word, arr.count(word)]
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
# Array extensions
|
48
|
-
class Array
|
49
|
-
def to_and_list
|
50
|
-
Jekyll::Recker::Words.array_to_and_list(self)
|
51
|
-
end
|
52
|
-
|
53
|
-
def to_weighted_list
|
54
|
-
Jekyll::Recker::Words.to_weighted_list(self)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
# Integer extensions
|
59
|
-
class Integer
|
60
|
-
def pretty
|
61
|
-
Jekyll::Recker::Words.prettify_number(self)
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
# String extensions
|
66
|
-
class String
|
67
|
-
def words
|
68
|
-
Jekyll::Recker::Words.to_word_list(self)
|
69
|
-
end
|
70
|
-
|
71
|
-
def word_count
|
72
|
-
Jekyll::Recker::Words.to_word_list(self).count
|
73
|
-
end
|
74
|
-
|
75
|
-
def pretty_path(home = nil)
|
76
|
-
Jekyll::Recker::Words.prettify_path(self, home)
|
77
|
-
end
|
78
|
-
|
79
|
-
def to_and_array
|
80
|
-
Jekyll::Recker::Words.and_list_to_array(self)
|
81
|
-
end
|
82
|
-
end
|