meilisearch-rails 0.10.2 → 0.14.0

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
  SHA256:
3
- metadata.gz: cb990c26e799658b655df059ea7a22b4cfc7511a88e7581d72c27841b736f74f
4
- data.tar.gz: c2457a258356732877729a9f110a8f392316a98d725d6d052f2dc64824a3ea2f
3
+ metadata.gz: ba5387112e0280c13ed074d356fdaa706c14a933d0a2ae540f16ecad75829db3
4
+ data.tar.gz: 04560a2a843b527439d02abddf63d23ab218860e06fa6005ca4d5cc2cdf939cc
5
5
  SHA512:
6
- metadata.gz: 7499509091a149069f1322e3ceec9c789432c3495d8c2754d258bb17c5cc1d70a410ebcd41e1eb76bcbe50b3c9e301044d0a5e6931e94bdd8779eb290e9eaecf
7
- data.tar.gz: 68173b7d7767308144b6987c35c9c2fb75806959a6fcdc3ee3545cab88779d24e013dea0ea0b3b0a3182f8fb9bcd5c7e1634aaf89ecd39f4cb7ad21231b95a0b
6
+ metadata.gz: 8e3ca9d2407f083234b5a925ed31285d67d705c7e97ac07840989061a75ae6fbc9cdbf6e2f179d40f13d7b5751967727caaf872ae1d8b80a39494e6732692155
7
+ data.tar.gz: 2d97cf8dee950fb9d9afe58b78eac6e4df2131eb0864a4a5b44bd247e97f79b759a66f6cf1882da37d7dca3a03b909ff5aacc71bd8063bf04e27ccf9b8dd4871
data/Gemfile CHANGED
@@ -31,7 +31,7 @@ group :test do
31
31
  gem 'jdbc-sqlite3', platform: :jruby
32
32
  gem 'rspec', '~> 3.0'
33
33
  gem 'simplecov', require: 'false'
34
- gem 'codecov', require: 'false'
34
+ gem 'simplecov-cobertura', require: 'false'
35
35
  gem 'threads'
36
36
 
