jekyll-algolia 1.1.2 → 1.1.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 51f8221d0fd59da5c41a3a9dd8496dffd6562989
4
- data.tar.gz: 56523270302c22f93d2537cfb8a614bf7c263cca
3
+ metadata.gz: a394d33bddf856fafbb84d345f2a87987583757b
4
+ data.tar.gz: eaeaa8ff67fdfda25d94e312cdcc18d21510c9a5
5
5
  SHA512:
6
- metadata.gz: 731e81066460aed7b1459a821f05ef7c4124a2b5cf0ae831bc3bc7cde7c29f9ede433e619a67e8dda111d7008b1bf0268af087cf57476ee2ab23d0e5c8c4c186
7
- data.tar.gz: 15d46a745850b81fa7340fd319bd5eb31530457d890a616f8090da9c3fa0e60fccaa913246c6331ecbf00cdcf8c0482f4511cba425d05fbbc3282eba07e9effc
6
+ metadata.gz: db3edbb0a108e58ceddc7c9c1b6aaafe9747d968b007e4b9a25c58ee7a878035282e8452ee826b57d26a503c247667fccdae991222ffc7d4aa28aa055876bb37
7
+ data.tar.gz: 24f04bf128f70fe949f8bc27f59e3ac39cb172771dab6365205c0716cc92434e5e4d6d62f46b0c25368031db28d11944f9c065377ef1e92c6af11cf90e84e9c2
@@ -10,7 +10,7 @@ I: `files_to_exclude` option. You are currently excluding the following files:
10
10
  I: {files_to_exclude}
11
11
  I:
12
12
  I: Also double check that your current value for `nodes_to_index` can actually
13
- I: match something in the page. You are current indexing the following nodes:
13
+ I: match something in the pages. You are current indexing the following nodes:
14
14
  I: {nodes_to_index}
15
15
  I:
16
16
  I: Note that all the markup that is defined in the layouts won't be available
@@ -17,8 +17,6 @@ module Jekyll
17
17
  require 'jekyll/algolia/extractor'
18
18
  require 'jekyll/algolia/indexer'
19
19
 
20
- @config = {}
21
-
22
20
  # Public: Init the Algolia module
23
21
  #
24
22
  # config - A hash of Jekyll config option (merge of _config.yml options and
@@ -27,9 +25,9 @@ module Jekyll
27
25
  # The gist of the plugin works by instanciating a Jekyll site,
28
26
  # monkey-patching its `write` method and building it.
29
27
  def self.init(config = {})
30
- @config = config
31
28
  @start_time = Time.now
32
- @site = Jekyll::Algolia::Site.new(@config)
29
+ config = Configurator.init(config).config
30
+ @site = Jekyll::Algolia::Site.new(config)
33
31
 
34
32
  exit 1 unless Configurator.assert_valid_credentials
35
33
 
@@ -57,14 +55,6 @@ module Jekyll
57
55
  @site.process
58
56
  end
59
57
 
60
- # Public: Get access to the Jekyll config
61
- #
62
- # All other classes will need access to this config, so we make it publicly
63
- # accessible
64
- def self.config
65
- @config
66
- end
67
-
68
58
  # Public: Get access to the Jekyll site
69
59
  #
70
60
  # Tests will need access to the inner Jekyll website so we expose it here
@@ -6,6 +6,8 @@ module Jekyll
6
6
  module Configurator
7
7
  include Jekyll::Algolia
8
8
 
9
+ @config = {}
10
+
9
11
  # Algolia default values
10
12
  ALGOLIA_DEFAULTS = {
11
13
  'extensions_to_index' => nil,
@@ -56,13 +58,37 @@ module Jekyll
56
58
  }
57
59
  }.freeze
58
60
 
61
+ # Public: Init the configurator with the Jekyll config
62
+ #
63
+ # config - The config passed by the `jekyll algolia` command. Default to
64
+ # the default Jekyll config
65
+ def self.init(config = nil)
66
+ # Use the default Jekyll configuration if none specified. Silence the
67
+ # warning about no config set
68
+ Logger.silent { config = Jekyll.configuration } if config.nil?
69
+
70
+ @config = config
71
+ @config['exclude'] = files_excluded_from_render
72
+
73
+ @config = disable_other_plugins(@config)
74
+
75
+ self
76
+ end
77
+
78
+ # Public: Access to the global configuration object
79
+ #
80
+ # This is a method around @config so we can mock it in the tests
81
+ def self.config
82
+ @config
83
+ end
84
+
59
85
  # Public: Get the value of a specific Jekyll configuration option
