meilisearch-rails 0.7.1 → 0.7.3
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 -0
- data/README.md +36 -0
- data/lib/meilisearch/rails/configuration.rb +32 -0
- data/lib/meilisearch/rails/null_object.rb +25 -0
- data/lib/meilisearch/rails/utilities.rb +25 -0
- data/lib/meilisearch/rails/version.rb +1 -1
- data/lib/meilisearch-rails.rb +20 -40
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 849d3f11092d279468f2303406fac8ed52849490cd5f044d0f111c2731593f76
|
4
|
+
data.tar.gz: 41ec2f87a63e74bb6c4237435490b381f80def5dee0f8393c3a40cd583386a03
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c6fb870cced8f9e395f5bbc23404331d932b8ebe92921f9867ce53e4b682a114d4a39a0d319a44395fe9d2e4f5907752ca923febee4503b4fa23df437f2237ab
|
7
|
+
data.tar.gz: d74ded33afca229deb79ed57ab820c0737f1bb2b3f258aafa4155a3d29515e24a0b9cb5680d106d0ebd9e39892f9a9e45aed8a50b934669558b8c9c11d1eddb5
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -254,6 +254,42 @@ Book.search('*', sort: ['title:asc'])
|
|
254
254
|
|
255
255
|
### Meilisearch configuration & environment
|
256
256
|
|
257
|
+
#### Deactivate Meilisearch in certain moments
|
258
|
+
|
259
|
+
By default HTTP connections to the Meilisearch URL is always active, but sometimes you want to disable the HTTP requests in a particular moment or environment.<br>
|
260
|
+
you have multiple ways to achieve this.
|
261
|
+
|
262
|
+
By adding `active: false` in the configuration initializer:
|
263
|
+
|
264
|
+
```ruby
|
265
|
+
MeiliSearch::Rails.configuration = {
|
266
|
+
meilisearch_host: 'YourMeilisearchHost',
|
267
|
+
meilisearch_api_key: 'YourMeilisearchAPIKey',
|
268
|
+
active: false
|
269
|
+
}
|
270
|
+
```
|
271
|
+
|
272
|
+
Or you can disable programmatically:
|
273
|
+
|
274
|
+
```ruby
|
275
|
+
MeiliSearch::Rails.deactivate! # all the following HTTP calls will be dismissed.
|
276
|
+
|
277
|
+
# or you can pass a block to it:
|
278
|
+
|
279
|
+
MeiliSearch::Rails.deactivate! do
|
280
|
+
# every Meilisearch call here will be dismissed, no error will be raised.
|
281
|
+
# after the block, Meilisearch state will be active.
|
282
|
+
end
|
283
|
+
```
|
284
|
+
|
285
|
+
You can also activate if you deactivated earlier:
|
286
|
+
|
287
|
+
```ruby
|
288
|
+
MeiliSearch::Rails.activate!
|
289
|
+
```
|
290
|
+
|
291
|
+
:warning: These calls are persistent, so prefer to use the method with the block. This way, you will not forget to activate it afterward.
|
292
|
+
|
257
293
|
#### Custom index_uid <!-- omit in toc -->
|
258
294
|
|
259
295
|
By default, the **index_uid** will be the class name, e.g. `Book`. You can customize the index_uid by using the `index_uid:` option.
|
@@ -11,7 +11,39 @@ module MeiliSearch
|
|
11
11
|
@_config = configuration
|
12
12
|
end
|
13
13
|
|
14
|
+
def deactivate!
|
15
|
+
semaphore.synchronize do
|
16
|
+
@_config.merge!(active: false)
|
17
|
+
|
18
|
+
return unless block_given?
|
19
|
+
|
20
|
+
yield
|
21
|
+
|
22
|
+
@_config.merge!(active: true)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def activate!
|
27
|
+
semaphore.synchronize do
|
28
|
+
@_config.merge!(active: true)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def active?
|
33
|
+
configuration.fetch(:active, true)
|
34
|
+
end
|
35
|
+
|
36
|
+
def black_hole
|
37
|
+
@black_hole ||= NullObject.instance
|
38
|
+
end
|
39
|
+
|
40
|
+
def semaphore
|
41
|
+
@semaphore ||= Mutex.new
|
42
|
+
end
|
43
|
+
|
14
44
|
def client
|
45
|
+
return black_hole unless active?
|
46
|
+
|
15
47
|
::MeiliSearch::Client.new(
|
16
48
|
configuration[:meilisearch_host] || 'http://localhost:7700',
|
17
49
|
configuration[:meilisearch_api_key],
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
module MeiliSearch
|
4
|
+
module Rails
|
5
|
+
class NullObject
|
6
|
+
include Singleton
|
7
|
+
|
8
|
+
def map
|
9
|
+
[]
|
10
|
+
end
|
11
|
+
|
12
|
+
def nil?
|
13
|
+
true
|
14
|
+
end
|
15
|
+
|
16
|
+
def method_missing(_method, *_args, &_block)
|
17
|
+
self
|
18
|
+
end
|
19
|
+
|
20
|
+
def respond_to_missing?(_method_name, _include_private = false)
|
21
|
+
false
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -40,6 +40,31 @@ module MeiliSearch
|
|
40
40
|
klass.ms_set_settings
|
41
41
|
end
|
42
42
|
end
|
43
|
+
|
44
|
+
def indexable?(record, options)
|
45
|
+
return false unless options[:if].blank? || constraint_passes?(record, options[:if])
|
46
|
+
return false unless options[:unless].blank? || !constraint_passes?(record, options[:unless])
|
47
|
+
|
48
|
+
true
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def constraint_passes?(record, constraint)
|
54
|
+
case constraint
|
55
|
+
when Symbol
|
56
|
+
record.send(constraint)
|
57
|
+
when String
|
58
|
+
record.send(constraint.to_sym)
|
59
|
+
when Enumerable
|
60
|
+
# All constraints must pass
|
61
|
+
constraint.all? { |inner_constraint| constraint_passes?(record, inner_constraint) }
|
62
|
+
else
|
63
|
+
raise ArgumentError, "Unknown constraint type: #{constraint} (#{constraint.class})" unless constraint.respond_to?(:call)
|
64
|
+
|
65
|
+
constraint.call(record)
|
66
|
+
end
|
67
|
+
end
|
43
68
|
end
|
44
69
|
end
|
45
70
|
end
|
data/lib/meilisearch-rails.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'meilisearch'
|
2
|
-
|
2
|
+
require 'meilisearch/rails/null_object'
|
3
3
|
require 'meilisearch/rails/version'
|
4
4
|
require 'meilisearch/rails/utilities'
|
5
5
|
require 'meilisearch/rails/errors'
|
@@ -249,7 +249,10 @@ module MeiliSearch
|
|
249
249
|
args[0].delete(:attributesToCrop) if args[0][:attributesToCrop]
|
250
250
|
args[0].delete(:cropLength) if args[0][:cropLength]
|
251
251
|
end
|
252
|
+
|
252
253
|
SafeIndex.log_or_throw(m, @raise_on_failure) do
|
254
|
+
return MeiliSearch::Rails.black_hole unless MeiliSearch::Rails.active?
|
255
|
+
|
253
256
|
@index.send(m, *args, &block)
|
254
257
|
end
|
255
258
|
end
|
@@ -342,7 +345,7 @@ module MeiliSearch
|
|
342
345
|
end
|
343
346
|
end
|
344
347
|
if options[:enqueue]
|
345
|
-
raise ArgumentError, 'Cannot use a enqueue if the `synchronous` option
|
348
|
+
raise ArgumentError, 'Cannot use a enqueue if the `synchronous` option is set' if options[:synchronous]
|
346
349
|
|
347
350
|
proc = if options[:enqueue] == true
|
348
351
|
proc do |record, remove|
|
@@ -452,10 +455,10 @@ module MeiliSearch
|
|
452
455
|
ms_find_in_batches(batch_size) do |group|
|
453
456
|
if ms_conditional_index?(options)
|
454
457
|
# delete non-indexable documents
|
455
|
-
ids = group.select { |d| !
|
458
|
+
ids = group.select { |d| !Utilities.indexable?(d, options) }.map { |d| ms_primary_key_of(d, options) }
|
456
459
|
index.delete_documents(ids.select(&:present?))
|
457
460
|
# select only indexable documents
|
458
|
-
group = group.select { |d|
|
461
|
+
group = group.select { |d| Utilities.indexable?(d, options) }
|
459
462
|
end
|
460
463
|
documents = group.map do |d|
|
461
464
|
attributes = settings.get_attributes(d)
|
@@ -502,7 +505,7 @@ module MeiliSearch
|
|
502
505
|
|
503
506
|
primary_key = ms_primary_key_of(document, options)
|
504
507
|
index = ms_ensure_init(options, settings)
|
505
|
-
if
|
508
|
+
if Utilities.indexable?(document, options)
|
506
509
|
raise ArgumentError, 'Cannot index a record without a primary key' if primary_key.blank?
|
507
510
|
|
508
511
|
doc = settings.get_attributes(document)
|
@@ -550,7 +553,7 @@ module MeiliSearch
|
|
550
553
|
|
551
554
|
index = ms_ensure_init(options, settings)
|
552
555
|
synchronous || options[:synchronous] ? index.delete_all_documents! : index.delete_all_documents
|
553
|
-
@ms_indexes[settings] = nil
|
556
|
+
@ms_indexes[MeiliSearch::Rails.active?][settings] = nil
|
554
557
|
end
|
555
558
|
nil
|
556
559
|
end
|
@@ -599,12 +602,12 @@ module MeiliSearch
|
|
599
602
|
|
600
603
|
def ms_search(query, params = {})
|
601
604
|
if MeiliSearch::Rails.configuration[:pagination_backend]
|
602
|
-
|
603
605
|
page = params[:page].nil? ? params[:page] : params[:page].to_i
|
604
606
|
hits_per_page = params[:hitsPerPage].nil? ? params[:hitsPerPage] : params[:hitsPerPage].to_i
|
607
|
+
hits_per_page ||= params[:hits_per_page].nil? ? params[:hits_per_page] : params[:hits_per_page].to_i
|
608
|
+
|
609
|
+
%i[page hitsPerPage hits_per_page].each { |param| params.delete(param) }
|
605
610
|
|
606
|
-
params.delete(:page)
|
607
|
-
params.delete(:hitsPerPage)
|
608
611
|
params[:limit] = 200
|
609
612
|
end
|
610
613
|
|
@@ -720,16 +723,16 @@ module MeiliSearch
|
|
720
723
|
def ms_ensure_init(options = nil, settings = nil, index_settings = nil)
|
721
724
|
raise ArgumentError, 'No `meilisearch` block found in your model.' if meilisearch_settings.nil?
|
722
725
|
|
723
|
-
@ms_indexes ||= {}
|
726
|
+
@ms_indexes ||= { true => {}, false => {} }
|
724
727
|
|
725
728
|
options ||= meilisearch_options
|
726
729
|
settings ||= meilisearch_settings
|
727
730
|
|
728
|
-
return @ms_indexes[settings] if @ms_indexes[settings]
|
731
|
+
return @ms_indexes[MeiliSearch::Rails.active?][settings] if @ms_indexes[MeiliSearch::Rails.active?][settings]
|
729
732
|
|
730
|
-
@ms_indexes[settings] = SafeIndex.new(ms_index_uid(options), meilisearch_options[:raise_on_failure], meilisearch_options)
|
733
|
+
@ms_indexes[MeiliSearch::Rails.active?][settings] = SafeIndex.new(ms_index_uid(options), meilisearch_options[:raise_on_failure], meilisearch_options)
|
731
734
|
|
732
|
-
current_settings = @ms_indexes[settings].settings(getVersion: 1) rescue nil # if the index doesn't exist
|
735
|
+
current_settings = @ms_indexes[MeiliSearch::Rails.active?][settings].settings(getVersion: 1) rescue nil # if the index doesn't exist
|
733
736
|
|
734
737
|
index_settings ||= settings.to_settings
|
735
738
|
index_settings = options[:primary_settings].to_settings.merge(index_settings) if options[:inherit]
|
@@ -737,10 +740,10 @@ module MeiliSearch
|
|
737
740
|
options[:check_settings] = true if options[:check_settings].nil?
|
738
741
|
|
739
742
|
if !ms_indexing_disabled?(options) && options[:check_settings] && meilisearch_settings_changed?(current_settings, index_settings)
|
740
|
-
@ms_indexes[settings].update_settings(index_settings)
|
743
|
+
@ms_indexes[MeiliSearch::Rails.active?][settings].update_settings(index_settings)
|
741
744
|
end
|
742
745
|
|
743
|
-
@ms_indexes[settings]
|
746
|
+
@ms_indexes[MeiliSearch::Rails.active?][settings]
|
744
747
|
end
|
745
748
|
|
746
749
|
private
|
@@ -802,31 +805,6 @@ module MeiliSearch
|
|
802
805
|
options[:if].present? || options[:unless].present?
|
803
806
|
end
|
804
807
|
|
805
|
-
def ms_indexable?(document, options = nil)
|
806
|
-
options ||= meilisearch_options
|
807
|
-
if_passes = options[:if].blank? || ms_constraint_passes?(document, options[:if])
|
808
|
-
unless_passes = options[:unless].blank? || !ms_constraint_passes?(document, options[:unless])
|
809
|
-
if_passes && unless_passes
|
810
|
-
end
|
811
|
-
|
812
|
-
def ms_constraint_passes?(document, constraint)
|
813
|
-
case constraint
|
814
|
-
when Symbol
|
815
|
-
document.send(constraint)
|
816
|
-
when String
|
817
|
-
document.send(constraint.to_sym)
|
818
|
-
when Enumerable
|
819
|
-
# All constraints must pass
|
820
|
-
constraint.all? { |inner_constraint| ms_constraint_passes?(document, inner_constraint) }
|
821
|
-
else
|
822
|
-
unless constraint.respond_to?(:call)
|
823
|
-
raise ArgumentError, "Unknown constraint type: #{constraint} (#{constraint.class})"
|
824
|
-
end
|
825
|
-
|
826
|
-
constraint.call(document)
|
827
|
-
end
|
828
|
-
end
|
829
|
-
|
830
808
|
def ms_indexing_disabled?(options = nil)
|
831
809
|
options ||= meilisearch_options
|
832
810
|
constraint = options[:disable_indexing] || options['disable_indexing']
|
@@ -902,6 +880,8 @@ module MeiliSearch
|
|
902
880
|
end
|
903
881
|
|
904
882
|
def ms_enqueue_index!(synchronous)
|
883
|
+
return unless Utilities.indexable?(self, meilisearch_options)
|
884
|
+
|
905
885
|
if meilisearch_options[:enqueue]
|
906
886
|
unless self.class.send(:ms_indexing_disabled?, meilisearch_options)
|
907
887
|
meilisearch_options[:enqueue].call(self, false)
|
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.7.
|
4
|
+
version: 0.7.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Meili
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-09-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: meilisearch
|
@@ -41,6 +41,7 @@ files:
|
|
41
41
|
- lib/meilisearch/rails/configuration.rb
|
42
42
|
- lib/meilisearch/rails/errors.rb
|
43
43
|
- lib/meilisearch/rails/ms_job.rb
|
44
|
+
- lib/meilisearch/rails/null_object.rb
|
44
45
|
- lib/meilisearch/rails/pagination.rb
|
45
46
|
- lib/meilisearch/rails/pagination/kaminari.rb
|
46
47
|
- lib/meilisearch/rails/pagination/will_paginate.rb
|