37
37
  gem 'byebug'
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2021-2022 Meili SAS
3
+ Copyright (c) 2021-2024 Meili SAS
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -38,6 +38,7 @@
38
38
  - [Compatibility](#-compatibility)
39
39
  - [⚙️ Settings](#️-settings)
40
40
  - [🔍 Custom search](#-custom-search)
41
+ - [🔍🔍 Multi search](#-multi-search)
41
42
  - [🪛 Options](#-options)
42
43
  - [Meilisearch configuration & environment](#meilisearch-configuration--environment)
43
44
  - [Pagination with `kaminari` or `will_paginate`](#backend-pagination-with-kaminari-or-will_paginate-)
@@ -75,7 +76,7 @@ This package guarantees compatibility with [version v1.x of Meilisearch](https:/
75
76
 
76
77
  ## 🔧 Installation <!-- omit in toc -->
77
78
 
78
- This package requires Ruby version 2.7.0 or later and Rails 6.1 or later. It may work in older versions but it is not officially supported.
79
+ This package requires Ruby version 3.0 or later and Rails 6.1 or later. It may work in older versions but it is not officially supported.
79
80
 
80
81
  With `gem` in command line:
81
82
  ```bash
@@ -206,6 +207,7 @@ class Book < ApplicationRecord
206
207
  crop_length 10
207
208
  faceting max_values_per_facet: 2000
208
209
  pagination max_total_hits: 1000
210
+ proximity_precision 'byWord'
209
211
  end
210
212
  end
211
213
  ```
@@ -229,7 +231,7 @@ harry_book.formatted # => {"id"=>"1", "name"=>"<em>Harry</em> Potter", "descript
229
231
  👉 Don't forget that `attributes_to_highlight`, `attributes_to_crop`, and
230
232
  `crop_length` can be set up in the `meilisearch` block of your model.
231
233
 
232
- ## 🔍 Sorted search
234
+ ### 🔍 Sorted search
233
235
 
234
236
  As an example of how to use the sort option, here is how you could achieve
235
237
  returning all books sorted by title in ascending order:
@@ -240,6 +242,58 @@ Book.search('*', sort: ['title:asc'])
240
242
 
241
243
  👉 Don't forget to set up the `sortable_attributes` option in the `meilisearch` block of your model.
242
244
 
245
+ ## 🔍🔍 Multi search
246
+
247
+ Meilisearch supports searching multiple models at the same time (see [🔍 Custom search](#-custom-search) for search options):
248
+
249
+ ```ruby
250
+ multi_search_results = MeiliSearch::Rails.multi_search(
251
+ Book => { q: 'Harry' },
252
+ Manga => { q: 'Attack' }
253
+ )
254
+ ```
255
+
256
+ You can iterate through the results with `.each` or `.each_result`:
257
+
258
+ ```erb
259
+ <% multi_search_results.each do |record| %>
260
+ <p><%= record.title %></p>
261
+ <p><%= record.author %></p>
262
+ <% end %>
263
+
264
+ <p>Harry Potter and the Philosopher's Stone</p>
265
+ <p>J. K. Rowling</p>
266
+ <p>Harry Potter and the Chamber of Secrets</p>
267
+ <p>J. K. Rowling</p>
268
+ <p>Attack on Titan</p>
269
+ <p>Iseyama</p>
270
+ ```
271
+
272
+ ```erb
273
+ <% multi_search_results.each_result do |klass, results| %>
274
+ <p><%= klass.name.pluralize %></p>
275
+
276
+ <ul>
277
+ <% results.each do |record| %>
278
+ <li><%= record.title %></li>
279
+ <% end %>
280
+ </ul>
281
+ <% end %>
282
+
283
+
284
+ <p>Books</p>
285
+ <ul>
286
+ <li>Harry Potter and the Philosopher's Stone</li>
287
+ <li>Harry Potter and the Chamber of Secrets</li>
288
+ </ul>
289
+ <p>Mangas</p>
290
+ <ul>
291
+ <li>Attack on Titan</li>
292
+ </ul>
293
+ ```
294
+
295
+ See the [official multi search documentation](https://www.meilisearch.com/docs/reference/api/multi_search).
296
+
243
297
  ## 🪛 Options
244
298
 
245
299
  ### Meilisearch configuration & environment
@@ -0,0 +1,19 @@
1
+ module MeiliSearch
2
+ module Rails
3
+ class MSCleanUpJob < ::ActiveJob::Base
4
+ queue_as :meilisearch
5
+
6
+ def perform(documents)
7
+ documents.each do |document|
8
+ index = MeiliSearch::Rails.client.index(document[:index_uid])
9
+
10
+ if document[:synchronous]
11
+ index.delete_document!(document[:primary_key])
12
+ else
13
+ index.delete_document(document[:primary_key])
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,84 @@
1
+ module MeiliSearch
2
+ module Rails
3
+ class MultiSearchResult
4
+ attr_reader :metadata
5
+
6
+ def initialize(searches, raw_results)
7
+ @results = {}
8
+ @metadata = {}
9
+
10
+ searches.zip(raw_results['results']).each do |(index_target, search_options), result|
11
+ index_target = search_options[:class_name].constantize if search_options[:class_name]
12
+
13
+ @results[index_target] = case index_target
14
+ when String, Symbol
15
+ result['hits']
16
+ else
17
+ load_results(index_target, result)
18
+ end
19
+
20
+ @metadata[index_target] = result.except('hits')
21
+ end
22
+ end
23
+
24
+ include Enumerable
25
+
26
+ def each_hit(&block)
27
+ @results.each do |_index_target, results|
28
+ results.each(&block)
29
+ end
30
+ end
31
+ alias each each_hit
32
+
33
+ def each_result(&block)
34
+ @results.each(&block)
35
+ end
36
+
37
+ def to_a
38
+ @results.values.flatten(1)
39
+ end
40
+ alias to_ary to_a
41
+
42
+ def to_h
43
+ @results
44
+ end
45
+ alias to_hash to_h
46
+
47
+ private
48
+
49
+ def load_results(klass, result)
50
+ pk_method = klass.ms_primary_key_method
51
+ pk_method = pk_method.in if Utilities.mongo_model?(klass)
52
+
53
+ condition_key = pk_is_virtual?(klass, pk_method) ? klass.primary_key : pk_method
54
+
55
+ hits_by_id =
56
+ result['hits'].index_by { |hit| hit[condition_key.to_s] }
57
+
58
+ records = klass.where(condition_key => hits_by_id.keys)
59
+
60
+ if records.respond_to? :in_order_of
61
+ records.in_order_of(condition_key, hits_by_id.keys).each do |record|
62
+ record.formatted = hits_by_id[record.send(condition_key).to_s]['_formatted']
63
+ end
64
+ else
65
+ results_by_id = records.index_by do |hit|
66
+ hit.send(condition_key).to_s
67
+ end
68
+
69
+ result['hits'].filter_map do |hit|
70
+ record = results_by_id[hit[condition_key.to_s].to_s]
71
+ record&.formatted = hit['_formatted']
72
+ record
73
+ end
74
+ end
75
+ end
76
+
77
+ def pk_is_virtual?(model_class, pk_method)
78
+ model_class.columns
79
+ .map(&(Utilities.sequel_model?(model_class) ? :to_s : :name))
80
+ .exclude?(pk_method.to_s)
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,49 @@
1
+ require_relative 'multi_search/result'
2
+
3
+ module MeiliSearch
4
+ module Rails
5
+ class << self
6
+ def multi_search(searches)
7
+ search_parameters = searches.map do |(index_target, options)|
8
+ paginate(options) if pagination_enabled?
9
+ normalize(options, index_target)
10
+ end
11
+
12
+ MultiSearchResult.new(searches, client.multi_search(search_parameters))
13
+ end
14
+
15
+ private
16
+
17
+ def normalize(options, index_target)
18
+ options
19
+ .except(:class_name)
20
+ .merge!(index_uid: index_uid_from_target(index_target))
21
+ end
22
+
23
+ def index_uid_from_target(index_target)
24
+ case index_target
25
+ when String, Symbol
26
+ index_target
27
+ else
28
+ index_target.index.uid
29
+ end
30
+ end
31
+
32
+ def paginate(options)
33
+ %w[page hitsPerPage hits_per_page].each do |key|
34
+ # Deletes hitsPerPage to avoid passing along a meilisearch-ruby warning/exception
35
+ value = options.delete(key) || options.delete(key.to_sym)
36
+ options[key.underscore.to_sym] = value.to_i if value
37
+ end
38
+
39
+ # It is required to activate the finite pagination in Meilisearch v0.30 (or newer),
40
+ # to have at least `hits_per_page` defined or `page` in the search request.
41
+ options[:page] ||= 1
42
+ end
43
+
44
+ def pagination_enabled?
45
+ MeiliSearch::Rails.configuration[:pagination_backend]
46
+ end
47
+ end
48
+ end
49
+ end
@@ -18,7 +18,7 @@ module MeiliSearch
18
18
 
19
19
  def self.log_pagy_error
20
20
  MeiliSearch::Rails.logger
21
- .warning('[meilisearch-rails] Remove `pagination_backend: :pagy` from your initializer, `pagy` it is not required for `pagy`')
21
+ .warn('[meilisearch-rails] Remove `pagination_backend: :pagy` from your initializer, `pagy` it is not required for `pagy`')
22
22
  end
23
23
 
24
24
  def self.load_pagination!(pagination_backend, results, total_hits, options)
@@ -48,6 +48,14 @@ module MeiliSearch
48
48
  true
49
49
  end
50
50
 
51
+ def mongo_model?(model_class)
52
+ defined?(::Mongoid::Document) && model_class.include?(::Mongoid::Document)
53
+ end
54
+
55
+ def sequel_model?(model_class)
56
+ defined?(::Sequel::Model) && model_class < Sequel::Model
57
+ end
58
+
51
59
  private
52
60
 
53
61
  def constraint_passes?(record, constraint)
@@ -2,7 +2,7 @@
2
2
 
3
3
  module MeiliSearch
4
4
  module Rails
5
- VERSION = '0.10.2'
5
+ VERSION = '0.14.0'
6
6
 
7
7
  def self.qualified_version
8
8
  "Meilisearch Rails (v#{VERSION})"
@@ -3,6 +3,7 @@ require 'meilisearch/rails/null_object'
3
3
  require 'meilisearch/rails/version'
4
4
  require 'meilisearch/rails/utilities'
5
5
  require 'meilisearch/rails/errors'
6
+ require 'meilisearch/rails/multi_search'
6
7
 
7
8
  if defined? Rails
8
9
  begin
@@ -66,6 +67,7 @@ module MeiliSearch
66
67
  pagination
67
68
  faceting
68
69
  typo_tolerance
70
+ proximity_precision
69
71
  ].freeze
70
72
 
71
73
  CAMELIZE_OPTIONS = %i[pagination faceting typo_tolerance].freeze
@@ -249,6 +251,7 @@ module MeiliSearch
249
251
  # lazy load the ActiveJob class to ensure the
250
252
  # queue is initialized before using it
251
253
  autoload :MSJob, 'meilisearch/rails/ms_job'
254
+ autoload :MSCleanUpJob, 'meilisearch/rails/ms_clean_up_job'
252
255
  end
253
256
 
254
257
  # this class wraps an MeiliSearch::Index document ensuring all raised exceptions
@@ -282,6 +285,15 @@ module MeiliSearch
282
285
  end
283
286
  end
284
287
 
288
+ # Maually define facet_search due to complications with **opts in ruby 2.*
289
+ def facet_search(*args, **opts)
290
+ SafeIndex.log_or_throw(:facet_search, @raise_on_failure) do
291
+ return MeiliSearch::Rails.black_hole unless MeiliSearch::Rails.active?
292
+
293
+ @index.facet_search(*args, **opts)
294
+ end
295
+ end
296
+
285
297
  # special handling of wait_for_task to handle null task_id
286
298
  def wait_for_task(task_uid)
287
299
  return if task_uid.nil? && !@raise_on_failure # ok
@@ -296,7 +308,7 @@ module MeiliSearch
296
308
  SafeIndex.log_or_throw(:settings, @raise_on_failure) do
297
309
  @index.settings(*args)
298
310
  rescue ::MeiliSearch::ApiError => e
299
- return {} if e.code == 404 # not fatal
311
+ return {} if e.code == 'index_not_found' # not fatal
300
312
 
301
313
  raise e
302
314
  end
@@ -373,7 +385,11 @@ module MeiliSearch
373
385
 
374
386
  proc = if options[:enqueue] == true
375
387
  proc do |record, remove|
376
- MSJob.perform_later(record, remove ? 'ms_remove_from_index!' : 'ms_index!')
388
+ if remove
389
+ MSCleanUpJob.perform_later(record.ms_entries)
390
+ else
391
+ MSJob.perform_later(record, 'ms_index!')
392
+ end
377
393
  end
378
394
  elsif options[:enqueue].respond_to?(:call)
379
395
  options[:enqueue]
@@ -445,7 +461,7 @@ module MeiliSearch
445
461
  end
446
462
  end
447
463
  elsif respond_to?(:after_destroy)
448
- after_destroy { |searchable| searchable.ms_enqueue_remove_from_index!(ms_synchronous?) }
464
+ after_destroy_commit { |searchable| searchable.ms_enqueue_remove_from_index!(ms_synchronous?) }
449
465
  end
450
466
  end
451
467
 
@@ -526,7 +542,8 @@ module MeiliSearch
526
542
  def ms_index!(document, synchronous = false)
527
543
  return if ms_without_auto_index_scope
528
544
 
529
- ms_configurations.each do |options, settings|
545
+ # MS tasks to be returned
546
+ ms_configurations.map do |options, settings|
530
547
  next if ms_indexing_disabled?(options)
531
548
 
532
549
  primary_key = ms_primary_key_of(document, options)
@@ -550,8 +567,20 @@ module MeiliSearch
550
567
  index.delete_document(primary_key)
551
568
  end
552
569
  end
570
+ end.compact
571
+ end
572
+
573
+ def ms_entries_for(document:, synchronous:)
574
+ primary_key = ms_primary_key_of(document)
575
+ raise ArgumentError, 'Cannot index a record without a primary key' if primary_key.blank?
576
+
577
+ ms_configurations.filter_map do |options, settings|
578
+ {
579
+ synchronous: synchronous || options[:synchronous],
580
+ index_uid: ms_index_uid(options),
581
+ primary_key: primary_key
582
+ }.with_indifferent_access unless ms_indexing_disabled?(options)
553
583
  end
554
- nil
555
584
  end
556
585
 
557
586
  def ms_remove_from_index!(document, synchronous = false)
@@ -733,35 +762,45 @@ module MeiliSearch
733
762
  false
734
763
  end
735
764
 
765
+ def ms_primary_key_method(options = nil)
766
+ options ||= meilisearch_options
767
+ options[:primary_key] || options[:id] || :id
768
+ end
769
+
736
770
  protected
737
771
 
738
- def ms_ensure_init(options = nil, settings = nil, index_settings = nil)
772
+ def ms_ensure_init(options = meilisearch_options, settings = meilisearch_settings, user_configuration = settings.to_settings)
739
773
  raise ArgumentError, 'No `meilisearch` block found in your model.' if meilisearch_settings.nil?
740
774
 
741
775
  @ms_indexes ||= { true => {}, false => {} }
742
776
 
743
- options ||= meilisearch_options
744
- settings ||= meilisearch_settings
777
+ @ms_indexes[MeiliSearch::Rails.active?][settings] ||= SafeIndex.new(ms_index_uid(options), meilisearch_options[:raise_on_failure], meilisearch_options)
745
778
 
746
- return @ms_indexes[MeiliSearch::Rails.active?][settings] if @ms_indexes[MeiliSearch::Rails.active?][settings]
779
+ update_settings_if_changed(@ms_indexes[MeiliSearch::Rails.active?][settings], options, user_configuration)
747
780
 
748
- @ms_indexes[MeiliSearch::Rails.active?][settings] = SafeIndex.new(ms_index_uid(options), meilisearch_options[:raise_on_failure], meilisearch_options)
781
+ @ms_indexes[MeiliSearch::Rails.active?][settings]
782
+ end
749
783
 
750
- current_settings = @ms_indexes[MeiliSearch::Rails.active?][settings].settings(getVersion: 1) rescue nil # if the index doesn't exist
784
+ private
751
785
 
752
- index_settings ||= settings.to_settings
753
- index_settings = options[:primary_settings].to_settings.merge(index_settings) if options[:inherit]
786
+ def update_settings_if_changed(index, options, user_configuration)
787
+ server_state = index.settings
788
+ user_configuration = options[:primary_settings].to_settings.merge(user_configuration) if options[:inherit]
754
789
 
755
- options[:check_settings] = true if options[:check_settings].nil?
790
+ config = user_configuration.except(:attributes_to_highlight, :attributes_to_crop, :crop_length)
756
791
 
757
- if !ms_indexing_disabled?(options) && options[:check_settings] && meilisearch_settings_changed?(current_settings, index_settings)
758
- @ms_indexes[MeiliSearch::Rails.active?][settings].update_settings(index_settings)
792
+ if !skip_checking_settings?(options) && meilisearch_settings_changed?(server_state, config)
793
+ index.update_settings(user_configuration)
759
794
  end
795
+ end
760
796
 
761
- @ms_indexes[MeiliSearch::Rails.active?][settings]
797
+ def skip_checking_settings?(options)
798
+ ms_indexing_disabled?(options) || ms_checking_disabled?(options)
762
799
  end
763
800
 
764
- private
801
+ def ms_checking_disabled?(options)
802
+ options[:check_settings] == false
803
+ end
765
804
 
766
805
  def ms_configurations
767
806
  raise ArgumentError, 'No `meilisearch` block found in your model.' if meilisearch_settings.nil?
@@ -782,11 +821,6 @@ module MeiliSearch
782
821
  @configurations
783
822
  end
784
823
 
785
- def ms_primary_key_method(options = nil)
786
- options ||= meilisearch_options
787
- options[:primary_key] || options[:id] || :id
788
- end
789
-
790
824
  def ms_primary_key_of(doc, options = nil)
791
825
  doc.send(ms_primary_key_method(options)).to_s
792
826
  end
@@ -800,19 +834,22 @@ module MeiliSearch
800
834
  options[:primary_key] || MeiliSearch::Rails::IndexSettings::DEFAULT_PRIMARY_KEY
801
835
  end
802
836
 
803
- def meilisearch_settings_changed?(prev, current)
804
- return true if prev.nil?
837
+ def meilisearch_settings_changed?(server_state, user_configuration)
838
+ return true if server_state.nil?
839
+
840
+ user_configuration.transform_keys! { |key| key.to_s.camelize(:lower) }
841
+
842
+ user_configuration.any? do |key, user|
843
+ server = server_state[key]
805
844
 
806
- current.each do |k, v|
807
- prev_v = prev[k.to_s]
808
- if v.is_a?(Array) && prev_v.is_a?(Array)
809
- # compare array of strings, avoiding symbols VS strings comparison
810
- return true if v.map(&:to_s) != prev_v.map(&:to_s)
811
- elsif prev_v != v
812
- return true
845
+ if user.is_a?(Hash) && server.is_a?(Hash)
846
+ meilisearch_settings_changed?(server, user)
847
+ elsif user.is_a?(Array) && server.is_a?(Array)
848
+ user.map(&:to_s).sort! != server.map(&:to_s).sort!
849
+ else
850
+ user.to_s != server.to_s
813
851
  end
814
852
  end
815
- false
816
853
  end
817
854
 
818
855
  def ms_conditional_index?(options = nil)
@@ -923,6 +960,10 @@ module MeiliSearch
923
960
  @ms_synchronous
924
961
  end
925
962
 
963
+ def ms_entries(synchronous = false)
964
+ self.class.ms_entries_for(document: self, synchronous: synchronous || ms_synchronous?)
965
+ end
966
+
926
967
  private
927
968
 
928
969
  def ms_mark_synchronous
@@ -32,7 +32,7 @@ Gem::Specification.new do |s|
32
32
  'Rakefile'
33
33
  ]
34
34
 
35
- s.required_ruby_version = '>= 2.6.0'
35
+ s.required_ruby_version = '>= 3.0.0'
36
36
 
37
- s.add_dependency 'meilisearch', '~> 0.26.0'
37
+ s.add_dependency 'meilisearch', '~> 0.28'
38
38
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: meilisearch-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.2
4
+ version: 0.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Meili
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-12-11 00:00:00.000000000 Z
11
+ date: 2024-07-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: meilisearch
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.26.0
19
+ version: '0.28'
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: 0.26.0
26
+ version: '0.28'
27
27
  description: Meilisearch integration for Ruby on Rails. See https://github.com/meilisearch/meilisearch
28
28
  email: bonjour@meilisearch.com
29
29
  executables: []
@@ -40,7 +40,10 @@ files:
40
40
  - lib/meilisearch-rails.rb
41
41
  - lib/meilisearch/rails/configuration.rb
42
42
  - lib/meilisearch/rails/errors.rb
43
+ - lib/meilisearch/rails/ms_clean_up_job.rb
43
44
  - lib/meilisearch/rails/ms_job.rb
45
+ - lib/meilisearch/rails/multi_search.rb
46
+ - lib/meilisearch/rails/multi_search/result.rb
44
47
  - lib/meilisearch/rails/null_object.rb
45
48
  - lib/meilisearch/rails/pagination.rb
46
49
  - lib/meilisearch/rails/pagination/kaminari.rb
@@ -63,14 +66,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
63
66
  requirements:
64
67
  - - ">="
65
68
  - !ruby/object:Gem::Version
66
- version: 2.6.0
69
+ version: 3.0.0
67
70
  required_rubygems_version: !ruby/object:Gem::Requirement
68
71
  requirements:
69
72
  - - ">="
70
73
  - !ruby/object:Gem::Version
71
74
  version: '0'
72
75
  requirements: []
73
- rubygems_version: 3.1.6
76
+ rubygems_version: 3.4.19
74
77
  signing_key:
75
78
  specification_version: 4
76
79
  summary: Meilisearch integration for Ruby on Rails.