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.
- 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
|