meilisearch-rails 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +23 -16
- data/README.md +20 -26
- data/Rakefile +4 -3
- data/lib/meilisearch/configuration.rb +5 -3
- data/lib/meilisearch/errors.rb +12 -0
- data/lib/meilisearch/pagination/kaminari.rb +8 -6
- data/lib/meilisearch/pagination/will_paginate.rb +3 -2
- data/lib/meilisearch/pagination.rb +5 -6
- data/lib/meilisearch/railtie.rb +2 -1
- data/lib/meilisearch/tasks/meilisearch.rake +8 -10
- data/lib/meilisearch/utilities.rb +9 -14
- data/lib/meilisearch/version.rb +3 -1
- data/lib/meilisearch-rails.rb +197 -180
- data/meilisearch-rails.gemspec +25 -35
- metadata +4 -5
- data/spec/spec_helper.rb +0 -52
- data/spec/utilities_spec.rb +0 -36
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9e05e5ed1e5210587bd2797412b0f5509b77151a620b79e4e8047c6c1722c3fb
|
4
|
+
data.tar.gz: cfb5a6a39cf21caa0532ae40d005a8c7fd3fff30dbbfa02c90dd1f31f63259df
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7a3e738a240fcbdc903d3a58acc9d5d68992a5e1adb56401fcd30a03e81c1fddbcc2024bed1338934de84d366ef58cc9e069243ad6ab5ca78c1330414e4a90b9
|
7
|
+
data.tar.gz: 88228f931aafcbdd69fa483594c3842aaf7603dac277333107dc8629656e96f2fb0b0b57d84039b81b922f95cc9ef6322fb5745a4626058f135357779e227e0c
|
data/Gemfile
CHANGED
@@ -1,31 +1,38 @@
|
|
1
|
-
source
|
1
|
+
source 'http://rubygems.org'
|
2
2
|
|
3
3
|
gem 'json', '~> 2.5', '>= 2.5.1'
|
4
|
-
gem 'meilisearch', '~> 0.
|
4
|
+
gem 'meilisearch', '~> 0.17.0'
|
5
5
|
|
6
|
-
if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
|
7
|
-
|
6
|
+
gem 'rubysl', '~> 2.0', platform: :rbx if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
|
7
|
+
|
8
|
+
group :development do
|
9
|
+
gem 'rubocop', '~> 1.22'
|
10
|
+
gem 'rubocop-rails'
|
11
|
+
gem 'rubocop-rspec'
|
8
12
|
end
|
9
13
|
|
10
14
|
group :test do
|
11
|
-
rails_version = ENV[
|
12
|
-
|
15
|
+
rails_version = ENV['RAILS_VERSION'] || '5.2'
|
16
|
+
sequel_version = ENV['SEQUEL_VERSION'] ? "~> #{ENV['SEQUEL_VERSION']}" : '>= 4.0'
|
17
|
+
|
13
18
|
gem 'active_model_serializers'
|
19
|
+
gem 'rails', "~> #{rails_version}"
|
20
|
+
gem 'sequel', sequel_version
|
21
|
+
|
14
22
|
if Gem::Version.new(rails_version) >= Gem::Version.new('6.0')
|
15
|
-
gem 'sqlite3', '~> 1.4.0', :
|
23
|
+
gem 'sqlite3', '~> 1.4.0', platform: %i[rbx ruby]
|
16
24
|
else
|
17
|
-
gem 'sqlite3', '< 1.4.0', :
|
25
|
+
gem 'sqlite3', '< 1.4.0', platform: %i[rbx ruby]
|
18
26
|
end
|
27
|
+
|
28
|
+
gem 'activerecord-jdbc-adapter', platform: :jruby
|
29
|
+
gem 'activerecord-jdbcsqlite3-adapter', platform: :jruby
|
30
|
+
gem 'jdbc-sqlite3', platform: :jruby
|
19
31
|
gem 'rspec', '>= 2.5.0', '< 3.0'
|
20
|
-
gem 'jdbc-sqlite3', :platform => :jruby
|
21
|
-
gem 'activerecord-jdbc-adapter', :platform => :jruby
|
22
|
-
gem 'activerecord-jdbcsqlite3-adapter', :platform => :jruby
|
23
32
|
|
24
|
-
|
25
|
-
gem '
|
33
|
+
gem 'byebug'
|
34
|
+
gem 'dotenv', '~> 2.7', '>= 2.7.6'
|
26
35
|
gem 'faker', '~> 2.17'
|
27
|
-
gem 'will_paginate', '>= 2.3.15'
|
28
36
|
gem 'kaminari'
|
29
|
-
gem '
|
30
|
-
gem 'byebug'
|
37
|
+
gem 'will_paginate', '>= 2.3.15'
|
31
38
|
end
|
data/README.md
CHANGED
@@ -29,33 +29,26 @@
|
|
29
29
|
|
30
30
|
- [📖 Documentation](#-documentation)
|
31
31
|
- [🤖 Compatibility with MeiliSearch](#-compatibility-with-meilisearch)
|
32
|
-
- [
|
33
|
-
- [
|
32
|
+
- [🚀 Getting Started](#-getting-started)
|
33
|
+
- [⚙️ Settings](#️-settings)
|
34
34
|
- [🔍 Custom search](#-custom-search)
|
35
35
|
- [🪛 Options](#-options)
|
36
|
-
- [MeiliSearch configuration & environment](#meilisearch-configuration
|
37
|
-
- [Custom index_uid](#custom-index_uid)
|
38
|
-
- [Per-environment index_uid](#per-environment-index_uid)
|
36
|
+
- [MeiliSearch configuration & environment](#meilisearch-configuration--environment)
|
39
37
|
- [Index configuration](#index-configuration)
|
40
38
|
- [Custom attribute definition](#custom-attribute-definition)
|
41
39
|
- [Custom primary key](#custom-primary-key)
|
42
40
|
- [Conditional indexing](#conditional-indexing)
|
43
|
-
- [Target multiple indexes](#target-multiple-indexes)
|
44
41
|
- [Share a single index](#share-a-single-index)
|
45
|
-
- [Queues & background jobs](#queues
|
42
|
+
- [Queues & background jobs](#queues--background-jobs)
|
46
43
|
- [Relations](#relations)
|
47
44
|
- [Sanitize attributes](#sanitize-attributes)
|
48
45
|
- [UTF-8 encoding](#utf-8-encoding)
|
49
46
|
- [Manual operations](#manual-operations)
|
50
|
-
- [Indexing & deletion](#indexing
|
47
|
+
- [Indexing & deletion](#indexing--deletion)
|
51
48
|
- [Access the underlying index object](#access-the-underlying-index-object)
|
52
|
-
- [Development & testing](#development
|
53
|
-
|
54
|
-
|
55
|
-
- [Synchronous testing](#synchronous-testing)
|
56
|
-
- [Disable auto-indexing & auto-removal](#disable-auto-indexing-&-auto-removal)
|
57
|
-
- [⚙️ Development Workflow and Contributing](#️-development-workflow-and-contributing)
|
58
|
-
- [👏 Credits](#-credits)
|
49
|
+
- [Development & testing](#development--testing)
|
50
|
+
- [⚙️ Development workflow & contributing](#️-development-workflow--contributing)
|
51
|
+
- [👏 Credits](#--credits)
|
59
52
|
|
60
53
|
## 📖 Documentation
|
61
54
|
|
@@ -65,9 +58,9 @@ To learn more about MeiliSearch, check out our [Documentation](https://docs.meil
|
|
65
58
|
|
66
59
|
## 🤖 Compatibility with MeiliSearch
|
67
60
|
|
68
|
-
This package only guarantees the compatibility with the [version v0.
|
61
|
+
This package only guarantees the compatibility with the [version v0.24.0 of MeiliSearch](https://github.com/meilisearch/MeiliSearch/releases/tag/v0.24.0).
|
69
62
|
|
70
|
-
## 🔧 Installation
|
63
|
+
## 🔧 Installation <!-- omit in toc -->
|
71
64
|
|
72
65
|
This package requires Ruby version 2.6.0 or later and Rails 5.2 or later.
|
73
66
|
|
@@ -104,7 +97,7 @@ Create a new file `config/initializers/meilisearch.rb` to setup your `MEILISEARC
|
|
104
97
|
|
105
98
|
```ruby
|
106
99
|
MeiliSearch.configuration = {
|
107
|
-
meilisearch_host: 'YourMeiliSearchHost',
|
100
|
+
meilisearch_host: 'YourMeiliSearchHost', # example: http://localhost:7700
|
108
101
|
meilisearch_api_key: 'YourMeiliSearchAPIKey',
|
109
102
|
}
|
110
103
|
```
|
@@ -213,8 +206,9 @@ class Book < ApplicationRecord
|
|
213
206
|
'typo',
|
214
207
|
'words',
|
215
208
|
'attribute',
|
209
|
+
'sort',
|
216
210
|
'exactness',
|
217
|
-
'desc
|
211
|
+
'publication_year:desc'
|
218
212
|
]
|
219
213
|
synonyms nyc: ['new york']
|
220
214
|
|
@@ -242,7 +236,7 @@ Book.search('Harry', attributesToHighlight: ['*'])
|
|
242
236
|
|
243
237
|
### MeiliSearch configuration & environment
|
244
238
|
|
245
|
-
#### Custom index_uid
|
239
|
+
#### Custom index_uid <!-- omit in toc -->
|
246
240
|
|
247
241
|
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.
|
248
242
|
|
@@ -255,7 +249,7 @@ class Book < ActiveRecord::Base
|
|
255
249
|
end
|
256
250
|
```
|
257
251
|
|
258
|
-
#### Index UID according to the environment
|
252
|
+
#### Index UID according to the environment <!-- omit in toc -->
|
259
253
|
|
260
254
|
You can suffix the index UID with the current Rails environment using the following option:
|
261
255
|
|
@@ -341,7 +335,7 @@ class Book < ActiveRecord::Base
|
|
341
335
|
end
|
342
336
|
end
|
343
337
|
```
|
344
|
-
##### Target multiple indexes
|
338
|
+
##### Target multiple indexes <!-- omit in toc -->
|
345
339
|
|
346
340
|
You can index a record in several indexes using the `add_index` option:
|
347
341
|
|
@@ -637,7 +631,7 @@ index = Book.index
|
|
637
631
|
|
638
632
|
### Development & testing
|
639
633
|
|
640
|
-
#### Exceptions
|
634
|
+
#### Exceptions <!-- omit in toc -->
|
641
635
|
|
642
636
|
You can disable exceptions that could be raised while trying to reach MeiliSearch's API by using the `raise_on_failure` option:
|
643
637
|
|
@@ -651,9 +645,9 @@ class Book < ActiveRecord::Base
|
|
651
645
|
end
|
652
646
|
```
|
653
647
|
|
654
|
-
#### Testing
|
648
|
+
#### Testing <!-- omit in toc -->
|
655
649
|
|
656
|
-
##### Synchronous testing
|
650
|
+
##### Synchronous testing <!-- omit in toc -->
|
657
651
|
|
658
652
|
You can force indexing and removing to be synchronous by setting the following option:
|
659
653
|
|
@@ -667,7 +661,7 @@ end
|
|
667
661
|
```
|
668
662
|
🚨 This is only recommended for testing purposes, the gem will call the `wait_for_pending_update` method that will stop your code execution until the asynchronous task has been processed by MeilSearch.
|
669
663
|
|
670
|
-
##### Disable auto-indexing & auto-removal
|
664
|
+
##### Disable auto-indexing & auto-removal <!-- omit in toc -->
|
671
665
|
|
672
666
|
You can disable auto-indexing and auto-removing setting the following options:
|
673
667
|
|
data/Rakefile
CHANGED
@@ -2,8 +2,9 @@ require 'rubygems'
|
|
2
2
|
require 'rake'
|
3
3
|
|
4
4
|
require 'rdoc/task'
|
5
|
+
|
5
6
|
Rake::RDocTask.new do |rdoc|
|
6
|
-
version = File.exist?('VERSION') ? File.read('VERSION') :
|
7
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ''
|
7
8
|
|
8
9
|
rdoc.rdoc_dir = 'rdoc'
|
9
10
|
rdoc.title = "MeiliSearch Rails #{version}"
|
@@ -11,7 +12,7 @@ Rake::RDocTask.new do |rdoc|
|
|
11
12
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
12
13
|
end
|
13
14
|
|
14
|
-
require
|
15
|
+
require 'rspec/core/rake_task'
|
15
16
|
RSpec::Core::RakeTask.new(:spec)
|
16
17
|
|
17
|
-
task :
|
18
|
+
task default: :spec
|
@@ -1,16 +1,18 @@
|
|
1
1
|
module MeiliSearch
|
2
2
|
module Configuration
|
3
3
|
def configuration
|
4
|
-
|
4
|
+
raise NotConfigured if @_config.blank?
|
5
|
+
|
6
|
+
@_config
|
5
7
|
end
|
6
8
|
|
7
9
|
def configuration=(configuration)
|
8
|
-
|
10
|
+
@_config = configuration
|
9
11
|
end
|
10
12
|
|
11
13
|
def client
|
12
14
|
::MeiliSearch::Client.new(
|
13
|
-
configuration[:meilisearch_host],
|
15
|
+
configuration[:meilisearch_host] || 'http://localhost:7700',
|
14
16
|
configuration[:meilisearch_api_key],
|
15
17
|
configuration.slice(:timeout, :max_retries)
|
16
18
|
)
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module MeiliSearch
|
2
|
+
class NoBlockGiven < StandardError; end
|
3
|
+
|
4
|
+
class BadConfiguration < StandardError; end
|
5
|
+
|
6
|
+
class NotConfigured < StandardError
|
7
|
+
def message
|
8
|
+
'Please configure MeiliSearch. Set MeiliSearch.configuration = ' \
|
9
|
+
"{meilisearch_host: 'YOUR_MEILISEARCH_HOST', meilisearch_api_key: 'YOUR_API_KEY'}"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -1,13 +1,13 @@
|
|
1
1
|
unless defined? Kaminari
|
2
|
-
raise(MeiliSearch::BadConfiguration,
|
2
|
+
raise(MeiliSearch::BadConfiguration,
|
3
|
+
"MeiliSearch: Please add 'kaminari' to your Gemfile to use kaminari pagination backend")
|
3
4
|
end
|
4
5
|
|
5
|
-
require
|
6
|
+
require 'kaminari/models/array_extension'
|
6
7
|
|
7
8
|
module MeiliSearch
|
8
9
|
module Pagination
|
9
10
|
class Kaminari < ::Kaminari::PaginatableArray
|
10
|
-
|
11
11
|
def initialize(array, options)
|
12
12
|
if RUBY_VERSION >= '3'
|
13
13
|
super(array, **options)
|
@@ -16,12 +16,12 @@ module MeiliSearch
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
def limit(
|
19
|
+
def limit(_num)
|
20
20
|
# noop
|
21
21
|
self
|
22
22
|
end
|
23
23
|
|
24
|
-
def offset(
|
24
|
+
def offset(_num)
|
25
25
|
# noop
|
26
26
|
self
|
27
27
|
end
|
@@ -30,12 +30,14 @@ module MeiliSearch
|
|
30
30
|
def create(results, total_hits, options = {})
|
31
31
|
offset = ((options[:page] - 1) * options[:per_page])
|
32
32
|
array = new results, limit: options[:per_page], offset: offset, total_count: total_hits
|
33
|
-
|
33
|
+
|
34
|
+
if array.empty? && !results.empty?
|
34
35
|
# since Kaminari 0.16.0, you need to pad the results with nil values so it matches the offset param
|
35
36
|
# otherwise you'll get an empty array: https://github.com/amatsuda/kaminari/commit/29fdcfa8865f2021f710adaedb41b7a7b081e34d
|
36
37
|
results = ([nil] * offset) + results
|
37
38
|
array = new results, offset: offset, limit: options[:per_page], total_count: total_hits
|
38
39
|
end
|
40
|
+
|
39
41
|
array
|
40
42
|
end
|
41
43
|
end
|
@@ -1,14 +1,15 @@
|
|
1
1
|
begin
|
2
2
|
require 'will_paginate/collection'
|
3
3
|
rescue LoadError
|
4
|
-
raise(MeiliSearch::BadConfiguration,
|
4
|
+
raise(MeiliSearch::BadConfiguration,
|
5
|
+
"MeiliSearch: Please add 'will_paginate' to your Gemfile to use will_paginate pagination backend")
|
5
6
|
end
|
6
7
|
|
7
8
|
module MeiliSearch
|
8
9
|
module Pagination
|
9
10
|
class WillPaginate
|
10
11
|
def self.create(results, total_hits, options = {})
|
11
|
-
::WillPaginate::Collection.create(options[:page], options[:per_page], total_hits) do
|
12
|
+
::WillPaginate::Collection.create(options[:page], options[:per_page], total_hits) do |pager|
|
12
13
|
start = (options[:page] - 1) * options[:per_page]
|
13
14
|
paginated_results = results[start, options[:per_page]]
|
14
15
|
pager.replace paginated_results
|
@@ -1,19 +1,18 @@
|
|
1
1
|
module MeiliSearch
|
2
2
|
module Pagination
|
3
|
-
|
4
3
|
autoload :WillPaginate, 'meilisearch/pagination/will_paginate'
|
5
4
|
autoload :Kaminari, 'meilisearch/pagination/kaminari'
|
6
5
|
|
7
6
|
def self.create(results, total_hits, options = {})
|
8
7
|
return results if MeiliSearch.configuration[:pagination_backend].nil?
|
8
|
+
|
9
9
|
begin
|
10
|
-
backend = MeiliSearch.configuration[:pagination_backend].to_s.
|
11
|
-
|
12
|
-
|
10
|
+
backend = MeiliSearch.configuration[:pagination_backend].to_s.classify
|
11
|
+
|
12
|
+
::MeiliSearch::Pagination.const_get(backend).create(results, total_hits, options)
|
13
13
|
rescue NameError
|
14
|
-
raise(BadConfiguration,
|
14
|
+
raise(BadConfiguration, 'Unknown pagination backend')
|
15
15
|
end
|
16
16
|
end
|
17
|
-
|
18
17
|
end
|
19
18
|
end
|
data/lib/meilisearch/railtie.rb
CHANGED
@@ -1,19 +1,17 @@
|
|
1
1
|
namespace :meilisearch do
|
2
|
-
|
3
|
-
|
4
|
-
task :reindex => :environment do
|
2
|
+
desc 'Reindex all models'
|
3
|
+
task reindex: :environment do
|
5
4
|
MeiliSearch::Utilities.reindex_all_models
|
6
5
|
end
|
7
6
|
|
8
|
-
desc
|
9
|
-
task :
|
7
|
+
desc 'Set settings to all indexes'
|
8
|
+
task set_all_settings: :environment do
|
10
9
|
MeiliSearch::Utilities.set_settings_all_models
|
11
10
|
end
|
12
|
-
|
13
|
-
desc
|
14
|
-
task :
|
15
|
-
puts
|
11
|
+
|
12
|
+
desc 'Clear all indexes'
|
13
|
+
task clear_indexes: :environment do
|
14
|
+
puts 'clearing all indexes'
|
16
15
|
MeiliSearch::Utilities.clear_all_indexes
|
17
16
|
end
|
18
|
-
|
19
17
|
end
|
@@ -8,25 +8,22 @@ module MeiliSearch
|
|
8
8
|
Rails.application.eager_load!
|
9
9
|
end
|
10
10
|
klasses = MeiliSearch.instance_variable_get(:@included_in)
|
11
|
-
(klasses + klasses.map
|
11
|
+
(klasses + klasses.map(&:descendants).flatten).uniq
|
12
12
|
end
|
13
13
|
|
14
14
|
def clear_all_indexes
|
15
|
-
get_model_classes.each
|
16
|
-
klass.clear_index!
|
17
|
-
end
|
15
|
+
get_model_classes.each(&:clear_index!)
|
18
16
|
end
|
19
17
|
|
20
18
|
def reindex_all_models
|
21
19
|
klasses = get_model_classes
|
22
20
|
|
23
|
-
|
24
|
-
puts "Reindexing #{klasses.count} models: #{klasses.to_sentence}."
|
25
|
-
puts ''
|
21
|
+
Rails.logger.info "\n\nReindexing #{klasses.count} models: #{klasses.to_sentence}.\n"
|
26
22
|
|
27
23
|
klasses.each do |klass|
|
28
|
-
|
29
|
-
|
24
|
+
Rails.logger.info klass
|
25
|
+
Rails.logger.info "Reindexing #{klass.count} records..."
|
26
|
+
|
30
27
|
klass.ms_reindex!
|
31
28
|
end
|
32
29
|
end
|
@@ -34,16 +31,14 @@ module MeiliSearch
|
|
34
31
|
def set_settings_all_models
|
35
32
|
klasses = get_model_classes
|
36
33
|
|
37
|
-
|
38
|
-
puts "Pushing settings for #{klasses.count} models: #{klasses.to_sentence}."
|
39
|
-
puts ''
|
34
|
+
Rails.logger.info "\n\nPushing settings for #{klasses.count} models: #{klasses.to_sentence}.\n"
|
40
35
|
|
41
36
|
klasses.each do |klass|
|
42
|
-
|
37
|
+
Rails.logger.info "Pushing #{klass} settings..."
|
38
|
+
|
43
39
|
klass.ms_set_settings
|
44
40
|
end
|
45
41
|
end
|
46
42
|
end
|
47
43
|
end
|
48
44
|
end
|
49
|
-
|
data/lib/meilisearch/version.rb
CHANGED