jekyll_all_collections 0.3.6 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +19 -1
- data/CHANGELOG.md +34 -8
- data/README.md +208 -105
- data/jekyll_all_collections.gemspec +11 -14
- data/lib/hooks/a_page.rb +69 -0
- data/lib/hooks/all_collections_hooks.rb +59 -0
- data/lib/hooks/all_files.rb +46 -0
- data/lib/hooks/class_methods.rb +50 -0
- data/lib/jekyll_all_collections/version.rb +1 -1
- data/lib/jekyll_all_collections.rb +14 -2
- data/lib/tag/all_collections_tag.rb +158 -0
- data/lib/util/mslinn_binary_search.rb +152 -0
- data/lib/util/send_chain.rb +58 -0
- data/spec/all_collections_tag/all_collections_tag_sort_spec.rb +1 -0
- data/spec/bsearch_spec.rb +50 -0
- data/spec/date_sort_spec.rb +8 -6
- data/spec/mslinn_binary_search_spec.rb +47 -0
- data/spec/send_chain_spec.rb +72 -0
- data/spec/send_spec.rb +28 -0
- data/spec/sorted_lru_files_spec.rb +82 -0
- data/spec/spec_helper.rb +1 -3
- data/spec/status_persistence.txt +32 -22
- data/spec/testable_spec.rb +38 -0
- metadata +33 -11
- data/lib/all_collections_hooks.rb +0 -118
- data/lib/all_collections_tag.rb +0 -139
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
# Ruby's binary search is unsuitable because ordering requirements are not stable.
|
4
|
+
# the value to be searched for changes the required ordering
|
5
|
+
|
6
|
+
RSpec.describe(Array) do
|
7
|
+
before { skip('Never gonna give you up/Never gonna let you down') }
|
8
|
+
|
9
|
+
sorted_ints = [0, 4, 7, 10, 12]
|
10
|
+
sorted_strings = %w[aaa aab aac bbb bbc bbd ccc ccd cce].sort.reverse
|
11
|
+
|
12
|
+
it 'returns index of first int match' do
|
13
|
+
actual = sorted_ints.bsearch_index { |x| x >= 4 }
|
14
|
+
expect(actual).to eq(1)
|
15
|
+
|
16
|
+
actual = sorted_ints.bsearch_index { |x| x >= 6 }
|
17
|
+
expect(actual).to eq(2)
|
18
|
+
|
19
|
+
actual = sorted_ints.bsearch_index { |x| x >= -1 }
|
20
|
+
expect(actual).to eq(0)
|
21
|
+
|
22
|
+
actual = sorted_ints.bsearch_index { |x| x >= 100 }
|
23
|
+
expect(actual).to be_nil
|
24
|
+
end
|
25
|
+
|
26
|
+
# See https://stackoverflow.com/q/79333097/553865
|
27
|
+
it 'returns index of first string match' do
|
28
|
+
puts(sorted_strings.map { |x| x.start_with? 'a' })
|
29
|
+
index = sorted_strings.bsearch_index { |x| x.start_with? 'a' }
|
30
|
+
expect(sorted_strings[index]).to eq('aac')
|
31
|
+
|
32
|
+
index = sorted_strings.bsearch_index { |x| x.start_with? 'aa' }
|
33
|
+
expect(sorted_strings[index]).to eq('aac')
|
34
|
+
|
35
|
+
index = sorted_strings.bsearch_index { |x| x.start_with? 'aaa' }
|
36
|
+
expect(sorted_strings[index]).to eq('aaa')
|
37
|
+
|
38
|
+
index = sorted_strings.bsearch_index { |x| x.start_with? 'b' }
|
39
|
+
expect(sorted_strings[index]).to eq('bbd')
|
40
|
+
|
41
|
+
index = sorted_strings.bsearch_index { |x| x.start_with? 'bb' }
|
42
|
+
expect(sorted_strings[index]).to eq('bbd')
|
43
|
+
|
44
|
+
index = sorted_strings.bsearch_index { |x| x.start_with? 'bbc' }
|
45
|
+
expect(sorted_strings[index]).to eq('bbc')
|
46
|
+
|
47
|
+
index = sorted_strings.bsearch_index { |x| x.start_with? 'cc' }
|
48
|
+
expect(sorted_strings[index]).to eq('cce')
|
49
|
+
end
|
50
|
+
end
|
data/spec/date_sort_spec.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require_relative '../lib/jekyll_all_collections'
|
3
|
+
|
4
|
+
# Verifies how data comparisons work
|
2
5
|
|
3
|
-
# See https://stackoverflow.com/a/75377832/553865
|
4
6
|
class Obj
|
5
7
|
# `last_modified` is primary sort key
|
6
8
|
# `date` (when specified) is secondary sort key
|
@@ -12,11 +14,11 @@ class Obj
|
|
12
14
|
end
|
13
15
|
end
|
14
16
|
|
15
|
-
RSpec.describe(Obj) do
|
16
|
-
let(:o1) {
|
17
|
-
let(:o2) {
|
18
|
-
let(:o3) {
|
19
|
-
let(:o4) {
|
17
|
+
RSpec.describe(Obj) do
|
18
|
+
let(:o1) { described_class.new('2000-01-01', '2001-01-01') }
|
19
|
+
let(:o2) { described_class.new('2010-01-01', '2001-01-01') }
|
20
|
+
let(:o3) { described_class.new('2010-01-01', '2011-01-01') }
|
21
|
+
let(:o4) { described_class.new('2020-01-01', '2011-01-01') }
|
20
22
|
let(:objs) { [o1, o2, o3, o4] }
|
21
23
|
|
22
24
|
# See https://ruby-doc.org/3.2.0/Comparable.html
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require_relative '../lib/hooks/all_files'
|
3
|
+
|
4
|
+
def build_msbs(sorted_strings)
|
5
|
+
sorted_strings.each do |string|
|
6
|
+
$msbs.insert LruFile.new(string.reverse, "Page #{string}") # { |x| x.url.start_with? string }
|
7
|
+
end
|
8
|
+
$msbs.enable_search
|
9
|
+
end
|
10
|
+
|
11
|
+
RSpec.describe(MSlinnBinarySearch) do
|
12
|
+
$msbs = described_class.new [:url, %i[start_with? placeholder]]
|
13
|
+
build_msbs %w[aaa.html baa.html caa.html bbb.html cbb.html dbb.html ccc.html ccd.html cce.html]
|
14
|
+
|
15
|
+
it 'handles an empty search string by returning the index of the first item (0)' do
|
16
|
+
index = $msbs.find_index '' # { |x| x.url.start_with? '' }
|
17
|
+
expect(index).to be_zero
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'returns the index of the first partial match' do
|
21
|
+
index = $msbs.find_index 'a.html' # { |x| x.url.start_with? 'a.html' }
|
22
|
+
expect(index).to eq(0)
|
23
|
+
|
24
|
+
index = $msbs.find_index 'baa.html' # { |x| x.url.start_with? 'baa.html' }
|
25
|
+
expect(index).to eq(1)
|
26
|
+
|
27
|
+
index = $msbs.find_index 'c.html' # { |x| x.url.start_with? 'c.html' }
|
28
|
+
expect(index).to eq(6)
|
29
|
+
|
30
|
+
index = $msbs.find_index 'cce.html' # { |x| x.url.start_with? 'cce.html' }
|
31
|
+
expect(index).to eq(8)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'returns the item of the first match' do
|
35
|
+
item = $msbs.find 'a.html' # { |x| x.url.start_with? 'a.html' }
|
36
|
+
expect(item.url.reverse).to eq('aaa.html')
|
37
|
+
|
38
|
+
item = $msbs.find 'baa.html' # { |x| x.url.start_with? 'baa.html' }
|
39
|
+
expect(item.url.reverse).to eq('baa.html')
|
40
|
+
|
41
|
+
item = $msbs.find 'c.html' # { |x| x.url.start_with? 'c.html' }
|
42
|
+
expect(item.url.reverse).to eq('ccc.html')
|
43
|
+
|
44
|
+
item = $msbs.find 'cce.html' # { |x| x.url.start_with? 'cce.html' }
|
45
|
+
expect(item.url.reverse).to eq('cce.html')
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require_relative '../lib/util/send_chain'
|
3
|
+
|
4
|
+
unless defined? LruFile
|
5
|
+
LruFile = Struct.new(:url, :page) do
|
6
|
+
include SendChain
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
RSpec.describe(LruFile) do
|
11
|
+
lru_file = described_class.new 'abc', 'def'
|
12
|
+
|
13
|
+
it 'can perform a simple call if no arguments are required' do
|
14
|
+
# Equivalent to: lru_file.url.reverse
|
15
|
+
actual = lru_file.send_chain %i[url reverse]
|
16
|
+
expect(actual).to eq('cba')
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'can accept a scalar argument in stages' do
|
20
|
+
lru_file.new_chain [:url, %i[end_with? placeholder]]
|
21
|
+
# Equivalent to: lru_file.url.end_with?('bc')
|
22
|
+
substituted_chain = lru_file.substitute_chain_with 'bc'
|
23
|
+
actual = lru_file.send_chain substituted_chain
|
24
|
+
expect(actual).to be true
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'can accept a vector argument in stages' do
|
28
|
+
lru_file.new_chain [:url, %i[end_with? placeholder]]
|
29
|
+
# Next 2 lines are equivalent to: lru_file.url.end_with?('bc')
|
30
|
+
substituted_chain = lru_file.substitute_chain_with ['bc']
|
31
|
+
actual = lru_file.send_chain substituted_chain
|
32
|
+
expect(actual).to be true
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'can accept a scalar argument in one stage' do
|
36
|
+
lru_file.new_chain [:url, %i[end_with? placeholder]]
|
37
|
+
# Equivalent to: lru_file.url.end_with?('bc')
|
38
|
+
actual = lru_file.substitute_and_send_chain_with 'bc'
|
39
|
+
expect(actual).to be true
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'can accept an array argument in one stage' do
|
43
|
+
lru_file.new_chain [:url, %i[end_with? placeholder]]
|
44
|
+
# Equivalent to: lru_file.url.end_with?('bc')
|
45
|
+
actual = lru_file.substitute_and_send_chain_with ['bc']
|
46
|
+
expect(actual).to be true
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'can use the evaluate_with alias' do
|
50
|
+
lru_file.new_chain [:url, %i[end_with? placeholder]]
|
51
|
+
# Equivalent to: lru_file.url.end_with?('bc')
|
52
|
+
actual = lru_file.evaluate_with ['bc']
|
53
|
+
expect(actual).to be true
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'can reuse the chain with different values' do
|
57
|
+
lru_file.new_chain [:url, %i[end_with? placeholder]]
|
58
|
+
|
59
|
+
# Equivalent to: lru_file.url.end_with?('bc')
|
60
|
+
actual = lru_file.substitute_and_send_chain_with 'bc'
|
61
|
+
expect(actual).to be true
|
62
|
+
|
63
|
+
# Equivalent to: lru_file.url.end_with?('abc')
|
64
|
+
substituted_chain = lru_file.substitute_chain_with ['abc']
|
65
|
+
actual = lru_file.send_chain substituted_chain
|
66
|
+
expect(actual).to be true
|
67
|
+
|
68
|
+
# Equivalent to: lru_file.url.end_with?('de')
|
69
|
+
actual = lru_file.substitute_and_send_chain_with 'de'
|
70
|
+
expect(actual).to be false
|
71
|
+
end
|
72
|
+
end
|
data/spec/send_spec.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
# Exploring how to set date attributes in an object
|
4
|
+
|
5
|
+
class Obj
|
6
|
+
# `last_modified` is primary sort key
|
7
|
+
# `date` (when specified) is secondary sort key
|
8
|
+
attr_reader :date, :last_modified
|
9
|
+
|
10
|
+
def initialize(param1, param2)
|
11
|
+
@last_modified = Date.parse(param1)
|
12
|
+
@date = Date.parse(param2)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
RSpec.describe(Obj) do
|
17
|
+
let(:obj) { described_class.new('2000-01-01', '2001-01-01') }
|
18
|
+
|
19
|
+
it 'can send date' do
|
20
|
+
date = obj.send :date
|
21
|
+
expect(obj.date).to eq(date)
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'can send last_modified' do
|
25
|
+
last_modified = obj.send :last_modified
|
26
|
+
expect(obj.last_modified).to eq(last_modified)
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require_relative '../lib/hooks/all_files'
|
3
|
+
|
4
|
+
RSpec.describe(SortedLruFiles) do
|
5
|
+
expected1 = 'first-page.html'
|
6
|
+
expected2 = 'second-page.html'
|
7
|
+
expected3 = 'third-page.html'
|
8
|
+
|
9
|
+
it 'can read back an inserted item' do
|
10
|
+
sorted_files = described_class.new
|
11
|
+
sorted_files.insert(expected1, "https://mslinn.com/#{expected1}") # insert reverses expected1
|
12
|
+
sorted_files.enable_search
|
13
|
+
|
14
|
+
actual = sorted_files.select expected1
|
15
|
+
expect(actual.length).to eq(1)
|
16
|
+
expect(actual.first&.reverse&.start_with?(expected1.reverse)).to be true
|
17
|
+
|
18
|
+
actual = sorted_files.select expected1[5..]
|
19
|
+
expect(actual.length).to eq(1)
|
20
|
+
expect(actual.first&.reverse&.start_with?(expected1[5..].reverse)).to be true
|
21
|
+
|
22
|
+
actual = sorted_files.select 'should_not_match'
|
23
|
+
expect(actual).to be_empty
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'works with 2 items and one match' do
|
27
|
+
sorted_files = described_class.new
|
28
|
+
sorted_files.insert(expected1, "https://mslinn.com/#{expected1}") # insert reverses expected1
|
29
|
+
sorted_files.insert(expected2, "https://mslinn.com/#{expected2}")
|
30
|
+
sorted_files.enable_search
|
31
|
+
|
32
|
+
expect(sorted_files.msbs.array[0].url).to be <= sorted_files.msbs.array[1].url
|
33
|
+
|
34
|
+
actual = sorted_files.select expected1
|
35
|
+
expect(actual.length).to eq(1)
|
36
|
+
expect(actual.first&.end_with?(expected1)).to be true
|
37
|
+
|
38
|
+
actual = sorted_files.select expected2
|
39
|
+
expect(actual.length).to eq(1)
|
40
|
+
expect(actual.first&.end_with?(expected2)).to be true
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'handles multiple matches' do
|
44
|
+
sorted_files = described_class.new
|
45
|
+
sorted_files.insert(expected1, "https://mslinn.com/#{expected1}") # insert reverses expected1
|
46
|
+
sorted_files.insert(expected2, "https://mslinn.com/#{expected2}")
|
47
|
+
sorted_files.enable_search
|
48
|
+
|
49
|
+
expected = '.html'
|
50
|
+
actual = sorted_files.select expected
|
51
|
+
expect(actual.length).to eq(2)
|
52
|
+
expect(actual.first&.end_with?(expected)).to be true
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'works with 3 items' do
|
56
|
+
sorted_files = described_class.new
|
57
|
+
sorted_files.insert(expected1, "https://mslinn.com/#{expected1}") # insert reverses expected1
|
58
|
+
sorted_files.insert(expected2, "https://mslinn.com/#{expected2}")
|
59
|
+
sorted_files.insert(expected3, "https://mslinn.com/#{expected3}")
|
60
|
+
sorted_files.enable_search
|
61
|
+
|
62
|
+
expect(sorted_files.msbs.array[0].url).to be <= sorted_files.msbs.array[1].url
|
63
|
+
expect(sorted_files.msbs.array[1].url).to be <= sorted_files.msbs.array[2].url
|
64
|
+
|
65
|
+
actual = sorted_files.select expected1
|
66
|
+
expect(actual.length).to eq(1)
|
67
|
+
expect(actual.first&.end_with?(expected1)).to be true
|
68
|
+
|
69
|
+
actual = sorted_files.select expected2
|
70
|
+
expect(actual.length).to eq(1)
|
71
|
+
expect(actual.first&.end_with?(expected2)).to be true
|
72
|
+
|
73
|
+
actual = sorted_files.select expected3
|
74
|
+
expect(actual.length).to eq(1)
|
75
|
+
expect(actual.first&.end_with?(expected3)).to be true
|
76
|
+
|
77
|
+
expected = '.html'
|
78
|
+
actual = sorted_files.select expected
|
79
|
+
expect(actual.length).to eq(3)
|
80
|
+
expect(actual.first&.end_with?(expected)).to be true
|
81
|
+
end
|
82
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
require 'jekyll'
|
2
2
|
require 'date'
|
3
3
|
|
4
|
-
require_relative '../lib/jekyll_all_collections'
|
5
|
-
|
6
4
|
Jekyll.logger.log_level = :info
|
7
5
|
|
8
6
|
RSpec.configure do |config|
|
@@ -10,5 +8,5 @@ RSpec.configure do |config|
|
|
10
8
|
config.filter_run_when_matching focus: true
|
11
9
|
|
12
10
|
# See https://relishapp.com/rspec/rspec-core/docs/command-line/only-failures
|
13
|
-
config.example_status_persistence_file_path = 'spec/status_persistence.txt'
|
11
|
+
config.example_status_persistence_file_path = '../spec/status_persistence.txt'
|
14
12
|
end
|
data/spec/status_persistence.txt
CHANGED
@@ -1,22 +1,32 @@
|
|
1
|
-
example_id
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
1
|
+
example_id | status | run_time |
|
2
|
+
------------------------------------------------------------------------------------------- | ------- | --------------- |
|
3
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/bsearch_spec.rb[1:1] | pending | 0.00041 seconds |
|
4
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/bsearch_spec.rb[1:2] | pending | 0.00005 seconds |
|
5
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/date_sort_spec.rb[1:1] | passed | 0.00135 seconds |
|
6
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/date_sort_spec.rb[1:2] | passed | 0.00012 seconds |
|
7
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/date_sort_spec.rb[1:3] | passed | 0.00036 seconds |
|
8
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/date_sort_spec.rb[1:4] | passed | 0.00149 seconds |
|
9
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/date_sort_spec.rb[1:5] | passed | 0.00016 seconds |
|
10
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/date_sort_spec.rb[1:6] | passed | 0.00046 seconds |
|
11
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/date_sort_spec.rb[1:7] | passed | 0.00075 seconds |
|
12
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/date_sort_spec.rb[1:8] | passed | 0.00056 seconds |
|
13
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/date_sort_spec.rb[1:9] | passed | 0.00029 seconds |
|
14
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/date_sort_spec.rb[1:10] | passed | 0.00015 seconds |
|
15
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/mslinn_binary_search_spec.rb[1:1] | passed | 0.00274 seconds |
|
16
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/mslinn_binary_search_spec.rb[1:2] | passed | 0.0001 seconds |
|
17
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/mslinn_binary_search_spec.rb[1:3] | passed | 0.00022 seconds |
|
18
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/send_chain_spec.rb[1:1] | passed | 0.00022 seconds |
|
19
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/send_chain_spec.rb[1:2] | passed | 0.00126 seconds |
|
20
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/send_chain_spec.rb[1:3] | passed | 0.00004 seconds |
|
21
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/send_chain_spec.rb[1:4] | passed | 0.00093 seconds |
|
22
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/send_chain_spec.rb[1:5] | passed | 0.0001 seconds |
|
23
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/send_chain_spec.rb[1:6] | passed | 0.00003 seconds |
|
24
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/send_chain_spec.rb[1:7] | passed | 0.00026 seconds |
|
25
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/send_spec.rb[1:1] | passed | 0.00038 seconds |
|
26
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/send_spec.rb[1:2] | passed | 0.00007 seconds |
|
27
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/sorted_lru_files_spec.rb[1:1] | passed | 0.00139 seconds |
|
28
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/sorted_lru_files_spec.rb[1:2] | passed | 0.00044 seconds |
|
29
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/sorted_lru_files_spec.rb[1:3] | passed | 0.0001 seconds |
|
30
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/sorted_lru_files_spec.rb[1:4] | passed | 0.00057 seconds |
|
31
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/testable_spec.rb[1:1] | passed | 0.00027 seconds |
|
32
|
+
/mnt/f/work/jekyll/my_plugins/jekyll_all_collections/spec/testable_spec.rb[2:1] | passed | 0.00171 seconds |
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
# Exploring how to invoke methods from classes and modules
|
4
|
+
# See https://mslinn.com/jekyll/10700-designing-for-testability.html
|
5
|
+
|
6
|
+
module TestModule
|
7
|
+
def a_method
|
8
|
+
'a_method says Hi!'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class TestClass
|
13
|
+
extend TestModule # Defines class methods
|
14
|
+
|
15
|
+
def initialize(param1, param2)
|
16
|
+
super()
|
17
|
+
@param1 = param1
|
18
|
+
@param2 = param2
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
RSpec.describe(TestModule) do
|
23
|
+
extend described_class
|
24
|
+
|
25
|
+
it 'Invokes a_method from module' do
|
26
|
+
result = self.class.a_method
|
27
|
+
expect(result).to eq('a_method says Hi!')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
RSpec.describe(TestClass) do
|
32
|
+
let(:o1) { described_class.new('value1', 'value2') }
|
33
|
+
|
34
|
+
it 'Invokes a_method from class' do
|
35
|
+
result = o1.class.a_method
|
36
|
+
expect(result).to eq('a_method says Hi!')
|
37
|
+
end
|
38
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll_all_collections
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Slinn
|
8
|
-
|
9
|
-
bindir: exe
|
8
|
+
bindir: bin
|
10
9
|
cert_chain: []
|
11
|
-
date:
|
10
|
+
date: 2025-02-07 00:00:00.000000000 Z
|
12
11
|
dependencies:
|
13
12
|
- !ruby/object:Gem::Dependency
|
14
13
|
name: jekyll
|
@@ -52,7 +51,21 @@ dependencies:
|
|
52
51
|
- - ">="
|
53
52
|
- !ruby/object:Gem::Version
|
54
53
|
version: '0'
|
55
|
-
|
54
|
+
- !ruby/object:Gem::Dependency
|
55
|
+
name: sorted_set
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
type: :runtime
|
62
|
+
prerelease: false
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
description: 'Provides normalized collections and extra functionality for Jekyll websites.
|
56
69
|
|
57
70
|
'
|
58
71
|
email:
|
@@ -67,14 +80,25 @@ files:
|
|
67
80
|
- README.md
|
68
81
|
- Rakefile
|
69
82
|
- jekyll_all_collections.gemspec
|
70
|
-
- lib/
|
71
|
-
- lib/
|
83
|
+
- lib/hooks/a_page.rb
|
84
|
+
- lib/hooks/all_collections_hooks.rb
|
85
|
+
- lib/hooks/all_files.rb
|
86
|
+
- lib/hooks/class_methods.rb
|
72
87
|
- lib/jekyll_all_collections.rb
|
73
88
|
- lib/jekyll_all_collections/version.rb
|
89
|
+
- lib/tag/all_collections_tag.rb
|
90
|
+
- lib/util/mslinn_binary_search.rb
|
91
|
+
- lib/util/send_chain.rb
|
74
92
|
- spec/all_collections_tag/all_collections_tag_sort_spec.rb
|
93
|
+
- spec/bsearch_spec.rb
|
75
94
|
- spec/date_sort_spec.rb
|
95
|
+
- spec/mslinn_binary_search_spec.rb
|
96
|
+
- spec/send_chain_spec.rb
|
97
|
+
- spec/send_spec.rb
|
98
|
+
- spec/sorted_lru_files_spec.rb
|
76
99
|
- spec/spec_helper.rb
|
77
100
|
- spec/status_persistence.txt
|
101
|
+
- spec/testable_spec.rb
|
78
102
|
homepage: https://www.mslinn.com/jekyll_plugins/jekyll_all_collections.html
|
79
103
|
licenses:
|
80
104
|
- MIT
|
@@ -84,7 +108,6 @@ metadata:
|
|
84
108
|
changelog_uri: https://github.com/mslinn/jekyll_all_collections/CHANGELOG.md
|
85
109
|
homepage_uri: https://www.mslinn.com/jekyll_plugins/jekyll_all_collections.html
|
86
110
|
source_code_uri: https://github.com/mslinn/jekyll_all_collections
|
87
|
-
post_install_message:
|
88
111
|
rdoc_options: []
|
89
112
|
require_paths:
|
90
113
|
- lib
|
@@ -99,8 +122,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
99
122
|
- !ruby/object:Gem::Version
|
100
123
|
version: '0'
|
101
124
|
requirements: []
|
102
|
-
rubygems_version: 3.
|
103
|
-
signing_key:
|
125
|
+
rubygems_version: 3.6.3
|
104
126
|
specification_version: 4
|
105
|
-
summary: Provides
|
127
|
+
summary: Provides normalized collections and extra functionality for Jekyll websites.
|
106
128
|
test_files: []
|
@@ -1,118 +0,0 @@
|
|
1
|
-
require 'jekyll'
|
2
|
-
require 'jekyll_plugin_logger'
|
3
|
-
require_relative 'jekyll_all_collections/version'
|
4
|
-
|
5
|
-
# Creates an array of `APage` called site.all_collections, which will be available from :site, :pre_render onwards
|
6
|
-
module AllCollectionsHooks
|
7
|
-
@logger = PluginMetaLogger.instance.new_logger(self, PluginMetaLogger.instance.config)
|
8
|
-
|
9
|
-
# No, all_collections is not defined for this hook
|
10
|
-
# Jekyll::Hooks.register(:site, :after_init, priority: :normal) do |site|
|
11
|
-
# defined = AllCollectionsHooks.all_collections_defined?(site)
|
12
|
-
# @logger.debug { "Jekyll::Hooks.register(:site, :after_init: #{defined}" }
|
13
|
-
# end
|
14
|
-
|
15
|
-
# Creates a `Array[APage]` property called site.all_collections if it does not already exist
|
16
|
-
# Each `APage` entry is one document or page.
|
17
|
-
Jekyll::Hooks.register(:site, :post_read, priority: :normal) do |site|
|
18
|
-
defined = AllCollectionsHooks.all_collections_defined?(site)
|
19
|
-
@logger.debug { "Jekyll::Hooks.register(:site, :post_read, :normal: #{defined}" }
|
20
|
-
AllCollectionsHooks.compute(site) unless site.class.method_defined? :all_collections
|
21
|
-
end
|
22
|
-
|
23
|
-
# Yes, all_collections is defined for this hook
|
24
|
-
# Jekyll::Hooks.register(:site, :post_read, priority: :low) do |site|
|
25
|
-
# defined = AllCollectionsHooks.all_collections_defined?(site)
|
26
|
-
# @logger.debug { "Jekyll::Hooks.register(:site, :post_read, :low: #{defined}" }
|
27
|
-
# end
|
28
|
-
|
29
|
-
# Yes, all_collections is defined for this hook
|
30
|
-
# Jekyll::Hooks.register(:site, :post_read, priority: :normal) do |site|
|
31
|
-
# defined = AllCollectionsHooks.all_collections_defined?(site)
|
32
|
-
# @logger.debug { "Jekyll::Hooks.register(:site, :post_read, :normal: #{defined}" }
|
33
|
-
# end
|
34
|
-
|
35
|
-
# Yes, all_collections is defined for this hook
|
36
|
-
# Jekyll::Hooks.register(:site, :pre_render, priority: :normal) do |site, _payload|
|
37
|
-
# defined = AllCollectionsHooks.all_collections_defined?(site)
|
38
|
-
# @logger.debug { "Jekyll::Hooks.register(:site, :pre_render: #{defined}" }
|
39
|
-
# end
|
40
|
-
|
41
|
-
def self.compute(site)
|
42
|
-
objects = site.collections
|
43
|
-
.values
|
44
|
-
.map { |x| x.class.method_defined?(:docs) ? x.docs : x }
|
45
|
-
.flatten
|
46
|
-
|
47
|
-
site.class.module_eval { attr_accessor :all_collections }
|
48
|
-
apages = AllCollectionsHooks.apages_from_objects(objects)
|
49
|
-
site.all_collections = apages
|
50
|
-
end
|
51
|
-
|
52
|
-
@sort_by = ->(apages, criteria) { [apages.sort(criteria)] }
|
53
|
-
|
54
|
-
# The collection value is just the collection label, not the entire collection object
|
55
|
-
def self.apages_from_objects(objects)
|
56
|
-
pages = []
|
57
|
-
objects.each do |object|
|
58
|
-
page = APage.new(object)
|
59
|
-
pages << page unless page.data['exclude_from_all']
|
60
|
-
end
|
61
|
-
pages
|
62
|
-
end
|
63
|
-
|
64
|
-
def self.all_collections_defined?(site)
|
65
|
-
"site.all_collections #{site.class.method_defined?(:all_collections) ? 'IS' : 'IS NOT'} defined"
|
66
|
-
end
|
67
|
-
|
68
|
-
class APage
|
69
|
-
attr_reader :content, :data, :date, :description, :destination, :draft, :excerpt, :ext, :extname,
|
70
|
-
:label, :last_modified, :layout, :path, :relative_path, :tags, :title, :type, :url
|
71
|
-
|
72
|
-
# Verify each property exists before accessing it; this helps write tests
|
73
|
-
def initialize(obj) # rubocop:disable Metrics/AbcSize
|
74
|
-
@data = obj.data if obj.respond_to? :data
|
75
|
-
|
76
|
-
@categories = @data['categories'] if @data.key? 'categories'
|
77
|
-
@content = obj.content if obj.respond_to? :content
|
78
|
-
@date = (@data['date'].to_date if @data&.key?('date')) || Date.today
|
79
|
-
@description = @data['description'] if @data.key? 'description'
|
80
|
-
|
81
|
-
# TODO: What _config.yml setting should be passed to destination()?
|
82
|
-
@destination = obj.destination('') if obj.respond_to? :destination
|
83
|
-
|
84
|
-
@draft = Jekyll::Draft.draft?(obj)
|
85
|
-
@excerpt = @data['excerpt'] if @data.key? 'excerpt'
|
86
|
-
@ext = obj.extname
|
87
|
-
@ext ||= @data['ext'] if @data.key? 'ext'
|
88
|
-
@extname = @ext # For compatibility with previous versions of all_collections
|
89
|
-
@label = obj.collection.label if obj&.collection.respond_to? :label
|
90
|
-
@last_modified = @data['last_modified'] || @data['last_modified_at'] || @date
|
91
|
-
@last_modified_field = case @data
|
92
|
-
when @data.key?('last_modified')
|
93
|
-
'last_modified'
|
94
|
-
when @data.key?('last_modified_at')
|
95
|
-
'last_modified_at'
|
96
|
-
end
|
97
|
-
@layout = @data['layout'] if @data.key? 'layout'
|
98
|
-
@path = obj.path if obj.respond_to? :path
|
99
|
-
@relative_path = obj.relative_path if obj.respond_to? :relative_path
|
100
|
-
@tags = @data['tags'] if @data.key? 'tags'
|
101
|
-
@title = @data['title'] if @data.key? 'title'
|
102
|
-
@type = obj.type if obj.respond_to? :type
|
103
|
-
@url = obj.url
|
104
|
-
end
|
105
|
-
|
106
|
-
def to_s
|
107
|
-
return @label if @label
|
108
|
-
|
109
|
-
@date.to_s
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
PluginMetaLogger.instance.logger.info do
|
114
|
-
"Loaded AllCollectionsHooks v#{JekyllAllCollectionsVersion::VERSION} :site, :pre_render, :normal hook plugin."
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
Liquid::Template.register_filter(AllCollectionsHooks)
|