Module: Jekyll::Algolia::Configurator

Includes:
Jekyll::Algolia
Defined in:
lib/jekyll/algolia/configurator.rb

Overview

Single source of truth for access to configuration variables

Constant Summary collapse

ALGOLIA_DEFAULTS =

Algolia default values

{
  'extensions_to_index' => nil,
  'files_to_exclude' => nil,
  'nodes_to_index' => 'p',
  'indexing_batch_size' => 1000,
  'settings' => {
    # Searchable attributes
    'searchableAttributes' => %w[
      title
      headings
      unordered(content)
      collection,categories,tags
    ],
    # Custom Ranking
    'customRanking' => [
      'desc(date)',
      'desc(custom_ranking.heading)',
      'asc(custom_ranking.position)'
    ],
    'unretrievableAttributes' => [
      'custom_ranking'
    ],
    # Highlight
    'attributesToHighlight' => %w[
      title
      headings
      content
      html
      collection
      categories
      tags
    ],
    'highlightPreTag' => '<em class="ais-Highlight">',
    'highlightPostTag' => '</em>',
    # Snippet
    'attributesToSnippet' => %w[
      content:55
    ],
    'snippetEllipsisText' => '…',
    # Distinct
    'distinct' => true,
    'attributeForDistinct' => 'url',
    # Faceting
    'attributesForFaceting' => %w[
      type
      searchable(collection)
      searchable(categories)
      searchable(tags)
      searchable(title)
    ]
  }
}.freeze

Constants included from Jekyll::Algolia

VERSION

Class Method Summary collapse

Methods included from Jekyll::Algolia

run, site

Class Method Details

.algolia(key) ⇒ Object

Public: Get the value of a specific Algolia configuration option, or revert to the default value otherwise

key - Algolia key to read

Returns the value of this option, or the default value



103
104
105
106
107
108
109
110
111
112
113
# File 'lib/jekyll/algolia/configurator.rb', line 103

def self.algolia(key)
  config = get('algolia') || {}
  value = config[key] || ALGOLIA_DEFAULTS[key]

  # No value found but we have a method to define the default value
  if value.nil? && respond_to?("default_#{key}")
    value = send("default_#{key}")
  end

  value
end

.api_keyObject

Public: Return the api key

Will first try to read the ENV variable. Will otherwise try to read the _algolia_api_key file in the Jekyll folder



127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/jekyll/algolia/configurator.rb', line 127

def self.api_key
  # Alway taking the ENV variable first
  return ENV['ALGOLIA_API_KEY'] if ENV['ALGOLIA_API_KEY']

  # Reading from file on disk otherwise
  source_dir = get('source')
  if source_dir
    api_key_file = File.join(source_dir, '_algolia_api_key')
    if File.exist?(api_key_file) && File.size(api_key_file).positive?
      return File.open(api_key_file).read.strip
    end
  end

  nil
end

.application_idObject

Public: Return the application id

Will first try to read the ENV variable, and fallback to the one configured in Jekyll config



119
120
121
# File 'lib/jekyll/algolia/configurator.rb', line 119

def self.application_id
  ENV['ALGOLIA_APPLICATION_ID'] || algolia('application_id')
end

.assert_valid_credentialsObject

Public: Check that all credentials are set

Returns true if everything is ok, false otherwise. Will display helpful error messages for each missing credential



169
170
171
172
173
174
175
176
177
178
179
# File 'lib/jekyll/algolia/configurator.rb', line 169

def self.assert_valid_credentials
  checks = %w[application_id index_name api_key]
  checks.each do |check|
    if send(check.to_sym).nil?
      Logger.known_message("missing_#{check}")
      return false
    end
  end

  true
end

.configObject

Public: Access to the global configuration object

This is a method around @config so we can mock it in the tests



84
85
86
# File 'lib/jekyll/algolia/configurator.rb', line 84

def self.config
  @config
end

.default_extensions_to_indexObject

Public: Setting a default values to index only html and markdown files

Markdown files can have many different extensions. We keep the one defined in the Jekyll config



185
186
187
188
# File 'lib/jekyll/algolia/configurator.rb', line 185

def self.default_extensions_to_index
  markdown_ext = get('markdown_ext') || ''
  ['html'] + markdown_ext.split(',')
end

.default_files_to_excludeObject

Public: Setting a default value to ignore index.html/index.md files in the root

Chances are high that the main page is not worthy of indexing (it can be the list of the most recent posts or some landing page without much content). We ignore it by default.

