jekyll_all_collections 0.3.6 → 0.4.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/.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)
|