60
86
  #
61
87
  # key - Key to read
62
88
  #
63
89
  # Returns the value of this configuration option, nil otherwise
64
90
  def self.get(key)
65
- Jekyll::Algolia.config[key]
91
+ config[key]
66
92
  end
67
93
 
68
94
  # Public: Get the value of a specific Algolia configuration option, or
@@ -149,7 +175,8 @@ module Jekyll
149
175
  # Markdown files can have many different extensions. We keep the one
150
176
  # defined in the Jekyll config
151
177
  def self.default_extensions_to_index
152
- ['html'] + get('markdown_ext').split(',')
178
+ markdown_ext = get('markdown_ext') || ''
179
+ ['html'] + markdown_ext.split(',')
153
180
  end
154
181
 
155
182
  # Public: Setting a default value to ignore index.html/index.md files in
@@ -185,6 +212,37 @@ module Jekyll
185
212
  false
186
213
  end
187
214
 
215
+ # Public: List of files to exclude from the Jekyll build
216
+ #
217
+ # We skip all files usually ignored by Jekyll, plus any file that should
218
+ # not be indexed.
219
+ def self.files_excluded_from_render
220
+ site_exclude = get('exclude') || []
221
+ algolia_exclude = algolia('files_to_exclude') || []
222
+
223
+ excluded_files = site_exclude + algolia_exclude
224
+
225
+ # 404 pages are not Jekyll defaults but a convention adopted by GitHub
226
+ # pages. We don't want to index those.
227
+ # https://help.github.com/articles/creating-a-custom-404-page-for-your-github-pages-site/
228
+ excluded_files << '404.html'
229
+ excluded_files << '404.md'
230
+
231
+ excluded_files
232
+ end
233
+
234
+ # Public: Disable features from other Jekyll plugins that might interfere
235
+ # with the indexing
236
+ def self.disable_other_plugins(config)
237
+ # Disable pagination from jekyll-paginate
238
+ # It creates a lot of /page2/index.html files that are not relevant to
239
+ # indexing
240
+ # https://github.com/jekyll/jekyll-paginate/blob/master/lib/jekyll-paginate/pager.rb#L23
241
+ config['paginate'] = nil
242
+
243
+ config
244
+ end
245
+
188
246
  # Public: Check for any deprecated config option and warn the user
189
247
  def self.warn_of_deprecated_options
190
248
  # indexing_mode is no longer used
@@ -34,7 +34,7 @@ module Jekyll
34
34
  pathname = Pathname.new(file.path)
35
35
  return pathname.cleanpath.to_s if pathname.absolute?
36
36
 
37
- File.join(Configurator.get('source'), file.path)
37
+ File.expand_path(File.join(Configurator.get('source'), file.path))
38
38
  end
39
39
 
40
40
  # Public: Return the path of a Jekyll file relative to the Jekyll source
@@ -48,45 +48,12 @@ module Jekyll
48
48
  pathname = Pathname.new(file.path)
49
49
  return file.path if pathname.relative?
50
50
 
51
- jekyll_source = Pathname.new(Configurator.get('source'))
51
+ jekyll_source = Pathname.new(
52
+ File.expand_path(Configurator.get('source'))
53
+ )
52
54
  pathname.relative_path_from(jekyll_source).cleanpath.to_s
53
55
  end
54
56
 