User can still add it by manually specifying a ‘files_to_exclude` to an empty array



199
200
201
202
203
# File 'lib/jekyll/algolia/configurator.rb', line 199

def self.default_files_to_exclude
  algolia('extensions_to_index').map do |extension|
    "index.#{extension}"
  end
end

.disable_other_plugins(config) ⇒ Object

Public: Disable features from other Jekyll plugins that might interfere with the indexing



235
236
237
238
239
240
241
242
243
244
245
246
# File 'lib/jekyll/algolia/configurator.rb', line 235

def self.disable_other_plugins(config)
  # Disable pagination from jekyll-paginate
  # It creates a lot of /page2/index.html files that are not relevant to
  # indexing
  # https://github.com/jekyll/jekyll-paginate/blob/master/lib/jekyll-paginate/pager.rb#L23
  config['paginate'] = nil

  # Disable archive pages from jekyll-archives
  config['jekyll-archives'] = nil

  config
end

.dry_run?Boolean

Public: Returns true if the command is run in verbose mode

When set to true, no indexing operations will be sent to the API

Returns:

  • (Boolean)


217
218
219
220
221
# File 'lib/jekyll/algolia/configurator.rb', line 217

def self.dry_run?
  value = get('dry_run')
  return true if value == true
  false
end

.force_settings?Boolean

Public: Returns true if the command should always update the settings

When set to true, the index settings will always be updated, no matter if they’ve been modified or not

Returns:

  • (Boolean)


227
228
229
230
231
# File 'lib/jekyll/algolia/configurator.rb', line 227

def self.force_settings?
  value = get('force_settings')
  return true if value == true
  false
end

.get(key) ⇒ Object

Public: Get the value of a specific Jekyll configuration option

key - Key to read

Returns the value of this configuration option, nil otherwise



93
94
95
# File 'lib/jekyll/algolia/configurator.rb', line 93

def self.get(key)
  config[key]
end

.index_nameObject

Public: Return the index name

Will first try to read the ENV variable, and fallback to the one configured in Jekyll config



147
148
149
# File 'lib/jekyll/algolia/configurator.rb', line 147

def self.index_name
  ENV['ALGOLIA_INDEX_NAME'] || algolia('index_name')
end

.index_object_ids_nameObject

Public: Return the name of the index used to store the object ids



152
153
154
# File 'lib/jekyll/algolia/configurator.rb', line 152

def self.index_object_ids_name
  "#{index_name}_object_ids"
end

.init(config = nil) ⇒ Object

Public: Init the configurator with the Jekyll config

config - The config passed by the ‘jekyll algolia` command. Default to the default Jekyll config



69
70
71
72
73
74
75
76
77
78
79
# File 'lib/jekyll/algolia/configurator.rb', line 69

def self.init(config = nil)
  # Use the default Jekyll configuration if none specified. Silence the
  # warning about no config set
  Logger.silent { config = Jekyll.configuration } if config.nil?

  @config = config

  @config = disable_other_plugins(@config)

  self
end

.settingsObject

Public: Get the index settings

This will be a merge of default settings and the one defined in the _config.yml file



160
161
162
163
# File 'lib/jekyll/algolia/configurator.rb', line 160

def self.settings
   = algolia('settings') || {}
  ALGOLIA_DEFAULTS['settings'].merge()
end

.verbose?Boolean

Public: Returns true if the command is run in verbose mode

When set to true, more logs will be displayed

Returns:

  • (Boolean)


208
209
210
211
212
# File 'lib/jekyll/algolia/configurator.rb', line 208

def self.verbose?
  value = get('verbose')
  return true if value == true
  false
end

.warn_of_deprecated_optionsObject

Public: Check for any deprecated config option and warn the user



249
250
251
252
253
254
255
256
257
258
259
260
# File 'lib/jekyll/algolia/configurator.rb', line 249

def self.warn_of_deprecated_options
  # indexing_mode is no longer used
  return if algolia('indexing_mode').nil?

  # rubocop:disable Metrics/LineLength
  Logger.log('I:')
  Logger.log('W:[jekyll-algolia] You are using the algolia.indexing_mode option which has been deprecated in v1.1')
  Logger.log('I:    Indexing is now always using an atomic diff algorithm.')
  Logger.log('I:    This option is no longer necessary, you can remove it from your _config.yml')
  Logger.log('I:')
  # rubocop:enable Metrics/LineLength
end