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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2957f44b71394e8f2c6c3e3fa8aa3907b85ef4405c2cbb5230080383eebbe034
4
- data.tar.gz: 99ebb927e9194b10746355e5ba3ae44853fa4c1ee2e98f6818e910c073f01b8d
3
+ metadata.gz: 849d3f11092d279468f2303406fac8ed52849490cd5f044d0f111c2731593f76
4
+ data.tar.gz: 41ec2f87a63e74bb6c4237435490b381f80def5dee0f8393c3a40cd583386a03
5
5
  SHA512:
6
- metadata.gz: '08834c370f32354ad47eb1d904212e8535a5b47f89a705ad3aeb42bf7a4768b0dd51f4198b86855f3691c886ccac850f9ef88e6528433a90a9774d6d3bacff0c'
7
- data.tar.gz: 22ac7b9564df2fef7f23b5227578713d095492f615e9fa652c0d1fb55167d1d9188fda65e4b683db8d413cb38086e27930d1dd6077975b088fd89dfbd1ac8114
6
+ metadata.gz: c6fb870cced8f9e395f5bbc23404331d932b8ebe92921f9867ce53e4b682a114d4a39a0d319a44395fe9d2e4f5907752ca923febee4503b4fa23df437f2237ab
7
+ data.tar.gz: d74ded33afca229deb79ed57ab820c0737f1bb2b3f258aafa4155a3d29515e24a0b9cb5680d106d0ebd9e39892f9a9e45aed8a50b934669558b8c9c11d1eddb5
data/Gemfile CHANGED
@@ -29,6 +29,7 @@ group :test do
29
29
  gem 'jdbc-sqlite3', platform: :jruby
30
30
  gem 'rspec', '~> 3.0'
31
31
  gem 'simplecov', require: 'false'
32
+ gem 'threads'
32
33
 
33
34
  gem 'byebug'
34
35
  gem 'dotenv', '~> 2.7', '>= 2.7.6'
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
@@ -2,7 +2,7 @@
2
2
 
3
3
  module MeiliSearch
4
4
  module Rails
5
- VERSION = '0.7.1'
5
+ VERSION = '0.7.3'
6
6
 
7
7
  def self.qualified_version
8
8
  "Meilisearch Rails (v#{VERSION})"
@@ -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 if set' if options[:synchronous]
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| !ms_indexable?(d, options) }.map { |d| ms_primary_key_of(d, options) }
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| ms_indexable?(d, options) }
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 ms_indexable?(document, options)
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.1
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-08-01 00:00:00.000000000 Z
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