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
Class Method Summary collapse
-
.algolia(key) ⇒ Object
Public: Get the value of a specific Algolia configuration option, or revert to the default value otherwise.
-
.api_key ⇒ Object
Public: Return the api key.
-
.application_id ⇒ Object
Public: Return the application id.
-
.assert_valid_credentials ⇒ Object
Public: Check that all credentials are set.
-
.config ⇒ Object
Public: Access to the global configuration object.
-
.default_extensions_to_index ⇒ Object
Public: Setting a default values to index only html and markdown files.
-
.default_files_to_exclude ⇒ Object
Public: Setting a default value to ignore index.html/index.md files in the root.
-
.disable_other_plugins(config) ⇒ Object
Public: Disable features from other Jekyll plugins that might interfere with the indexing.
-
.dry_run? ⇒ Boolean
Public: Returns true if the command is run in verbose mode.
-
.force_settings? ⇒ Boolean
Public: Returns true if the command should always update the settings.
-
.get(key) ⇒ Object
Public: Get the value of a specific Jekyll configuration option.
-
.index_name ⇒ Object
Public: Return the index name.
-
.index_object_ids_name ⇒ Object
Public: Return the name of the index used to store the object ids.
-
.init(config = nil) ⇒ Object
Public: Init the configurator with the Jekyll config.
-
.settings ⇒ Object
Public: Get the index settings.
-
.verbose? ⇒ Boolean
Public: Returns true if the command is run in verbose mode.
-
.warn_of_deprecated_options ⇒ Object
Public: Check for any deprecated config option and warn the user.
Methods included from Jekyll::Algolia
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_key ⇒ Object
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_id ⇒ Object
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_credentials ⇒ Object
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.("missing_#{check}") return false end end true end |
.config ⇒ Object
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_index ⇒ Object
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_exclude ⇒ Object
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
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
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_name ⇒ Object
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_name ⇒ Object
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 |
.settings ⇒ Object
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 user_settings = algolia('settings') || {} ALGOLIA_DEFAULTS['settings'].merge(user_settings) end |
.verbose? ⇒ Boolean
Public: Returns true if the command is run in verbose mode
When set to true, more logs will be displayed
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_options ⇒ Object
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. # 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 |