meilisearch-rails 0.10.2 → 0.14.0
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 +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.
|