algoliasearch-jekyll 0.6.0 → 0.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CONTRIBUTING.md +3 -0
- data/Gemfile +2 -0
- data/Guardfile +4 -14
- data/README.md +1 -0
- data/algoliasearch-jekyll.gemspec +15 -4
- data/gemfiles/jekyll_v2.gemfile +2 -1
- data/gemfiles/jekyll_v3.gemfile +2 -1
- data/lib/credential_checker.rb +6 -16
- data/lib/error_handler.rb +87 -0
- data/lib/push.rb +21 -3
- data/lib/version.rb +1 -1
- data/scripts/coverage +3 -0
- data/scripts/test_ci +1 -1
- data/scripts/test_v2 +1 -1
- data/scripts/test_v3 +1 -1
- data/scripts/watch +1 -1
- data/scripts/watch_v2 +1 -1
- data/scripts/watch_v3 +1 -1
- data/spec/credential_checker_spec.rb +11 -7
- data/spec/error_handler_spec.rb +150 -0
- data/spec/push_spec.rb +60 -1
- data/spec/spec_helper.rb +1 -0
- data/txt/check_key_acl_to_tmp_index +9 -0
- data/txt/sample +4 -0
- metadata +35 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc842f3c5823b8a809ffcd12e6d520f15eeefc60
|
4
|
+
data.tar.gz: 3fbfef0340971043048d1e0d71b439a50727e451
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8b80bcd9875ac15f96fa76a1f2cb676c6b4a38d98be4c30936710f5ffb9e6c9d843ecf9f2af6ee1b2af56cc77afa3c54b9eb8ce0f814ec1392f0df89de5067ae
|
7
|
+
data.tar.gz: 70dc1b288661933a38f5b4845d073985d74f5e7f6dc947799af2c85f2afbdebbad6c9fa732b0c3f5a7538f6f596c8338368aba55982384cd83a78eec8fcb8385
|
data/CONTRIBUTING.md
CHANGED
@@ -34,6 +34,9 @@ I suggest updating the website `Gemfile` to point to the correct local directory
|
|
34
34
|
```ruby
|
35
35
|
gem "algoliasearch-jekyll", :path => "/path/to/local/gem/folder"
|
36
36
|
```
|
37
|
+
You should also run `rake gemspec` from the `algoliasearch-jekyll` repository if
|
38
|
+
you added new files or dependencies.
|
39
|
+
|
37
40
|
|
38
41
|
If you plan on submitting a PR, I suggest you install the git hooks. This will
|
39
42
|
run pre-commit and pre-push checks. Those checks will also be run by TravisCI,
|
data/Gemfile
CHANGED
@@ -3,8 +3,10 @@ source 'http://rubygems.org'
|
|
3
3
|
gem 'algoliasearch', '~> 1.4'
|
4
4
|
gem 'appraisal', '~> 2.1.0'
|
5
5
|
gem 'awesome_print', '~> 1.6'
|
6
|
+
gem 'jekyll', '~> 2.5'
|
6
7
|
gem 'json', '~> 1.8'
|
7
8
|
gem 'nokogiri', '~> 1.6'
|
9
|
+
gem 'verbal_expressions', '~> 0.1.5'
|
8
10
|
|
9
11
|
group :development do
|
10
12
|
gem 'coveralls', '~> 0.8'
|
data/Guardfile
CHANGED
@@ -1,17 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
watch('spec/spec_helper.rb') { 'spec' }
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
group :jekyll_v2 do
|
10
|
-
guard :rspec, cmd: 'appraisal jekyll-v2 bundle exec rspec --color --format documentation' do
|
11
|
-
watch(%r{^spec/.+_spec\.rb$})
|
12
|
-
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
13
|
-
watch('spec/spec_helper.rb') { 'spec' }
|
14
|
-
end
|
1
|
+
guard :rspec, cmd: 'bundle exec rspec --color --format documentation' do
|
2
|
+
watch(%r{^spec/.+_spec\.rb$})
|
3
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
4
|
+
watch('spec/spec_helper.rb') { 'spec' }
|
15
5
|
end
|
16
6
|
|
17
7
|
notification :off
|
data/README.md
CHANGED
@@ -4,6 +4,7 @@
|
|
4
4
|
[![Build Status][2]](https://travis-ci.org/algolia/algoliasearch-jekyll)
|
5
5
|
[![Coverage Status][3]](https://coveralls.io/github/algolia/algoliasearch-jekyll?branch=master)
|
6
6
|
[![Code Climate][4]](https://codeclimate.com/github/algolia/algoliasearch-jekyll)
|
7
|
+
![Jekyll >= 2.5](https://img.shields.io/badge/jekyll-%3E%3D%202.5-green.svg)
|
7
8
|
|
8
9
|
Jekyll plugin to automatically index your Jekyll posts and pages into an
|
9
10
|
Algolia index by simply running `jekyll algolia push`.
|
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: algoliasearch-jekyll 0.6.
|
5
|
+
# stub: algoliasearch-jekyll 0.6.1 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "algoliasearch-jekyll"
|
9
|
-
s.version = "0.6.
|
9
|
+
s.version = "0.6.1"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
13
|
s.authors = ["Tim Carry"]
|
14
|
-
s.date = "2016-01-
|
14
|
+
s.date = "2016-01-13"
|
15
15
|
s.description = "Index all your pages and posts to an Algolia index with `jekyll algolia push`"
|
16
16
|
s.email = "tim@pixelastic.com"
|
17
17
|
s.extra_rdoc_files = [
|
@@ -36,12 +36,14 @@ Gem::Specification.new do |s|
|
|
36
36
|
"gemfiles/jekyll_v3.gemfile",
|
37
37
|
"lib/algoliasearch-jekyll.rb",
|
38
38
|
"lib/credential_checker.rb",
|
39
|
+
"lib/error_handler.rb",
|
39
40
|
"lib/push.rb",
|
40
41
|
"lib/record_extractor.rb",
|
41
42
|
"lib/version.rb",
|
42
43
|
"scripts/bump_version",
|
43
44
|
"scripts/check_flay",
|
44
45
|
"scripts/check_flog",
|
46
|
+
"scripts/coverage",
|
45
47
|
"scripts/git_hooks/pre-commit",
|
46
48
|
"scripts/git_hooks/pre-push",
|
47
49
|
"scripts/release",
|
@@ -53,6 +55,7 @@ Gem::Specification.new do |s|
|
|
53
55
|
"scripts/watch_v2",
|
54
56
|
"scripts/watch_v3",
|
55
57
|
"spec/credential_checker_spec.rb",
|
58
|
+
"spec/error_handler_spec.rb",
|
56
59
|
"spec/fixtures/jekyll_version_2/_config.yml",
|
57
60
|
"spec/fixtures/jekyll_version_2/_layouts/default.html",
|
58
61
|
"spec/fixtures/jekyll_version_2/_my-collection/collection-item.html",
|
@@ -89,7 +92,9 @@ Gem::Specification.new do |s|
|
|
89
92
|
"spec/spec_helper_simplecov.rb",
|
90
93
|
"txt/api_key_missing",
|
91
94
|
"txt/application_id_missing",
|
92
|
-
"txt/
|
95
|
+
"txt/check_key_acl_to_tmp_index",
|
96
|
+
"txt/index_name_missing",
|
97
|
+
"txt/sample"
|
93
98
|
]
|
94
99
|
s.homepage = "https://github.com/algolia/algoliasearch-jekyll"
|
95
100
|
s.licenses = ["MIT"]
|
@@ -103,8 +108,10 @@ Gem::Specification.new do |s|
|
|
103
108
|
s.add_runtime_dependency(%q<algoliasearch>, ["~> 1.4"])
|
104
109
|
s.add_runtime_dependency(%q<appraisal>, ["~> 2.1.0"])
|
105
110
|
s.add_runtime_dependency(%q<awesome_print>, ["~> 1.6"])
|
111
|
+
s.add_runtime_dependency(%q<jekyll>, ["~> 2.5"])
|
106
112
|
s.add_runtime_dependency(%q<json>, ["~> 1.8"])
|
107
113
|
s.add_runtime_dependency(%q<nokogiri>, ["~> 1.6"])
|
114
|
+
s.add_runtime_dependency(%q<verbal_expressions>, ["~> 0.1.5"])
|
108
115
|
s.add_development_dependency(%q<coveralls>, ["~> 0.8"])
|
109
116
|
s.add_development_dependency(%q<flay>, ["~> 2.6"])
|
110
117
|
s.add_development_dependency(%q<flog>, ["~> 4.3"])
|
@@ -117,8 +124,10 @@ Gem::Specification.new do |s|
|
|
117
124
|
s.add_dependency(%q<algoliasearch>, ["~> 1.4"])
|
118
125
|
s.add_dependency(%q<appraisal>, ["~> 2.1.0"])
|
119
126
|
s.add_dependency(%q<awesome_print>, ["~> 1.6"])
|
127
|
+
s.add_dependency(%q<jekyll>, ["~> 2.5"])
|
120
128
|
s.add_dependency(%q<json>, ["~> 1.8"])
|
121
129
|
s.add_dependency(%q<nokogiri>, ["~> 1.6"])
|
130
|
+
s.add_dependency(%q<verbal_expressions>, ["~> 0.1.5"])
|
122
131
|
s.add_dependency(%q<coveralls>, ["~> 0.8"])
|
123
132
|
s.add_dependency(%q<flay>, ["~> 2.6"])
|
124
133
|
s.add_dependency(%q<flog>, ["~> 4.3"])
|
@@ -132,8 +141,10 @@ Gem::Specification.new do |s|
|
|
132
141
|
s.add_dependency(%q<algoliasearch>, ["~> 1.4"])
|
133
142
|
s.add_dependency(%q<appraisal>, ["~> 2.1.0"])
|
134
143
|
s.add_dependency(%q<awesome_print>, ["~> 1.6"])
|
144
|
+
s.add_dependency(%q<jekyll>, ["~> 2.5"])
|
135
145
|
s.add_dependency(%q<json>, ["~> 1.8"])
|
136
146
|
s.add_dependency(%q<nokogiri>, ["~> 1.6"])
|
147
|
+
s.add_dependency(%q<verbal_expressions>, ["~> 0.1.5"])
|
137
148
|
s.add_dependency(%q<coveralls>, ["~> 0.8"])
|
138
149
|
s.add_dependency(%q<flay>, ["~> 2.6"])
|
139
150
|
s.add_dependency(%q<flog>, ["~> 4.3"])
|
data/gemfiles/jekyll_v2.gemfile
CHANGED
@@ -5,9 +5,10 @@ source "http://rubygems.org"
|
|
5
5
|
gem "algoliasearch", "~> 1.4"
|
6
6
|
gem "appraisal", "~> 2.1.0"
|
7
7
|
gem "awesome_print", "~> 1.6"
|
8
|
+
gem "jekyll", "~> 2.5"
|
8
9
|
gem "json", "~> 1.8"
|
9
10
|
gem "nokogiri", "~> 1.6"
|
10
|
-
gem "
|
11
|
+
gem "verbal_expressions", "~> 0.1.5"
|
11
12
|
|
12
13
|
group :development do
|
13
14
|
gem "coveralls", "~> 0.8"
|
data/gemfiles/jekyll_v3.gemfile
CHANGED
@@ -5,9 +5,10 @@ source "http://rubygems.org"
|
|
5
5
|
gem "algoliasearch", "~> 1.4"
|
6
6
|
gem "appraisal", "~> 2.1.0"
|
7
7
|
gem "awesome_print", "~> 1.6"
|
8
|
+
gem "jekyll", "~> 3.0"
|
8
9
|
gem "json", "~> 1.8"
|
9
10
|
gem "nokogiri", "~> 1.6"
|
10
|
-
gem "
|
11
|
+
gem "verbal_expressions", "~> 0.1.5"
|
11
12
|
gem "jekyll-paginate", "~> 1.1.0"
|
12
13
|
|
13
14
|
group :development do
|
data/lib/credential_checker.rb
CHANGED
@@ -1,13 +1,15 @@
|
|
1
1
|
require 'algoliasearch'
|
2
2
|
require 'nokogiri'
|
3
3
|
require 'json'
|
4
|
+
require_relative './error_handler.rb'
|
4
5
|
|
5
6
|
# Given an HTML file as input, will return an array of records to index
|
6
7
|
class AlgoliaSearchCredentialChecker
|
7
|
-
attr_accessor :config
|
8
|
+
attr_accessor :config, :logger
|
8
9
|
|
9
10
|
def initialize(config)
|
10
11
|
@config = config
|
12
|
+
@logger = AlgoliaSearchErrorHandler.new
|
11
13
|
end
|
12
14
|
|
13
15
|
# Read the API key either from ENV or from an _algolia_api_key file in
|
@@ -24,36 +26,24 @@ class AlgoliaSearchCredentialChecker
|
|
24
26
|
nil
|
25
27
|
end
|
26
28
|
|
27
|
-
def display_error(file)
|
28
|
-
file = File.expand_path(File.join(File.dirname(__FILE__), '../txt', file))
|
29
|
-
content = File.open(file).readlines.map(&:chomp)
|
30
|
-
content.each_with_index do |line, index|
|
31
|
-
if index == 0
|
32
|
-
Jekyll.logger.error line
|
33
|
-
next
|
34
|
-
end
|
35
|
-
Jekyll.logger.warn line
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
29
|
# Check that the API key is available
|
40
30
|
def check_api_key
|
41
31
|
return if api_key
|
42
|
-
|
32
|
+
@logger.display('api_key_missing')
|
43
33
|
exit 1
|
44
34
|
end
|
45
35
|
|
46
36
|
# Check that the application id is defined
|
47
37
|
def check_application_id
|
48
38
|
return if @config['algolia'] && @config['algolia']['application_id']
|
49
|
-
|
39
|
+
@logger.display('application_id_missing')
|
50
40
|
exit 1
|
51
41
|
end
|
52
42
|
|
53
43
|
# Check that the index name is defined
|
54
44
|
def check_index_name
|
55
45
|
return if @config['algolia'] && @config['algolia']['index_name']
|
56
|
-
|
46
|
+
@logger.display('index_name_missing')
|
57
47
|
exit 1
|
58
48
|
end
|
59
49
|
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'verbal_expressions'
|
3
|
+
|
4
|
+
# Helps in displaying useful error messages to users, to help them debug their
|
5
|
+
# issues
|
6
|
+
class AlgoliaSearchErrorHandler
|
7
|
+
# Will output the specified error file.
|
8
|
+
# First line is displayed as error, next ones as warning
|
9
|
+
def display(file)
|
10
|
+
file = File.expand_path(File.join(File.dirname(__FILE__), '../txt', file))
|
11
|
+
content = File.open(file).readlines.map(&:chomp)
|
12
|
+
content.each_with_index do |line, index|
|
13
|
+
if index == 0
|
14
|
+
Jekyll.logger.error line
|
15
|
+
next
|
16
|
+
end
|
17
|
+
Jekyll.logger.warn line
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def error_tester
|
22
|
+
# Ex: Cannot PUT to https://appid.algolia.net/1/indexes/index_name/settings:
|
23
|
+
# {"message":"Invalid Application-ID or API key","status":403} (403)
|
24
|
+
VerEx.new do
|
25
|
+
find 'Cannot '
|
26
|
+
capture('verb') { word }
|
27
|
+
find ' to '
|
28
|
+
capture('scheme') { word }
|
29
|
+
find '://'
|
30
|
+
capture('app_id') { word }
|
31
|
+
anything_but '/'
|
32
|
+
find '/'
|
33
|
+
capture('api_version') { digit }
|
34
|
+
find '/'
|
35
|
+
capture('api_section') { word }
|
36
|
+
find '/'
|
37
|
+
capture('index_name') { word }
|
38
|
+
find '/'
|
39
|
+
capture('api_action') { word }
|
40
|
+
find ': '
|
41
|
+
capture('json') do
|
42
|
+
find '{'
|
43
|
+
anything_but('}')
|
44
|
+
find '}'
|
45
|
+
end
|
46
|
+
find ' ('
|
47
|
+
capture('http_error') { word }
|
48
|
+
find ')'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def parse_algolia_error(error)
|
53
|
+
error.gsub!("\n", '')
|
54
|
+
|
55
|
+
tester = error_tester
|
56
|
+
matches = tester.match(error)
|
57
|
+
|
58
|
+
return false unless matches
|
59
|
+
|
60
|
+
hash = {}
|
61
|
+
matches.names.each do |match|
|
62
|
+
hash[match] = matches[match]
|
63
|
+
end
|
64
|
+
|
65
|
+
# Cast integers
|
66
|
+
hash['api_version'] = hash['api_version'].to_i
|
67
|
+
hash['http_error'] = hash['http_error'].to_i
|
68
|
+
|
69
|
+
# Parse JSON
|
70
|
+
hash['json'] = JSON.parse(hash['json'])
|
71
|
+
|
72
|
+
hash
|
73
|
+
end
|
74
|
+
|
75
|
+
# Given an Algolia API error message, will return the best error message
|
76
|
+
def readable_algolia_error(error)
|
77
|
+
error = parse_algolia_error(error)
|
78
|
+
return false unless error
|
79
|
+
|
80
|
+
# Given API key does not have rights on the _tmp index
|
81
|
+
if error['http_error'] == 403 && error['index_name'] =~ /_tmp$/
|
82
|
+
return 'check_key_acl_to_tmp_index'
|
83
|
+
end
|
84
|
+
|
85
|
+
false
|
86
|
+
end
|
87
|
+
end
|
data/lib/push.rb
CHANGED
@@ -4,6 +4,7 @@ require 'json'
|
|
4
4
|
require_relative './version'
|
5
5
|
require_relative './record_extractor'
|
6
6
|
require_relative './credential_checker'
|
7
|
+
require_relative './error_handler'
|
7
8
|
|
8
9
|
# `jekyll algolia push` command
|
9
10
|
class AlgoliaSearchJekyllPush < Jekyll::Command
|
@@ -126,7 +127,25 @@ class AlgoliaSearchJekyllPush < Jekyll::Command
|
|
126
127
|
end
|
127
128
|
end
|
128
129
|
|
129
|
-
|
130
|
+
begin
|
131
|
+
index.set_settings(settings)
|
132
|
+
rescue StandardError => error
|
133
|
+
display_error(error)
|
134
|
+
exit 1
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
# Display the error in a human-friendly way if possible
|
139
|
+
def display_error(error)
|
140
|
+
error_handler = AlgoliaSearchErrorHandler.new
|
141
|
+
readable_error = error_handler.readable_algolia_error(error.message)
|
142
|
+
|
143
|
+
if readable_error
|
144
|
+
error_handler.display(readable_error)
|
145
|
+
else
|
146
|
+
Jekyll.logger.error 'Algolia Error: HTTP Error'
|
147
|
+
Jekyll.logger.warn error.message
|
148
|
+
end
|
130
149
|
end
|
131
150
|
|
132
151
|
# Change the User-Agent header to isolate calls from this plugin
|
@@ -150,8 +169,7 @@ class AlgoliaSearchJekyllPush < Jekyll::Command
|
|
150
169
|
begin
|
151
170
|
index.add_objects!(batch) unless @is_dry_run
|
152
171
|
rescue StandardError => error
|
153
|
-
|
154
|
-
Jekyll.logger.warn error.message
|
172
|
+
display_error(error)
|
155
173
|
exit 1
|
156
174
|
end
|
157
175
|
end
|
data/lib/version.rb
CHANGED
data/scripts/coverage
ADDED
data/scripts/test_ci
CHANGED
data/scripts/test_v2
CHANGED
data/scripts/test_v3
CHANGED
data/scripts/watch
CHANGED
data/scripts/watch_v2
CHANGED
data/scripts/watch_v3
CHANGED
@@ -60,14 +60,16 @@ describe(AlgoliaSearchCredentialChecker) do
|
|
60
60
|
end
|
61
61
|
|
62
62
|
describe 'assert_valid' do
|
63
|
+
before(:each) do
|
64
|
+
allow(checker.logger).to receive(:display)
|
65
|
+
end
|
63
66
|
it 'should display error if no api key' do
|
64
67
|
# Given
|
65
|
-
allow(checker).to receive(:api_key)
|
68
|
+
allow(checker).to receive(:api_key).and_return nil
|
66
69
|
|
67
70
|
# Then
|
68
|
-
expect(Jekyll.logger).to receive(:error).with(/api key/i)
|
69
|
-
expect(Jekyll.logger).to receive(:warn).at_least(:once)
|
70
71
|
expect(-> { checker.assert_valid }).to raise_error SystemExit
|
72
|
+
expect(checker.logger).to have_received(:display).with('api_key_missing')
|
71
73
|
end
|
72
74
|
|
73
75
|
it 'should display error if no application id' do
|
@@ -79,9 +81,10 @@ describe(AlgoliaSearchCredentialChecker) do
|
|
79
81
|
stub_const('ENV', 'ALGOLIA_API_KEY' => 'APIKEY_FROM_ENV')
|
80
82
|
|
81
83
|
# Then
|
82
|
-
expect(Jekyll.logger).to receive(:error).with(/application id/i)
|
83
|
-
expect(Jekyll.logger).to receive(:warn).at_least(:once)
|
84
84
|
expect(-> { checker.assert_valid }).to raise_error SystemExit
|
85
|
+
expect(checker.logger)
|
86
|
+
.to have_received(:display)
|
87
|
+
.with('application_id_missing')
|
85
88
|
end
|
86
89
|
|
87
90
|
it 'should display error if no index name' do
|
@@ -93,9 +96,10 @@ describe(AlgoliaSearchCredentialChecker) do
|
|
93
96
|
stub_const('ENV', 'ALGOLIA_API_KEY' => 'APIKEY_FROM_ENV')
|
94
97
|
|
95
98
|
# Then
|
96
|
-
expect(Jekyll.logger).to receive(:error).with(/index name/i)
|
97
|
-
expect(Jekyll.logger).to receive(:warn).at_least(:once)
|
98
99
|
expect(-> { checker.assert_valid }).to raise_error SystemExit
|
100
|
+
expect(checker.logger)
|
101
|
+
.to have_received(:display)
|
102
|
+
.with('index_name_missing')
|
99
103
|
end
|
100
104
|
|
101
105
|
it 'should init the Algolia client' do
|
@@ -0,0 +1,150 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe(AlgoliaSearchErrorHandler) do
|
4
|
+
before(:each) do
|
5
|
+
@error_handler = AlgoliaSearchErrorHandler.new
|
6
|
+
end
|
7
|
+
|
8
|
+
describe 'display' do
|
9
|
+
before(:each) do
|
10
|
+
allow(Jekyll.logger).to receive(:error)
|
11
|
+
allow(Jekyll.logger).to receive(:warn)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should display first line as error' do
|
15
|
+
# Given
|
16
|
+
input = 'sample'
|
17
|
+
|
18
|
+
# When
|
19
|
+
@error_handler.display(input)
|
20
|
+
|
21
|
+
# Then
|
22
|
+
expect(Jekyll.logger).to have_received(:error).exactly(1).times
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should display all other lines as warnings' do
|
26
|
+
# Given
|
27
|
+
input = 'sample'
|
28
|
+
|
29
|
+
# When
|
30
|
+
@error_handler.display(input)
|
31
|
+
|
32
|
+
# Then
|
33
|
+
expect(Jekyll.logger).to have_received(:warn).exactly(3).times
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe 'parse_algolia_error' do
|
38
|
+
before(:each) do
|
39
|
+
@algolia_error = 'Cannot PUT to ' \
|
40
|
+
'https://appid.algolia.net/1/indexes/index_name/settings: ' \
|
41
|
+
'{"message":"Invalid Application-ID or API key","status":403} (403)'
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should extract all the url parts' do
|
45
|
+
# Given
|
46
|
+
input = @algolia_error
|
47
|
+
|
48
|
+
# When
|
49
|
+
actual = @error_handler.parse_algolia_error(input)
|
50
|
+
|
51
|
+
# Then
|
52
|
+
expect(actual['verb']).to eq 'PUT'
|
53
|
+
expect(actual['scheme']).to eq 'https'
|
54
|
+
expect(actual['app_id']).to eq 'appid'
|
55
|
+
expect(actual['api_section']).to eq 'indexes'
|
56
|
+
expect(actual['index_name']).to eq 'index_name'
|
57
|
+
expect(actual['api_action']).to eq 'settings'
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should cast integers to integers' do
|
61
|
+
# Given
|
62
|
+
input = @algolia_error
|
63
|
+
|
64
|
+
# When
|
65
|
+
actual = @error_handler.parse_algolia_error(input)
|
66
|
+
|
67
|
+
# Then
|
68
|
+
expect(actual['api_version']).to eq 1
|
69
|
+
expect(actual['http_error']).to eq 403
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'should parse the JSON part' do
|
73
|
+
# Given
|
74
|
+
input = @algolia_error
|
75
|
+
|
76
|
+
# When
|
77
|
+
actual = @error_handler.parse_algolia_error(input)
|
78
|
+
|
79
|
+
# Then
|
80
|
+
expect(actual['json']).to be_a(Hash)
|
81
|
+
expect(actual['json']['status']).to eq 403
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'should return false if this is not parsable' do
|
85
|
+
# Given
|
86
|
+
input = 'foo bar baz'
|
87
|
+
|
88
|
+
# When
|
89
|
+
actual = @error_handler.parse_algolia_error(input)
|
90
|
+
|
91
|
+
# Then
|
92
|
+
expect(actual).to eq(false)
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'should work on multiline errors' do
|
96
|
+
# Given
|
97
|
+
input = @algolia_error.gsub('}', "}\n")
|
98
|
+
|
99
|
+
# When
|
100
|
+
actual = @error_handler.parse_algolia_error(input)
|
101
|
+
|
102
|
+
# Then
|
103
|
+
expect(actual).to be_a(Hash)
|
104
|
+
expect(actual['http_error']).to eq 403
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
describe 'readable_algolia_error' do
|
109
|
+
it 'should warn about key ACL' do
|
110
|
+
# Given
|
111
|
+
parsed = {
|
112
|
+
'http_error' => 403,
|
113
|
+
'index_name' => 'something_tmp'
|
114
|
+
}
|
115
|
+
allow(@error_handler).to receive(:parse_algolia_error).and_return(parsed)
|
116
|
+
|
117
|
+
# When
|
118
|
+
actual = @error_handler.readable_algolia_error('error')
|
119
|
+
|
120
|
+
# Then
|
121
|
+
expect(actual).to eq('check_key_acl_to_tmp_index')
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'should return false if no nice message found' do
|
125
|
+
# Given
|
126
|
+
parsed = false
|
127
|
+
allow(@error_handler).to receive(:parse_algolia_error).and_return(parsed)
|
128
|
+
|
129
|
+
# When
|
130
|
+
actual = @error_handler.readable_algolia_error('error')
|
131
|
+
|
132
|
+
# Then
|
133
|
+
expect(actual).to eq(false)
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'should return false if message does not match any known case' do
|
137
|
+
# Given
|
138
|
+
parsed = {
|
139
|
+
'http_error' => 42
|
140
|
+
}
|
141
|
+
allow(@error_handler).to receive(:parse_algolia_error).and_return(parsed)
|
142
|
+
|
143
|
+
# When
|
144
|
+
actual = @error_handler.readable_algolia_error('error')
|
145
|
+
|
146
|
+
# Then
|
147
|
+
expect(actual).to eq(false)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
data/spec/push_spec.rb
CHANGED
@@ -140,6 +140,66 @@ describe(AlgoliaSearchJekyllPush) do
|
|
140
140
|
# When
|
141
141
|
push.configure_index(index)
|
142
142
|
end
|
143
|
+
|
144
|
+
describe 'throw an error' do
|
145
|
+
before(:each) do
|
146
|
+
@index_double = double('Algolia Index').as_null_object
|
147
|
+
@error_handler_double = double('Error Handler double').as_null_object
|
148
|
+
push.init_options(nil, {}, {})
|
149
|
+
allow(@index_double).to receive(:set_settings).and_raise
|
150
|
+
allow(Jekyll.logger).to receive(:error)
|
151
|
+
end
|
152
|
+
|
153
|
+
it 'stops if API throw an error' do
|
154
|
+
# Given
|
155
|
+
|
156
|
+
# When
|
157
|
+
|
158
|
+
# Then
|
159
|
+
expect(-> { push.configure_index(@index_double) })
|
160
|
+
.to raise_error SystemExit
|
161
|
+
end
|
162
|
+
|
163
|
+
it 'displays the error directly if unknown' do
|
164
|
+
# Given
|
165
|
+
allow(@error_handler_double)
|
166
|
+
.to receive(:readable_algolia_error).and_return false
|
167
|
+
allow(@error_handler_double)
|
168
|
+
.to receive(:display)
|
169
|
+
allow(AlgoliaSearchErrorHandler)
|
170
|
+
.to receive(:new).and_return(@error_handler_double)
|
171
|
+
|
172
|
+
# When
|
173
|
+
|
174
|
+
# Then
|
175
|
+
expect(-> { push.configure_index(@index_double) })
|
176
|
+
.to raise_error SystemExit
|
177
|
+
expect(@error_handler_double)
|
178
|
+
.to have_received(:display).exactly(0).times
|
179
|
+
expect(Jekyll.logger)
|
180
|
+
.to have_received(:error).with('Algolia Error: HTTP Error')
|
181
|
+
end
|
182
|
+
|
183
|
+
it 'display a human readable version of the error if one is found' do
|
184
|
+
# Given
|
185
|
+
allow(@error_handler_double)
|
186
|
+
.to receive(:readable_algolia_error).and_return 'known_errors'
|
187
|
+
allow(@error_handler_double)
|
188
|
+
.to receive(:display)
|
189
|
+
allow(AlgoliaSearchErrorHandler)
|
190
|
+
.to receive(:new).and_return(@error_handler_double)
|
191
|
+
|
192
|
+
# When
|
193
|
+
|
194
|
+
# Then
|
195
|
+
expect(-> { push.configure_index(@index_double) })
|
196
|
+
.to raise_error SystemExit
|
197
|
+
expect(@error_handler_double)
|
198
|
+
.to have_received(:display)
|
199
|
+
.exactly(1).times
|
200
|
+
.with('known_errors')
|
201
|
+
end
|
202
|
+
end
|
143
203
|
end
|
144
204
|
|
145
205
|
describe 'jekyll_new' do
|
@@ -272,7 +332,6 @@ describe(AlgoliaSearchJekyllPush) do
|
|
272
332
|
end
|
273
333
|
|
274
334
|
it 'should display an error if `add_objects!` failed' do
|
275
|
-
# Given
|
276
335
|
allow(index_double).to receive(:add_objects!).and_raise
|
277
336
|
|
278
337
|
expect(Jekyll.logger).to receive(:error)
|
data/spec/spec_helper.rb
CHANGED
@@ -0,0 +1,9 @@
|
|
1
|
+
Algolia Error: API key cannot write to `{index_name}_tmp` index
|
2
|
+
In order to do atomic pushes to your Algolia index, the plugin first pushes to
|
3
|
+
a temporary index (suffixed with `_tmp`), then renames it.
|
4
|
+
|
5
|
+
You see this error because the plugin wasn't able to push to that
|
6
|
+
`{index_name}_tmp` index, with the API key you provided.
|
7
|
+
|
8
|
+
Make sure the API key you're using has rights to write on both your index and
|
9
|
+
its `{index_name}_tmp` suffixed version.
|
data/txt/sample
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.6.
|
4
|
+
version: 0.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Carry
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-01-
|
11
|
+
date: 2016-01-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: algoliasearch
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '1.6'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: jekyll
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '2.5'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '2.5'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: json
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,6 +94,20 @@ dependencies:
|
|
80
94
|
- - "~>"
|
81
95
|
- !ruby/object:Gem::Version
|
82
96
|
version: '1.6'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: verbal_expressions
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 0.1.5
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 0.1.5
|
83
111
|
- !ruby/object:Gem::Dependency
|
84
112
|
name: coveralls
|
85
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -218,12 +246,14 @@ files:
|
|
218
246
|
- gemfiles/jekyll_v3.gemfile
|
219
247
|
- lib/algoliasearch-jekyll.rb
|
220
248
|
- lib/credential_checker.rb
|
249
|
+
- lib/error_handler.rb
|
221
250
|
- lib/push.rb
|
222
251
|
- lib/record_extractor.rb
|
223
252
|
- lib/version.rb
|
224
253
|
- scripts/bump_version
|
225
254
|
- scripts/check_flay
|
226
255
|
- scripts/check_flog
|
256
|
+
- scripts/coverage
|
227
257
|
- scripts/git_hooks/pre-commit
|
228
258
|
- scripts/git_hooks/pre-push
|
229
259
|
- scripts/release
|
@@ -235,6 +265,7 @@ files:
|
|
235
265
|
- scripts/watch_v2
|
236
266
|
- scripts/watch_v3
|
237
267
|
- spec/credential_checker_spec.rb
|
268
|
+
- spec/error_handler_spec.rb
|
238
269
|
- spec/fixtures/jekyll_version_2/_config.yml
|
239
270
|
- spec/fixtures/jekyll_version_2/_layouts/default.html
|
240
271
|
- spec/fixtures/jekyll_version_2/_my-collection/collection-item.html
|
@@ -271,7 +302,9 @@ files:
|
|
271
302
|
- spec/spec_helper_simplecov.rb
|
272
303
|
- txt/api_key_missing
|
273
304
|
- txt/application_id_missing
|
305
|
+
- txt/check_key_acl_to_tmp_index
|
274
306
|
- txt/index_name_missing
|
307
|
+
- txt/sample
|
275
308
|
homepage: https://github.com/algolia/algoliasearch-jekyll
|
276
309
|
licenses:
|
277
310
|
- MIT
|