jekyll-algolia 1.4.0 → 1.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: df27608a53e92a6a6045233960ebed4d0428d724
4
- data.tar.gz: 7aa5442e7b35440a88c70a71336f7055bd7739a3
3
+ metadata.gz: 481b7a00fb77312b22d28dd2f36c1451716016ca
4
+ data.tar.gz: c9d0db5c134418357f510fd30085031b28a6ffca
5
5
  SHA512:
6
- metadata.gz: cac19bf56a3777f5c6754e9b4309b22fe751c7076d54de4a91bd67e067c8a84f566542ad6b93b086a650cd844fa684f5fe9101605045428ded68c64a56370a80
7
- data.tar.gz: 90b7b874c0a82d2b9e2d6015795c18ef9656ea41ab9f13b8c43de7309407bc023e9ee4a167343f4ea0f735303c192d38a444e2e6f32bb2e3ed77abda96451923
6
+ metadata.gz: 4cb7407675f31cdd3f11a4584df1f110934fab993fd60d98fe591dbfa82fd56a2773d3d7721dcc7a488c0c1977e67429226bdd500520a85c995f1c60936bfb36
7
+ data.tar.gz: 061740db0b6b2061eb0b16116f1b5c9a0425b191096030b5d99967cccd1b4fa611c78c5e9e4fb903d6ed067b558c623fdacf75dc0426694d3b8bbb15357bb1f6
data/README.md CHANGED
@@ -45,12 +45,12 @@ Once this is done, download all dependencies with `bundle install`.
45
45
  You need to provide certain Algolia credentials for this plugin to *index* your
46
46
  site.
47
47
 
48
- *If you don't yet have an Algolia account, you can open a free [Community plan
49
- here][8]. Once signed in, you can get your
50
- credentials from [your dashboard][9].*
48
+ *If you don't yet have an Algolia account, we suggest that you open a free
49
+ [Community plan here][8]. You can find more information about the Algolia plans
50
+ [in our FAQ][10].*
51
51
 
52
- Once you have your credentials, you should define your `application_id` inside
53
- your `_config.yml` file like this:
52
+ Once signed in, you should get your application ID from [your dashboard][9] and
53
+ define it inside your `_config.yml` file like this:
54
54
 