55
- # Public: Check if the file is a 404 error page
56
- #
57
- # file - The Jekyll file
58
- #
59
- # 404 pages are not Jekyll defaults but a convention adopted by GitHub
60
- # pages. We don't want to index those.
61
- # Source: https://help.github.com/articles/creating-a-custom-404-page-for-your-github-pages-site/
62
- #
63
- # rubocop:disable Naming/PredicateName
64
- def self.is_404?(file)
65
- File.basename(file.path, File.extname(file.path)) == '404'
66
- end
67
- # rubocop:enable Naming/PredicateName
68
-
69
- # Public: Check if the page is a pagination page
70
- #
71
- # file - The Jekyll file
72
- #
73
- # `jekyll-paginate` automatically creates pages to paginate through posts.
74
- # We don't want to index those
75
- def self.pagination_page?(file)
76
- # paginate_path contains a special `:num` part that is the page number
77
- # We convert that to a regexp
78
- paginate_path = Configurator.get('paginate_path')
79
- paginate_path_as_regexp = paginate_path.gsub(':num', '([0-9]*)')
80
-
81
- regexp = %r{#{paginate_path_as_regexp}/index\.html$}
82
-
83
- # Make sure all file paths start with a / for comparison
84
- filepath = file.path
85
- filepath = "/#{filepath}" unless filepath[0] == '/'
86
-
87
- Utils.match?(filepath, regexp)
88
- end
89
-
90
57
  # Public: Check if the file has one of the allowed extensions
91
58
  #
92
59
  # file - The Jekyll file
@@ -101,16 +68,6 @@ module Jekyll
101
68
  extensions.include?(extname)
102
69
  end
103
70
 
104
- # Public: Check if the file has been excluded by the user
105
- #
106
- # file - The Jekyll file
107
- #
108
- # Files can be excluded either by setting the `files_to_exclude` option,
109
- # or by defining a custom hook
110
- def self.excluded_by_user?(file)
111
- excluded_from_config?(file) || excluded_from_hook?(file)
112
- end
113
-
114
71
  # Public: Check if the file has been excluded by `files_to_exclude`
115
72
  #
116
73
  # file - The Jekyll file
@@ -147,10 +104,8 @@ module Jekyll
147
104
  # all the static assets, only keep the actual content.
148
105
  def self.indexable?(file)
149
106
  return false if static_file?(file)
150
- return false if is_404?(file)
151
- return false if pagination_page?(file)
152
107
  return false unless allowed_extension?(file)
153
- return false if excluded_by_user?(file)
108
+ return false if excluded_from_hook?(file)
154
109
 
155
110
  true
156
111
  end
@@ -196,17 +151,10 @@ module Jekyll
196
151
  data.each_key do |key|
197
152
  data.delete(key) if respond_to?(key)
198
153
  end
199
-
200
- # Excerpt needs a special handling
201
154
  data.delete('excerpt')
202
155
 
203
- # jekyll-asciidoc adds a document key to each page. Once converted to
204
- # a string representation, it contains a random number, causing the
205
- # object hash to change on each run. This causes the diff method to
206
- # fail, so we discard this key.
207
- if Utils.instance_of?(data['document'], 'Asciidoctor::Document')
208
- data.delete('document')
209
- end
156
+ # Convert all values to a version that can be serialized to JSON
157
+ data = Utils.jsonify(data)
210
158
 
211
159
  # Convert all keys to symbols
212
160
  data = Utils.keys_to_symbols(data)
@@ -88,6 +88,39 @@ module Jekyll
88
88
  item[key] == value
89
89
  end
90
90
  end
91
+
92
+ # Public: Convert an object into an object that can easily be converted to
93
+ # JSON, to be stored as a record
94
+ #
95
+ # item - The object to convert
96
+ #
97
+ # It will keep any string, number, boolean,boolean,array or nested object,
98
+ # but will try to stringify other objects, excluding the one that contain
99
+ # a unique identifier once serialized.
100
+ def self.jsonify(item)
101
+ simple_types = [
102
+ NilClass,
103
+ TrueClass, FalseClass,
104
+ Integer, Float,
105
+ String
106
+ ]
107
+ return item if simple_types.member?(item.class)
108
+
109
+ # Recursive types
110
+ return item.map { |value| jsonify(value) } if item.is_a?(Array)
111
+ if item.is_a?(Hash)
112
+ return item.map { |key, value| [key, jsonify(value)] }.to_h
113
+ end
114
+
115
+ # Can't be stringified, discard it
116
+ return nil unless item.respond_to?(:to_s)
117
+
118
+ # Discard also if is a serialized version with unique identifier
119
+ stringified = item.to_s
120
+ return nil if match?(stringified, /#<[^ ].*@[0-9]* .*>/)
121
+
122
+ stringified
123
+ end
91
124
  end
92
125
  end
93
126
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Jekyll
4
4
  module Algolia
5
- VERSION = '1.1.2'
5
+ VERSION = '1.1.3'
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.1.2
4
+ version: 1.1.3
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-02-15 00:00:00.000000000 Z
11
+ date: 2018-02-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: algolia_html_extractor
@@ -150,6 +150,20 @@ dependencies:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
152
  version: '4.3'
153
+ - !ruby/object:Gem::Dependency
154
+ name: guard
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '2.14'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '2.14'
153
167
  - !ruby/object:Gem::Dependency
154
168
  name: guard-rspec
155
169
  requirement: !ruby/object:Gem::Requirement