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 +4 -4
- data/Gemfile +1 -1
- data/LICENSE +1 -1
- data/README.md +56 -2
- data/lib/meilisearch/rails/ms_clean_up_job.rb +19 -0
- data/lib/meilisearch/rails/multi_search/result.rb +84 -0
- data/lib/meilisearch/rails/multi_search.rb +49 -0
- data/lib/meilisearch/rails/pagination.rb +1 -1
- data/lib/meilisearch/rails/utilities.rb +8 -0
- data/lib/meilisearch/rails/version.rb +1 -1
- data/lib/meilisearch-rails.rb +74 -33
- data/meilisearch-rails.gemspec +2 -2
- metadata +9 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ba5387112e0280c13ed074d356fdaa706c14a933d0a2ae540f16ecad75829db3
|
4
|
+
data.tar.gz: 04560a2a843b527439d02abddf63d23ab218860e06fa6005ca4d5cc2cdf939cc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8e3ca9d2407f083234b5a925ed31285d67d705c7e97ac07840989061a75ae6fbc9cdbf6e2f179d40f13d7b5751967727caaf872ae1d8b80a39494e6732692155
|
7
|
+
data.tar.gz: 2d97cf8dee950fb9d9afe58b78eac6e4df2131eb0864a4a5b44bd247e97f79b759a66f6cf1882da37d7dca3a03b909ff5aacc71bd8063bf04e27ccf9b8dd4871
|
data/Gemfile
CHANGED
data/LICENSE
CHANGED
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
|
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
|
-
|
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
|
-
.
|
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)
|
data/lib/meilisearch-rails.rb
CHANGED
@@ -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 ==
|
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
|
-
|
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
|
-
|
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
|
-
|
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 =
|
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
|
-
|
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
|
-
|
779
|
+
update_settings_if_changed(@ms_indexes[MeiliSearch::Rails.active?][settings], options, user_configuration)
|
747
780
|
|
748
|
-
@ms_indexes[MeiliSearch::Rails.active?][settings]
|
781
|
+
@ms_indexes[MeiliSearch::Rails.active?][settings]
|
782
|
+
end
|
749
783
|
|
750
|
-
|
784
|
+
private
|
751
785
|
|
752
|
-
|
753
|
-
|
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
|
-
|
790
|
+
config = user_configuration.except(:attributes_to_highlight, :attributes_to_crop, :crop_length)
|
756
791
|
|
757
|
-
if !
|
758
|
-
|
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
|
-
|
797
|
+
def skip_checking_settings?(options)
|
798
|
+
ms_indexing_disabled?(options) || ms_checking_disabled?(options)
|
762
799
|
end
|
763
800
|
|
764
|
-
|
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?(
|
804
|
-
return true if
|
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
|
-
|
807
|
-
|
808
|
-
|
809
|
-
|
810
|
-
|
811
|
-
|
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
|
data/meilisearch-rails.gemspec
CHANGED
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.
|
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:
|
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.
|
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
|
+
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:
|
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.
|
76
|
+
rubygems_version: 3.4.19
|
74
77
|
signing_key:
|
75
78
|
specification_version: 4
|
76
79
|
summary: Meilisearch integration for Ruby on Rails.
|