55
55
  ```yaml
56
56
  # _config.yml
@@ -72,18 +72,21 @@ Note that `ALGOLIA_API_KEY` should be set to your admin API key.
72
72
 
73
73
  ## More about the Community plan
74
74
 
75
- The Algolia [Community plan][10] lets you host up to 10k records and perform up to
76
- 100k add/edit/delete operations per month (search operations are free). The plan
77
- is entirely free, with no time limit.
75
+ The Algolia [Community plan][11] lets you host up to 10k records and perform up
76
+ to 100k add/edit/delete operations per month (search operations are free). The
77
+ plan is entirely free, with no time limit.
78
78
 
79
79
  What we ask in exchange is that you display a "Search by Algolia" logo next to
80
- your search results. Our [InstantSearch libraries][11] have a simple boolean
80
+ your search results. Our [InstantSearch libraries][12] have a simple boolean
81
81
  option to toggle that on an off. If you want more flexibility, you can find
82
- all versions of our logo [here][12].
82
+ all versions of our logo [here][13].
83
+
84
+ If you need more information about the other Algolia plans, you can [check our
85
+ FAQ][10].
83
86
 
84
87
  # Thanks
85
88
 
86
- Thanks to [Anatoliy Yastreb][13] for a [great tutorial][14] on creating Jekyll
89
+ Thanks to [Anatoliy Yastreb][14] for a [great tutorial][15] on creating Jekyll
87
90
  plugins.
88
91
 
89
92
 
@@ -96,8 +99,9 @@ plugins.
96
99
  [7]: https://img.shields.io/badge/dynamic/json.svg?label=coverage%3Adevelop&colorB=&prefix=&suffix=%25&query=$.coverage_change&uri=https%3A%2F%2Fcoveralls.io%2Fgithub%2Falgolia%2Fjekyll-algolia.json%3Fbranch%3Ddevelop
97
100
  [8]: #more-about-the-community-plan
98
101
  [9]: https://www.algolia.com/api-keys
99
- [10]: https://www.algolia.com/users/sign_up/hacker
100
- [11]: https://community.algolia.com/instantsearch.js/
101
- [12]: https://www.algolia.com/press#resources
102
- [13]: https://github.com/ayastreb/
103
- [14]: https://ayastreb.me/writing-a-jekyll-plugin/
102
+ [10]: https://community.algolia.com/jekyll-algolia/faq.html#how-many-records-will-the-plugin-need
103
+ [11]: https://www.algolia.com/users/sign_up/hacker
104
+ [12]: https://community.algolia.com/instantsearch.js/
105
+ [13]: https://www.algolia.com/press#resources
106
+ [14]: https://github.com/ayastreb/
107
+ [15]: https://ayastreb.me/writing-a-jekyll-plugin/
@@ -1,14 +1,10 @@
1
1
  E:[✗ Error] Record is too big
2
2
  E:
3
- E:The jekyll-algolia plugin could not push one of your records as it exceeds the {size_limit} size limit.
3
+ E:The jekyll-algolia plugin detected that one of your records exceeds the {max_record_size} record size limit.
4
4
  W:
5
- W:The plugin will create one record for each element matching your `nodes_to_index` value (currently set to "{nodes_to_index}").
6
- W:Each record should not weight more than {size_limit}.
7
- W:One of your records weights {size} and has been rejected.
8
- W:
9
- W:objectID: {object_id}
10
5
  W:title:    {object_title}
11
6
  W:url:      {object_url}
7
+ W:size:     {record_size}
12
8
  W:
13
9
  W:Most probable keys causing the issue:
14
10
  W:   {probable_wrong_keys}
@@ -18,5 +14,11 @@ W:   {record_log_path}
18
14
  W:
19
15
  I:This issue can be caused by malformed HTML preventing the parser to correctly grab the content of the nodes. Double check that the page actually renders correctly with a regular `jekyll build`.
20
16
  I:
21
- I:If you're having trouble solving this issue, feel free to file a bug on GitHub, ideally with a link to a repository where we can reproduce the issue.
17
+ I:If you think this is an error and your current Algolia plan should allow you to push records bigger than {max_record_size}, you can change the `max_record_size` config option to increase the limit. Paid plans have a limit set to 20Kb, while free Community plans have it set to 10Kb.
18
+ I:
19
+ I:The following documentation might help you:
20
+ I:   - https://community.algolia.com/jekyll-algolia/options.html#nodes-to-index
21
+ I:   - https://community.algolia.com/jekyll-algolia/options.html#max-record-size
22
+ I:
23
+ I:If you're still having trouble solving this issue, feel free to file a bug on GitHub, ideally with a link to a repository where we can reproduce the issue.
22
24
  I:  https://github.com/algolia/jekyll-algolia/issues
@@ -0,0 +1,10 @@
1
+ E:[✗ Error] Record is too big
2
+ E:
3
+ E:The API rejected one of your records because it is too big ({record_size}).
4
+ W:
5
+ W:Make sure the value of `max_record_size` (currently set to "{max_record_size}") matches the maximum size allowed by your current Algolia plan.
6
+ W:
7
+ I:Free Community plans can push records up to 10Kb (`max_record_size: 10000`, this is the default value), while paid plans can go up to 20Kb (`max_record_size: 20000`).
8
+ I:
9
+ I:If you're still having trouble solving this issue, feel free to file a bug on GitHub, ideally with a link to a repository where we can reproduce the issue.
10
+ I:  https://github.com/algolia/jekyll-algolia/issues
@@ -14,6 +14,7 @@ module Jekyll
14
14
  'files_to_exclude' => nil,
15
15
  'nodes_to_index' => 'p',
16
16
  'indexing_batch_size' => 1000,
17
+ 'max_record_size' => 10_000,
17
18
  'settings' => {
18
19
  # Searchable attributes
19
20
  'searchableAttributes' => %w[
@@ -47,7 +47,7 @@ module Jekyll
47
47
  known_errors = %w[
48
48
  unknown_application_id
49
49
  invalid_credentials
50
- record_too_big
50
+ record_too_big_api
51
51
  too_many_records
52
52
  unknown_setting
53
53
  invalid_index_name
@@ -135,24 +135,6 @@ module Jekyll
135
135
  hash
136
136
  end
137
137
 
138
- # Public: Returns a string explaining which attributes are the largest in
139
- # the record
140
- #
141
- # record - The record hash to analyze
142
- #
143
- # This will be used on the `record_too_big` error, to guide users in
144
- # finding which record is causing trouble
145
- def self.readable_largest_record_keys(record)
146
- keys = Hash[record.map { |key, value| [key, value.to_s.length] }]
147
- largest_keys = keys.sort_by { |_, value| value }.reverse[0..2]
148
- output = []
149
- largest_keys.each do |key, size|
150
- size = Filesize.from("#{size} B").to_s('Kb')
151
- output << "#{key} (#{size})"
152
- end
153
- output.join(', ')
154
- end
155
-
156
138
  # Public: Check if the application id is available
157
139
  #
158
140
  # _context - Not used
@@ -197,43 +179,24 @@ module Jekyll
197
179
  #
198
180
  # context[:records] - list of records sent in the batch
199
181
  #
200
- # Records cannot weight more that 10Kb. If we're getting this error it
201
- # means that one of the records is too big, so we'll try to give
202
- # informations about it so the user can debug it.
203
- def self.record_too_big?(error, context = {})
182
+ # One of the sent record is too big and has been rejected by the API. This
183
+ # should not happen as we proactively check for record size before pushing
184
+ # them. If it still happens it means that the value set in max_record_size
185
+ # is not matching the value in the plan.
186
+ def self.record_too_big_api?(error, _contex = {})
204
187
  details = error_hash(error.message)
205
188
  return false if details == false
206
189
 
207
190
  message = details['message']
208
191
  return false if message !~ /^Record .* is too big .*/
209
192
 
210
- # Getting the record size
211
- size, = /.*size=(.*) bytes.*/.match(message).captures
212
- size = Filesize.from("#{size} B").to_s('Kb')
213
- object_id = details['objectID']
214
-
215
- # Finding the record in all the operations
216
- operation = context[:operations].find do |o|
217
- o[:action] == 'addObject' && o[:body][:objectID] == object_id
218
- end
219
- record = operation[:body]
220
- probable_wrong_keys = readable_largest_record_keys(record)
221
-
222
- # Writing the full record to disk for inspection
223
- record_log_path = Logger.write_to_file(
224
- "jekyll-algolia-record-too-big-#{object_id}.log",
225
- JSON.pretty_generate(record)
226
- )
193
+ record_size, = /.*size=(.*) bytes.*/.match(message).captures
194
+ record_size_readable = Filesize.from("#{record_size}B").to_s('Kb')
195
+ max_record_size = Configurator.algolia('max_record_size')
227
196
 
228
197
  {
229
- 'object_id' => object_id,
230
- 'object_title' => record[:title],
231
- 'object_url' => record[:url],
232
- 'probable_wrong_keys' => probable_wrong_keys,
233
- 'record_log_path' => record_log_path,
234
- 'nodes_to_index' => Configurator.algolia('nodes_to_index'),
235
- 'size' => size,
236
- 'size_limit' => '10 Kb'
198
+ 'record_size' => record_size_readable,
199
+ 'max_record_size' => max_record_size
237
200
  }
238
201
  end
239
202
 
@@ -10,15 +10,23 @@ module GitHubPages
10
10
  # github-pages gem installed at the same time, those hooks will never be
11
11
  # executed.
12
12
  #
13
- # Here, we overwrite the call to GitHubPages::Configuration.set that init the
14
- # whole plugin to actually do nothing, hence disabling the plugin completely.
15
- # https://github.com/github/pages-gem/blob/master/lib/github-pages.rb#L19
13
+ # The GitHub Pages gem prevent access to custom plugins by doing two things:
14
+ # - forcing safe mode
15
+ # - loading custom plugins from a random dir
16
+ #
17
+ # We cancel those by disabling safe mode and forcing back plugins to be read
18
+ # from ./_plugins.
16
19
  #
17
20
  # This file will only be loaded when running `jekyll algolia`, so it won't
18
21
  # interfere with the regular usage of `jekyll build`
19
22
  class Configuration
20
23
  class << self
21
- def set(site); end
24
+ def set!(site)
25
+ config = effective_config(site.config)
26
+ config['safe'] = false
27
+ config['plugins_dir'] = '_plugins'
28
+ site.config = config
29
+ end
22
30
  end
23
31
  end
24
32
  end
@@ -130,13 +130,15 @@ module Jekyll
130
130
  # Applying the user hook on the whole list of records
131
131
  records = Hooks.apply_all(records, self)
132
132
 
133
- # Shrinking records to make them fit under 10Kb
133
+ # Shrinking records to force them to fit under the max record size
134
+ # limit, or displaying an error message if not possible
135
+ max_record_size = Configurator.algolia('max_record_size')
134
136
  # We take into account the objectID that will be added in the form of:
135
137
  # "objectID": "16cd998991cc40d92402b0b4e6c55e8a"
136
138
  object_id_attribute_length = 46
137
- max_file_size = 10_000 - object_id_attribute_length
139
+ max_record_size -= object_id_attribute_length
138
140
  records.map! do |record|
139
- Shrinker.fit_to_size(record, max_file_size)
141
+ Shrinker.fit_to_size(record, max_record_size)
140
142
  end
141
143
 
142
144
  # Adding a unique objectID to each record
@@ -25,7 +25,7 @@ module Jekyll
25
25
  return raw_record if size(raw_record) <= max_size
26
26
 
27
27
  # No excerpt, we can't shrink it
28
- return raw_record unless raw_record.key?(:excerpt_html)
28
+ return stop_with_error(raw_record) unless raw_record.key?(:excerpt_html)
29
29
 
30
30
  record = raw_record.clone
31
31
 
@@ -41,10 +41,69 @@ module Jekyll
41
41
  return record if size(record) <= max_size
42
42
 
43
43
  # We remove the excerpts completely
44
- record[:excerpt_text] = nil
45
- record[:excerpt_html] = nil
44
+ record.delete(:excerpt_text)
45
+ record.delete(:excerpt_html)
46
+ return record if size(record) <= max_size
47
+
48
+ # Still too big, we fail
49
+ stop_with_error(record)
50
+ end
51
+
52
+ # Public: Stop the current indexing process and display details about the
53
+ # record that is too big to be pushed
54
+ #
55
+ # - record: The record causing the error
56
+ #
57
+ # This will display an error message and log the wrong record in a file in
58
+ # the source directory
59
+ def self.stop_with_error(record)
60
+ record_size = size(record)
61
+ record_size_readable = Filesize.from("#{record_size}B").to_s('Kb')
62
+ max_record_size = Configurator.algolia('max_record_size')
63
+ max_record_size_readable = Filesize
64
+ .from("#{max_record_size}B").to_s('Kb')
65
+
66
+ probable_wrong_keys = readable_largest_record_keys(record)
67
+
68
+ # Writing the full record to disk for inspection
69
+ record_log_path = Logger.write_to_file(
70
+ 'jekyll-algolia-record-too-big.log',
71
+ JSON.pretty_generate(record)
72
+ )
73
+
74
+ details = {
75
+ 'object_title' => record[:title],
76
+ 'object_url' => record[:url],
77
+ 'probable_wrong_keys' => probable_wrong_keys,
78
+ 'record_log_path' => record_log_path,
79
+ 'nodes_to_index' => Configurator.algolia('nodes_to_index'),
80
+ 'record_size' => record_size_readable,
81
+ 'max_record_size' => max_record_size_readable
82
+ }
83
+
84
+ Logger.known_message('record_too_big', details)
85
+
86
+ stop_process
87
+ end
88
+
89
+ # Public: Returns a string explaining which attributes are the largest in
90
+ # the record
91
+ #
92
+ # record - The record hash to analyze
93
+ def self.readable_largest_record_keys(record)
94
+ keys = Hash[record.map { |key, value| [key, value.to_s.length] }]
95
+ largest_keys = keys.sort_by { |_, value| value }.reverse[0..2]
96
+ output = []
97
+ largest_keys.each do |key, size|
98
+ size = Filesize.from("#{size} B").to_s('Kb')
99
+ output << "#{key} (#{size})"
100
+ end
101
+ output.join(', ')
102
+ end
46
103
 
47
- record
104
+ # Public: Stop the current process
105
+ def self.stop_process
106
+ exit 1
48
107
  end
49
108
  end
50
109
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Jekyll
4
4
  module Algolia
5
- VERSION = '1.4.0'
5
+ VERSION = '1.4.1'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-algolia
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.4.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: 2018-04-26 00:00:00.000000000 Z
11
+ date: 2018-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: algolia_html_extractor
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 2.6.1
19
+ version: '2.6'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 2.6.1
26
+ version: '2.6'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: algoliasearch
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -291,6 +291,7 @@ files:
291
291
  - lib/errors/missing_index_name.txt
292
292
  - lib/errors/no_records_found.txt
293
293
  - lib/errors/record_too_big.txt
294
+ - lib/errors/record_too_big_api.txt
294
295
  - lib/errors/settings_manually_edited.txt
295
296
  - lib/errors/too_many_records.txt
296
297
  - lib/errors/unknown_application_id.txt