algoliasearch-jekyll 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.coveralls.yml +1 -0
- data/.travis.yml +11 -0
- data/Gemfile +4 -1
- data/README.md +8 -0
- data/Rakefile +2 -1
- data/VERSION +1 -1
- data/algoliasearch-jekyll.gemspec +129 -0
- data/lib/algoliasearch-jekyll.rb +13 -1
- data/lib/credential_checker.rb +74 -0
- data/lib/push.rb +52 -89
- data/lib/record_extractor.rb +1 -0
- data/scripts/check_flay +30 -0
- data/scripts/check_flog +31 -0
- data/scripts/git_hooks/pre-commit +2 -1
- data/scripts/git_hooks/pre-push +6 -1
- data/spec/credential_checker_spec.rb +116 -0
- data/spec/fixtures/_config.yml +9 -4
- data/spec/fixtures/_layouts/default.html +6 -0
- data/spec/fixtures/_posts/2015-07-03-test-post-again.md +7 -0
- data/spec/fixtures/_site/2015/07/02/test-post.html +26 -0
- data/spec/fixtures/_site/2015/07/03/test-post-again.html +3 -0
- data/spec/fixtures/_site/about.html +31 -0
- data/spec/fixtures/_site/assets/ring.png +0 -0
- data/spec/fixtures/_site/authors.html +1 -0
- data/spec/fixtures/_site/excluded.html +1 -0
- data/spec/fixtures/_site/hierarchy.html +31 -0
- data/spec/fixtures/_site/index.html +17 -0
- data/spec/fixtures/_site/my-collection/collection-item.html +2 -0
- data/spec/fixtures/_site/page2/index.html +40 -0
- data/spec/fixtures/_site/weight.html +15 -0
- data/spec/fixtures/index.html +13 -0
- data/spec/push_spec.rb +134 -113
- data/spec/record_extractor_spec.rb +10 -0
- data/spec/spec_helper.rb +21 -11
- data/spec/spec_helper_simplecov.rb +1 -1
- data/txt/api_key_missing +4 -0
- data/txt/application_id_missing +8 -0
- data/txt/index_name_missing +9 -0
- metadata +69 -5
- data/scripts/run_tests +0 -2
- data/scripts/update_gem +0 -10
data/spec/push_spec.rb
CHANGED
@@ -10,26 +10,23 @@ describe(AlgoliaSearchJekyllPush) do
|
|
10
10
|
let(:static_file) { site.file_by_name('ring.png') }
|
11
11
|
let(:document_file) { site.file_by_name('collection-item.md') }
|
12
12
|
let(:html_document_file) { site.file_by_name('collection-item.html') }
|
13
|
-
let(:
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
'algolia' => {
|
23
|
-
'application_id' => 'APPID',
|
24
|
-
'index_name' => 'INDEXNAME'
|
25
|
-
}
|
26
|
-
}
|
13
|
+
let(:pagination_page) { site.file_by_name('page2/index.html') }
|
14
|
+
let(:items) do
|
15
|
+
[{
|
16
|
+
name: 'foo',
|
17
|
+
url: '/foo'
|
18
|
+
}, {
|
19
|
+
name: 'bar',
|
20
|
+
url: '/bar'
|
21
|
+
}]
|
27
22
|
end
|
28
23
|
|
29
24
|
describe 'init_options' do
|
30
25
|
it 'sets options and config' do
|
31
26
|
# Given
|
32
27
|
args = nil
|
28
|
+
options = { 'foo' => 'bar' }
|
29
|
+
config = { 'bar' => 'foo' }
|
33
30
|
|
34
31
|
# When
|
35
32
|
push.init_options(args, options, config)
|
@@ -38,24 +35,9 @@ describe(AlgoliaSearchJekyllPush) do
|
|
38
35
|
expect(push.options).to include(options)
|
39
36
|
expect(push.config).to include(config)
|
40
37
|
end
|
41
|
-
|
42
|
-
it 'sets indexname from the commandline' do
|
43
|
-
# Given
|
44
|
-
args = ['newindex']
|
45
|
-
|
46
|
-
# When
|
47
|
-
push.init_options(args, options, config)
|
48
|
-
|
49
|
-
# Then
|
50
|
-
expect(push.config['algolia']['index_name']).to eq 'newindex'
|
51
|
-
end
|
52
38
|
end
|
53
39
|
|
54
40
|
describe 'indexable?' do
|
55
|
-
before(:each) do
|
56
|
-
push.init_options(nil, options, config)
|
57
|
-
end
|
58
|
-
|
59
41
|
it 'exclude StaticFiles' do
|
60
42
|
expect(push.indexable?(static_file)).to eq false
|
61
43
|
end
|
@@ -77,144 +59,183 @@ describe(AlgoliaSearchJekyllPush) do
|
|
77
59
|
end
|
78
60
|
|
79
61
|
it 'exclude file specified in config' do
|
80
|
-
# Given
|
81
|
-
config['algolia']['excluded_files'] = [
|
82
|
-
'excluded.html'
|
83
|
-
]
|
84
|
-
push.init_options(nil, options, config)
|
85
|
-
|
86
|
-
# Then
|
87
62
|
expect(push.indexable?(excluded_page_file)).to eq false
|
88
63
|
end
|
64
|
+
|
65
|
+
it 'does not index pagination pages' do
|
66
|
+
expect(push.indexable?(pagination_page)).to eq false
|
67
|
+
end
|
89
68
|
end
|
90
69
|
|
91
|
-
describe '
|
92
|
-
|
70
|
+
describe 'excluded_files?' do
|
71
|
+
before(:each) do
|
72
|
+
push.init_options(nil, {}, site.config)
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'should alway exclude pagination pages' do
|
76
|
+
expect(push.excluded_file?('page3/index.html')).to eq true
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'should exclude user specified strings' do
|
80
|
+
expect(push.excluded_file?('excluded.html')).to eq true
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe 'configure_index' do
|
85
|
+
it 'sets some sane defaults' do
|
93
86
|
# Given
|
94
|
-
push.init_options(nil,
|
87
|
+
push.init_options(nil, {}, {})
|
88
|
+
index = double
|
89
|
+
|
90
|
+
# Then
|
91
|
+
expected = {
|
92
|
+
attributeForDistinct: 'title',
|
93
|
+
distinct: true,
|
94
|
+
customRanking: ['desc(posted_at)', 'desc(weight)']
|
95
|
+
}
|
96
|
+
expect(index).to receive(:set_settings).with(hash_including(expected))
|
95
97
|
|
96
98
|
# When
|
97
|
-
|
99
|
+
push.configure_index(index)
|
98
100
|
end
|
99
101
|
|
100
|
-
it '
|
102
|
+
it 'allow user to override all settings' do
|
101
103
|
# Given
|
102
|
-
|
103
|
-
|
104
|
+
settings = {
|
105
|
+
distinct: false,
|
106
|
+
customSetting: 'foo',
|
107
|
+
customRanking: ['asc(foo)', 'desc(bar)']
|
108
|
+
}
|
109
|
+
config = {
|
110
|
+
'algolia' => {
|
111
|
+
'settings' => settings
|
112
|
+
}
|
113
|
+
}
|
114
|
+
push.init_options(nil, {}, config)
|
115
|
+
index = double
|
116
|
+
|
117
|
+
# Then
|
118
|
+
expect(index).to receive(:set_settings).with(hash_including(settings))
|
104
119
|
|
105
120
|
# When
|
106
|
-
|
121
|
+
push.configure_index(index)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
describe 'jekyll_new' do
|
126
|
+
it 'should return a patched version of site with a custom write' do
|
127
|
+
# Given
|
128
|
+
normal_site = Jekyll::Site.new(Jekyll.configuration)
|
129
|
+
normal_method = normal_site.method(:write).source_location
|
130
|
+
|
131
|
+
patched_site = get_site({}, mock_write_method: false, process: false)
|
132
|
+
patched_method = patched_site.method(:write).source_location
|
107
133
|
|
134
|
+
# When
|
108
135
|
# Then
|
109
|
-
expect(
|
136
|
+
expect(patched_method).not_to eq normal_method
|
110
137
|
end
|
138
|
+
end
|
111
139
|
|
112
|
-
|
140
|
+
describe 'process' do
|
141
|
+
it 'should call the site write method' do
|
113
142
|
# Given
|
114
|
-
|
115
|
-
push.init_options(nil, options, config)
|
143
|
+
site = get_site({}, process: false)
|
116
144
|
|
117
145
|
# When
|
118
|
-
|
146
|
+
site.process
|
119
147
|
|
120
148
|
# Then
|
121
|
-
expect(
|
149
|
+
expect(site).to have_received(:write)
|
122
150
|
end
|
123
151
|
|
124
|
-
it '
|
152
|
+
it 'should push items to Algolia' do
|
125
153
|
# Given
|
126
|
-
|
127
|
-
|
128
|
-
|
154
|
+
site = get_site({}, mock_write_method: false, process: false)
|
155
|
+
# Keep only page_file
|
156
|
+
allow(AlgoliaSearchJekyllPush).to receive(:indexable?) do |file|
|
157
|
+
file.path == page_file.path
|
158
|
+
end
|
159
|
+
allow(AlgoliaSearchJekyllPush).to receive(:push)
|
129
160
|
|
130
161
|
# When
|
131
|
-
|
162
|
+
site.process
|
132
163
|
|
133
164
|
# Then
|
134
|
-
expect(
|
165
|
+
expect(AlgoliaSearchJekyllPush).to have_received(:push) do |arg|
|
166
|
+
expect(arg.size).to eq 6
|
167
|
+
end
|
135
168
|
end
|
136
169
|
end
|
137
170
|
|
138
|
-
describe '
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
'
|
143
|
-
|
171
|
+
describe 'push' do
|
172
|
+
let(:index_double) { double('Algolia Index').as_null_object }
|
173
|
+
let(:config) do
|
174
|
+
{
|
175
|
+
'algolia' => {
|
176
|
+
'index_name' => 'INDEXNAME'
|
177
|
+
}
|
144
178
|
}
|
145
|
-
|
179
|
+
end
|
146
180
|
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
181
|
+
before(:each) do
|
182
|
+
push.init_options(nil, {}, config)
|
183
|
+
# Mock all calls to not send anything
|
184
|
+
allow_any_instance_of(AlgoliaSearchCredentialChecker)
|
185
|
+
.to receive(:assert_valid)
|
186
|
+
allow(Algolia).to receive(:init)
|
187
|
+
allow(Algolia).to receive(:move_index)
|
188
|
+
allow(Algolia::Index).to receive(:new).and_return(index_double)
|
189
|
+
allow(Jekyll.logger).to receive(:info)
|
151
190
|
end
|
152
191
|
|
153
|
-
it 'should
|
192
|
+
it 'should create a temporary index' do
|
154
193
|
# Given
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
}
|
159
|
-
stub_const('ENV', 'ALGOLIA_API_KEY' => 'APIKEY_FROM_ENV')
|
160
|
-
push.init_options(nil, options, config)
|
194
|
+
|
195
|
+
# When
|
196
|
+
push.push(items)
|
161
197
|
|
162
198
|
# Then
|
163
|
-
expect(
|
164
|
-
expect(Jekyll.logger).to receive(:warn).at_least(:once)
|
165
|
-
expect(-> { push.check_credentials }).to raise_error SystemExit
|
199
|
+
expect(Algolia::Index).to have_received(:new).with('INDEXNAME_tmp')
|
166
200
|
end
|
167
201
|
|
168
|
-
it 'should
|
202
|
+
it 'should add elements to the temporary index' do
|
169
203
|
# Given
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
}
|
174
|
-
stub_const('ENV', 'ALGOLIA_API_KEY' => 'APIKEY_FROM_ENV')
|
175
|
-
push.init_options(nil, options, config)
|
204
|
+
|
205
|
+
# When
|
206
|
+
push.push(items)
|
176
207
|
|
177
208
|
# Then
|
178
|
-
expect(
|
179
|
-
expect(Jekyll.logger).to receive(:warn).at_least(:once)
|
180
|
-
expect(-> { push.check_credentials }).to raise_error SystemExit
|
209
|
+
expect(index_double).to have_received(:add_objects!)
|
181
210
|
end
|
182
|
-
end
|
183
211
|
|
184
|
-
|
185
|
-
it 'sets some sane defaults' do
|
212
|
+
it 'should move the temporary index as the main one' do
|
186
213
|
# Given
|
187
|
-
push.init_options(nil, options, config)
|
188
|
-
index = double
|
189
|
-
|
190
|
-
# Then
|
191
|
-
expected = {
|
192
|
-
attributeForDistinct: 'title',
|
193
|
-
distinct: true,
|
194
|
-
customRanking: ['desc(posted_at)', 'desc(weight)']
|
195
|
-
}
|
196
|
-
expect(index).to receive(:set_settings).with(hash_including(expected))
|
197
214
|
|
198
215
|
# When
|
199
|
-
push.
|
216
|
+
push.push(items)
|
217
|
+
|
218
|
+
# Then
|
219
|
+
expect(Algolia).to have_received(:move_index)
|
220
|
+
.with('INDEXNAME_tmp', 'INDEXNAME')
|
200
221
|
end
|
201
222
|
|
202
|
-
it '
|
223
|
+
it 'should display the number of elements indexed' do
|
203
224
|
# Given
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
customRanking: ['asc(foo)', 'desc(bar)']
|
208
|
-
}
|
209
|
-
config['algolia']['settings'] = settings
|
210
|
-
push.init_options(nil, options, config)
|
211
|
-
index = double
|
225
|
+
|
226
|
+
# When
|
227
|
+
push.push(items)
|
212
228
|
|
213
229
|
# Then
|
214
|
-
expect(
|
230
|
+
expect(Jekyll.logger).to have_received(:info).with(/of 2 items/i)
|
231
|
+
end
|
215
232
|
|
216
|
-
|
217
|
-
|
233
|
+
it 'should display an error if `add_objects!` failed' do
|
234
|
+
# Given
|
235
|
+
allow(index_double).to receive(:add_objects!).and_raise
|
236
|
+
|
237
|
+
expect(Jekyll.logger).to receive(:error)
|
238
|
+
expect(-> { push.push(items) }).to raise_error SystemExit
|
218
239
|
end
|
219
240
|
end
|
220
241
|
end
|
@@ -36,6 +36,16 @@ describe(AlgoliaSearchRecordExtractor) do
|
|
36
36
|
expect(actual[:custom]).to eq 'Foo'
|
37
37
|
end
|
38
38
|
|
39
|
+
it 'gets posted_at timestamp based on the configured timezone' do
|
40
|
+
# Given
|
41
|
+
site = get_site(timezone: 'America/New_York')
|
42
|
+
post_file = extractor.new(site.file_by_name('test-post.md'))
|
43
|
+
actual = post_file.metadata
|
44
|
+
|
45
|
+
# Then
|
46
|
+
expect(actual[:posted_at]).to eq 1_435_809_600
|
47
|
+
end
|
48
|
+
|
39
49
|
it 'gets metadata from document' do
|
40
50
|
# Given
|
41
51
|
actual = document_file.metadata
|
data/spec/spec_helper.rb
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
if ENV['TRAVIS']
|
2
|
+
require 'coveralls'
|
3
|
+
Coveralls.wear!
|
4
|
+
end
|
5
|
+
|
1
6
|
require 'awesome_print'
|
2
7
|
require_relative './spec_helper_jekyll.rb'
|
3
8
|
require_relative './spec_helper_simplecov.rb'
|
@@ -7,27 +12,32 @@ RSpec.configure do |config|
|
|
7
12
|
config.filter_run(focus: true)
|
8
13
|
config.run_all_when_everything_filtered = true
|
9
14
|
|
10
|
-
#
|
11
|
-
def get_site(config = {})
|
15
|
+
# Create a Jekyll::Site instance, patched with a `file_by_name` method
|
16
|
+
def get_site(config = {}, options = {})
|
17
|
+
default_options = {
|
18
|
+
mock_write_method: true,
|
19
|
+
process: true
|
20
|
+
}
|
21
|
+
options = default_options.merge(options)
|
22
|
+
|
12
23
|
config = config.merge(
|
13
24
|
source: File.expand_path('./spec/fixtures')
|
14
25
|
)
|
15
26
|
config = Jekyll.configuration(config)
|
16
|
-
site = Jekyll::Site.new(config)
|
17
27
|
|
18
|
-
|
19
|
-
|
20
|
-
|
28
|
+
site = AlgoliaSearchJekyllPush.init_options({}, options, config)
|
29
|
+
.jekyll_new(config)
|
30
|
+
|
31
|
+
def site.file_by_name(file_name)
|
21
32
|
each_site_file do |file|
|
22
|
-
|
33
|
+
return file if file.path =~ /#{file_name}$/
|
23
34
|
end
|
35
|
+
nil
|
24
36
|
end
|
25
37
|
|
26
|
-
|
27
|
-
@__files.find { |path, _| path =~ /#{file_name}$/ }[1]
|
28
|
-
end
|
38
|
+
allow(site).to receive(:write) if options[:mock_write_method]
|
29
39
|
|
30
|
-
site.process
|
40
|
+
site.process if options[:process]
|
31
41
|
site
|
32
42
|
end
|
33
43
|
end
|
data/txt/api_key_missing
ADDED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: algoliasearch-jekyll
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Carry
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-07-
|
11
|
+
date: 2015-07-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: algoliasearch
|
@@ -66,6 +66,48 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '1.6'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: coveralls
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0.8'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0.8'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: flay
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '2.6'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '2.6'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: flog
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '4.3'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '4.3'
|
69
111
|
- !ruby/object:Gem::Dependency
|
70
112
|
name: guard-rspec
|
71
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -159,37 +201,59 @@ extra_rdoc_files:
|
|
159
201
|
- LICENSE.txt
|
160
202
|
- README.md
|
161
203
|
files:
|
204
|
+
- ".coveralls.yml"
|
162
205
|
- ".rspec"
|
163
206
|
- ".rubocop.yml"
|
207
|
+
- ".travis.yml"
|
164
208
|
- Gemfile
|
165
209
|
- Guardfile
|
166
210
|
- LICENSE.txt
|
167
211
|
- README.md
|
168
212
|
- Rakefile
|
169
213
|
- VERSION
|
214
|
+
- algoliasearch-jekyll.gemspec
|
170
215
|
- lib/algoliasearch-jekyll.rb
|
216
|
+
- lib/credential_checker.rb
|
171
217
|
- lib/push.rb
|
172
218
|
- lib/record_extractor.rb
|
219
|
+
- scripts/check_flay
|
220
|
+
- scripts/check_flog
|
173
221
|
- scripts/git_hooks/pre-commit
|
174
222
|
- scripts/git_hooks/pre-push
|
175
|
-
-
|
176
|
-
- scripts/update_gem
|
223
|
+
- spec/credential_checker_spec.rb
|
177
224
|
- spec/fixtures/_config.yml
|
225
|
+
- spec/fixtures/_layouts/default.html
|
178
226
|
- spec/fixtures/_my-collection/collection-item.html
|
179
227
|
- spec/fixtures/_my-collection/collection-item.md
|
180
228
|
- spec/fixtures/_posts/2015-07-02-test-post.md
|
229
|
+
- spec/fixtures/_posts/2015-07-03-test-post-again.md
|
230
|
+
- spec/fixtures/_site/2015/07/02/test-post.html
|
231
|
+
- spec/fixtures/_site/2015/07/03/test-post-again.html
|
232
|
+
- spec/fixtures/_site/about.html
|
233
|
+
- spec/fixtures/_site/assets/ring.png
|
234
|
+
- spec/fixtures/_site/authors.html
|
235
|
+
- spec/fixtures/_site/excluded.html
|
236
|
+
- spec/fixtures/_site/hierarchy.html
|
237
|
+
- spec/fixtures/_site/index.html
|
238
|
+
- spec/fixtures/_site/my-collection/collection-item.html
|
239
|
+
- spec/fixtures/_site/page2/index.html
|
240
|
+
- spec/fixtures/_site/weight.html
|
181
241
|
- spec/fixtures/about.md
|
182
242
|
- spec/fixtures/api_key_dir/_algolia_api_key
|
183
243
|
- spec/fixtures/assets/ring.png
|
184
244
|
- spec/fixtures/authors.html
|
185
245
|
- spec/fixtures/excluded.html
|
186
246
|
- spec/fixtures/hierarchy.md
|
247
|
+
- spec/fixtures/index.html
|
187
248
|
- spec/fixtures/weight.md
|
188
249
|
- spec/push_spec.rb
|
189
250
|
- spec/record_extractor_spec.rb
|
190
251
|
- spec/spec_helper.rb
|
191
252
|
- spec/spec_helper_jekyll.rb
|
192
253
|
- spec/spec_helper_simplecov.rb
|
254
|
+
- txt/api_key_missing
|
255
|
+
- txt/application_id_missing
|
256
|
+
- txt/index_name_missing
|
193
257
|
homepage: https://github.com/algolia/algoliasearch-jekyll
|
194
258
|
licenses:
|
195
259
|
- MIT
|
@@ -210,7 +274,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
210
274
|
version: '0'
|
211
275
|
requirements: []
|
212
276
|
rubyforge_project:
|
213
|
-
rubygems_version: 2.4.
|
277
|
+
rubygems_version: 2.4.8
|
214
278
|
signing_key:
|
215
279
|
specification_version: 4
|
216
280
|
summary: AlgoliaSearch for Jekyll
|