meilisearch 0.27.0 → 0.27.1

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: 41cfeec247ef2cdaef19f6ddade5d32b7dcc80cbc69fe500c9310f7dab87e5a4
4
- data.tar.gz: af889a896d762a38fbb1af56aba3b462cf73f35e4fe97048ef09bbaad44ffa53
3
+ metadata.gz: cc7926e5e9f849ba9fb7377e4d1fe416abdba271c6518e511311da9750e209dc
4
+ data.tar.gz: 4dbb041794de52a349af301d713958de08fd4ceb4ac2afc0baa176e980d52f1c
5
5
  SHA512:
6
- metadata.gz: 6ce24688fe857e840d07efda981cc00d0f8a60982aea1d487646b21a82117693eaa61fbe9dc778512b00b7d2363001c68dca0387f7b7a550a00eee022133c046
7
- data.tar.gz: fda38ae00c08ba533e76dc0ce9a101331b23fb47e6c9554478a6027f1524b92141c6ecc764dce974402e66db67b9e6d85a96ff74893eb3419d0a9f02865b1cec
6
+ metadata.gz: 65b4e041307fa52c979bae5efb07428fbb2db6d67564bf00f151c8d45aa636e83eb1b6c87716a5cab92802f734073f919912ea97f6efc88acfaa9866375a9ea4
7
+ data.tar.gz: 054ed5ae299c6cce0e8a183ef828e233b634dfef5fee89c9dc213062171071455120957596b169dd7ce1b23b6027e1829725290d70c303532bb87fb96e6d287b
data/README.md CHANGED
@@ -251,8 +251,6 @@ JSON output:
251
251
  }
252
252
  ```
253
253
 
254
- You can enable it by querying PATCH /experimental-features with { "scoreDetails": true }
255
-
256
254
  This feature is only available with Meilisearch v1.3 and newer (optional).
257
255
 
258
256
  #### Custom Search With attributes on at search time <!-- omit in toc -->
@@ -16,7 +16,8 @@ module MeiliSearch
16
16
  def swap_indexes(*options)
17
17
  mapped_array = options.map { |arr| { indexes: arr } }
18
18
 
19
- http_post '/swap-indexes', mapped_array
19
+ response = http_post '/swap-indexes', mapped_array
20
+ Models::Task.new(response, task_endpoint)
20
21
  end
21
22
 
22
23
  def indexes(options = {})
@@ -35,14 +36,20 @@ module MeiliSearch
35
36
  def create_index(index_uid, options = {})
36
37
  body = Utils.transform_attributes(options.merge(uid: index_uid))
37
38
 
38
- http_post '/indexes', body
39
+ response = http_post '/indexes', body
40
+
41
+ Models::Task.new(response, task_endpoint)
39
42
  end
40
43
 
41
44
  # Synchronous version of create_index.
42
45
  # Waits for the task to be achieved, be careful when using it.
43
46
  def create_index!(index_uid, options = {})
44
- task = create_index(index_uid, options)
45
- wait_for_task(task['taskUid'])
47
+ Utils.soft_deprecate(
48
+ 'Client#create_index!',
49
+ "client.create_index('#{index_uid}').await"
50
+ )
51
+
52
+ create_index(index_uid, options).await
46
53
  end
47
54
 
48
55
  def delete_index(index_uid)
@@ -118,7 +125,8 @@ module MeiliSearch
118
125
  ### DUMPS
119
126
 
120
127
  def create_dump
121
- http_post '/dumps'
128
+ response = http_post '/dumps'
129
+ Models::Task.new(response, task_endpoint)
122
130
  end
123
131
 
124
132
  ### SNAPSHOTS
@@ -30,13 +30,15 @@ module MeiliSearch
30
30
  end
31
31
 
32
32
  def update(body)
33
- http_patch indexes_path(id: @uid), Utils.transform_attributes(body)
33
+ response = http_patch indexes_path(id: @uid), Utils.transform_attributes(body)
34
+ Models::Task.new(response, task_endpoint)
34
35
  end
35
36
 
36
37
  alias update_index update
37
38
 
38
39
  def delete
39
- http_delete indexes_path(id: @uid)
40
+ response = http_delete indexes_path(id: @uid)
41
+ Models::Task.new(response, task_endpoint)
40
42
  end
41
43
  alias delete_index delete
42
44
 
@@ -86,28 +88,38 @@ module MeiliSearch
86
88
 
87
89
  def add_documents(documents, primary_key = nil)
88
90
  documents = [documents] if documents.is_a?(Hash)
89
- http_post "/indexes/#{@uid}/documents", documents, { primaryKey: primary_key }.compact
91
+ response = http_post "/indexes/#{@uid}/documents", documents, { primaryKey: primary_key }.compact
92
+
93
+ Models::Task.new(response, task_endpoint)
90
94
  end
91
95
  alias replace_documents add_documents
92
96
  alias add_or_replace_documents add_documents
93
97
 
94
98
  def add_documents!(documents, primary_key = nil)
95
- task = add_documents(documents, primary_key)
96
- wait_for_task(task['taskUid'])
99
+ Utils.soft_deprecate(
100
+ 'Index#add_documents!',
101
+ 'index.add_documents(...).await'
102
+ )
103
+
104
+ add_documents(documents, primary_key).await
97
105
  end
98
106
  alias replace_documents! add_documents!
99
107
  alias add_or_replace_documents! add_documents!
100
108
 
101
109
  def add_documents_json(documents, primary_key = nil)
102
110
  options = { convert_body?: false }
103
- http_post "/indexes/#{@uid}/documents", documents, { primaryKey: primary_key }.compact, options
111
+ response = http_post "/indexes/#{@uid}/documents", documents, { primaryKey: primary_key }.compact, options
112
+
113
+ Models::Task.new(response, task_endpoint)
104
114
  end
105
115
  alias replace_documents_json add_documents_json
106
116
  alias add_or_replace_documents_json add_documents_json
107
117
 
108
118
  def add_documents_ndjson(documents, primary_key = nil)
109
119
  options = { headers: { 'Content-Type' => 'application/x-ndjson' }, convert_body?: false }
110
- http_post "/indexes/#{@uid}/documents", documents, { primaryKey: primary_key }.compact, options
120
+ response = http_post "/indexes/#{@uid}/documents", documents, { primaryKey: primary_key }.compact, options
121
+
122
+ Models::Task.new(response, task_endpoint)
111
123
  end
112
124
  alias replace_documents_ndjson add_documents_ndjson
113
125
  alias add_or_replace_documents_ndjson add_documents_ndjson
@@ -115,58 +127,62 @@ module MeiliSearch
115
127
  def add_documents_csv(documents, primary_key = nil, delimiter = nil)
116
128
  options = { headers: { 'Content-Type' => 'text/csv' }, convert_body?: false }
117
129
 
118
- http_post "/indexes/#{@uid}/documents", documents, {
130
+ response = http_post "/indexes/#{@uid}/documents", documents, {
119
131
  primaryKey: primary_key,
120
132
  csvDelimiter: delimiter
121
133
  }.compact, options
134
+
135
+ Models::Task.new(response, task_endpoint)
122
136
  end
123
137
  alias replace_documents_csv add_documents_csv
124
138
  alias add_or_replace_documents_csv add_documents_csv
125
139
 
126
140
  def update_documents(documents, primary_key = nil)
127
141
  documents = [documents] if documents.is_a?(Hash)
128
- http_put "/indexes/#{@uid}/documents", documents, { primaryKey: primary_key }.compact
142
+ response = http_put "/indexes/#{@uid}/documents", documents, { primaryKey: primary_key }.compact
143
+
144
+ Models::Task.new(response, task_endpoint)
129
145
  end
130
146
  alias add_or_update_documents update_documents
131
147
 
132
148
  def update_documents!(documents, primary_key = nil)
133
- task = update_documents(documents, primary_key)
134
- wait_for_task(task['taskUid'])
149
+ Utils.soft_deprecate(
150
+ 'Index#update_documents!',
151
+ 'index.update_documents(...).await'
152
+ )
153
+
154
+ update_documents(documents, primary_key).await
135
155
  end
136
156
  alias add_or_update_documents! update_documents!
137
157
 
138
158
  def add_documents_in_batches(documents, batch_size = 1000, primary_key = nil)
139
- tasks = []
140
- documents.each_slice(batch_size) do |batch|
141
- tasks.append(add_documents(batch, primary_key))
159
+ documents.each_slice(batch_size).map do |batch|
160
+ add_documents(batch, primary_key)
142
161
  end
143
- tasks
144
162
  end
145
163
 
146
164
  def add_documents_in_batches!(documents, batch_size = 1000, primary_key = nil)
147
- tasks = add_documents_in_batches(documents, batch_size, primary_key)
148
- responses = []
149
- tasks.each do |task_obj|
150
- responses.append(wait_for_task(task_obj['taskUid']))
151
- end
152
- responses
165
+ Utils.soft_deprecate(
166
+ 'Index#add_documents_in_batches!',
167
+ 'index.add_documents_in_batches(...).each(&:await)'
168
+ )
169
+
170
+ add_documents_in_batches(documents, batch_size, primary_key).each(&:await)
153
171
  end
154
172
 
155
173
  def update_documents_in_batches(documents, batch_size = 1000, primary_key = nil)
156
- tasks = []
157
- documents.each_slice(batch_size) do |batch|
158
- tasks.append(update_documents(batch, primary_key))
174
+ documents.each_slice(batch_size).map do |batch|
175
+ update_documents(batch, primary_key)
159
176
  end
160
- tasks
161
177
  end
162
178
 
163
179
  def update_documents_in_batches!(documents, batch_size = 1000, primary_key = nil)
164
- tasks = update_documents_in_batches(documents, batch_size, primary_key)
165
- responses = []
166
- tasks.each do |task_obj|
167
- responses.append(wait_for_task(task_obj['taskUid']))
168
- end
169
- responses
180
+ Utils.soft_deprecate(
181
+ 'Index#update_documents_in_batches!',
182
+ 'index.update_documents_in_batches(...).each(&:await)'
183
+ )
184
+
185
+ update_documents_in_batches(documents, batch_size, primary_key).each(&:await)
170
186
  end
171
187
 
172
188
  # Public: Delete documents from an index
@@ -178,44 +194,61 @@ module MeiliSearch
178
194
  # Returns a Task object.
179
195
  def delete_documents(options = {})
180
196
  Utils.version_error_handler(__method__) do
181
- if options.is_a?(Hash) && options.key?(:filter)
182
- http_post "/indexes/#{@uid}/documents/delete", options
183
- else
184
- # backwards compatibility:
185
- # expect to be a array or/number/string to send alongside as documents_ids.
186
- options = [options] unless options.is_a?(Array)
197
+ response = if options.is_a?(Hash) && options.key?(:filter)
198
+ http_post "/indexes/#{@uid}/documents/delete", options
199
+ else
200
+ # backwards compatibility:
201
+ # expect to be a array or/number/string to send alongside as documents_ids.
202
+ options = [options] unless options.is_a?(Array)
187
203
 
188
- http_post "/indexes/#{@uid}/documents/delete-batch", options
189
- end
204
+ http_post "/indexes/#{@uid}/documents/delete-batch", options
205
+ end
206
+
207
+ Models::Task.new(response, task_endpoint)
190
208
  end
191
209
  end
192
210
  alias delete_multiple_documents delete_documents
193
211
 
194
212
  def delete_documents!(documents_ids)
195
- task = delete_documents(documents_ids)
196
- wait_for_task(task['taskUid'])
213
+ Utils.soft_deprecate(
214
+ 'Index#delete_documents!',
215
+ 'index.delete_documents(...).await'
216
+ )
217
+
218
+ delete_documents(documents_ids).await
197
219
  end
198
220
  alias delete_multiple_documents! delete_documents!
199
221
 
200
222
  def delete_document(document_id)
201
223
  encode_document = URI.encode_www_form_component(document_id)
202
- http_delete "/indexes/#{@uid}/documents/#{encode_document}"
224
+ response = http_delete "/indexes/#{@uid}/documents/#{encode_document}"
225
+
226
+ Models::Task.new(response, task_endpoint)
203
227
  end
204
228
  alias delete_one_document delete_document
205
229
 
206
230
  def delete_document!(document_id)
207
- task = delete_document(document_id)
208
- wait_for_task(task['taskUid'])
231
+ Utils.soft_deprecate(
232
+ 'Index#delete_document!',
233
+ 'index.delete_document(...).await'
234
+ )
235
+
236
+ delete_document(document_id).await
209
237
  end
210
238
  alias delete_one_document! delete_document!
211
239
 
212
240
  def delete_all_documents
213
- http_delete "/indexes/#{@uid}/documents"
241
+ response = http_delete "/indexes/#{@uid}/documents"
242
+ Models::Task.new(response, task_endpoint)
214
243
  end
215
244
 
216
245
  def delete_all_documents!
217
- task = delete_all_documents
218
- wait_for_task(task['taskUid'])
246
+ Utils.soft_deprecate(
247
+ 'Index#delete_all_documents!',
248
+ 'index.delete_all_documents(...).await'
249
+ )
250
+
251
+ delete_all_documents.await
219
252
  end
220
253
 
221
254
  ### SEARCH
@@ -288,12 +321,14 @@ module MeiliSearch
288
321
  alias get_settings settings
289
322
 
290
323
  def update_settings(settings)
291
- http_patch "/indexes/#{@uid}/settings", Utils.transform_attributes(settings)
324
+ response = http_patch "/indexes/#{@uid}/settings", Utils.transform_attributes(settings)
325
+ Models::Task.new(response, task_endpoint)
292
326
  end
293
327
  alias settings= update_settings
294
328
 
295
329
  def reset_settings
296
- http_delete "/indexes/#{@uid}/settings"
330
+ response = http_delete "/indexes/#{@uid}/settings"
331
+ Models::Task.new(response, task_endpoint)
297
332
  end
298
333
 
299
334
  ### SETTINGS - RANKING RULES
@@ -304,12 +339,14 @@ module MeiliSearch
304
339
  alias get_ranking_rules ranking_rules
305
340
 
306
341
  def update_ranking_rules(ranking_rules)
307
- http_put "/indexes/#{@uid}/settings/ranking-rules", ranking_rules
342
+ response = http_put "/indexes/#{@uid}/settings/ranking-rules", ranking_rules
343
+ Models::Task.new(response, task_endpoint)
308
344
  end
309
345
  alias ranking_rules= update_ranking_rules
310
346
 
311
347
  def reset_ranking_rules
312
- http_delete "/indexes/#{@uid}/settings/ranking-rules"
348
+ response = http_delete "/indexes/#{@uid}/settings/ranking-rules"
349
+ Models::Task.new(response, task_endpoint)
313
350
  end
314
351
 
315
352
  ### SETTINGS - SYNONYMS
@@ -320,12 +357,14 @@ module MeiliSearch
320
357
  alias get_synonyms synonyms
321
358
 
322
359
  def update_synonyms(synonyms)
323
- http_put "/indexes/#{@uid}/settings/synonyms", synonyms
360
+ response = http_put "/indexes/#{@uid}/settings/synonyms", synonyms
361
+ Models::Task.new(response, task_endpoint)
324
362
  end
325
363
  alias synonyms= update_synonyms
326
364
 
327
365
  def reset_synonyms
328
- http_delete "/indexes/#{@uid}/settings/synonyms"
366
+ response = http_delete "/indexes/#{@uid}/settings/synonyms"
367
+ Models::Task.new(response, task_endpoint)
329
368
  end
330
369
 
331
370
  ### SETTINGS - STOP-WORDS
@@ -337,12 +376,14 @@ module MeiliSearch
337
376
 
338
377
  def update_stop_words(stop_words)
339
378
  body = stop_words.nil? || stop_words.is_a?(Array) ? stop_words : [stop_words]
340
- http_put "/indexes/#{@uid}/settings/stop-words", body
379
+ response = http_put "/indexes/#{@uid}/settings/stop-words", body
380
+ Models::Task.new(response, task_endpoint)
341
381
  end
342
382
  alias stop_words= update_stop_words
343
383
 
344
384
  def reset_stop_words
345
- http_delete "/indexes/#{@uid}/settings/stop-words"
385
+ response = http_delete "/indexes/#{@uid}/settings/stop-words"
386
+ Models::Task.new(response, task_endpoint)
346
387
  end
347
388
 
348
389
  ### SETTINGS - DINSTINCT ATTRIBUTE
@@ -353,12 +394,14 @@ module MeiliSearch
353
394
  alias get_distinct_attribute distinct_attribute
354
395
 
355
396
  def update_distinct_attribute(distinct_attribute)
356
- http_put "/indexes/#{@uid}/settings/distinct-attribute", distinct_attribute
397
+ response = http_put "/indexes/#{@uid}/settings/distinct-attribute", distinct_attribute
398
+ Models::Task.new(response, task_endpoint)
357
399
  end
358
400
  alias distinct_attribute= update_distinct_attribute
359
401
 
360
402
  def reset_distinct_attribute
361
- http_delete "/indexes/#{@uid}/settings/distinct-attribute"
403
+ response = http_delete "/indexes/#{@uid}/settings/distinct-attribute"
404
+ Models::Task.new(response, task_endpoint)
362
405
  end
363
406
 
364
407
  ### SETTINGS - SEARCHABLE ATTRIBUTES
@@ -369,12 +412,14 @@ module MeiliSearch
369
412
  alias get_searchable_attributes searchable_attributes
370
413
 
371
414
  def update_searchable_attributes(searchable_attributes)
372
- http_put "/indexes/#{@uid}/settings/searchable-attributes", searchable_attributes
415
+ response = http_put "/indexes/#{@uid}/settings/searchable-attributes", searchable_attributes
416
+ Models::Task.new(response, task_endpoint)
373
417
  end
374
418
  alias searchable_attributes= update_searchable_attributes
375
419
 
376
420
  def reset_searchable_attributes
377
- http_delete "/indexes/#{@uid}/settings/searchable-attributes"
421
+ response = http_delete "/indexes/#{@uid}/settings/searchable-attributes"
422
+ Models::Task.new(response, task_endpoint)
378
423
  end
379
424
 
380
425
  ### SETTINGS - DISPLAYED ATTRIBUTES
@@ -385,12 +430,14 @@ module MeiliSearch
385
430
  alias get_displayed_attributes displayed_attributes
386
431
 
387
432
  def update_displayed_attributes(displayed_attributes)
388
- http_put "/indexes/#{@uid}/settings/displayed-attributes", displayed_attributes
433
+ response = http_put "/indexes/#{@uid}/settings/displayed-attributes", displayed_attributes
434
+ Models::Task.new(response, task_endpoint)
389
435
  end
390
436
  alias displayed_attributes= update_displayed_attributes
391
437
 
392
438
  def reset_displayed_attributes
393
- http_delete "/indexes/#{@uid}/settings/displayed-attributes"
439
+ response = http_delete "/indexes/#{@uid}/settings/displayed-attributes"
440
+ Models::Task.new(response, task_endpoint)
394
441
  end
395
442
 
396
443
  ### SETTINGS - FILTERABLE ATTRIBUTES
@@ -401,12 +448,14 @@ module MeiliSearch
401
448
  alias get_filterable_attributes filterable_attributes
402
449
 
403
450
  def update_filterable_attributes(filterable_attributes)
404
- http_put "/indexes/#{@uid}/settings/filterable-attributes", filterable_attributes
451
+ response = http_put "/indexes/#{@uid}/settings/filterable-attributes", filterable_attributes
452
+ Models::Task.new(response, task_endpoint)
405
453
  end
406
454
  alias filterable_attributes= update_filterable_attributes
407
455
 
408
456
  def reset_filterable_attributes
409
- http_delete "/indexes/#{@uid}/settings/filterable-attributes"
457
+ response = http_delete "/indexes/#{@uid}/settings/filterable-attributes"
458
+ Models::Task.new(response, task_endpoint)
410
459
  end
411
460
 
412
461
  ### SETTINGS - SORTABLE ATTRIBUTES
@@ -417,12 +466,14 @@ module MeiliSearch
417
466
  alias get_sortable_attributes sortable_attributes
418
467
 
419
468
  def update_sortable_attributes(sortable_attributes)
420
- http_put "/indexes/#{@uid}/settings/sortable-attributes", sortable_attributes
469
+ response = http_put "/indexes/#{@uid}/settings/sortable-attributes", sortable_attributes
470
+ Models::Task.new(response, task_endpoint)
421
471
  end
422
472
  alias sortable_attributes= update_sortable_attributes
423
473
 
424
474
  def reset_sortable_attributes
425
- http_delete "/indexes/#{@uid}/settings/sortable-attributes"
475
+ response = http_delete "/indexes/#{@uid}/settings/sortable-attributes"
476
+ Models::Task.new(response, task_endpoint)
426
477
  end
427
478
 
428
479
  ### SETTINGS - PAGINATION
@@ -433,12 +484,14 @@ module MeiliSearch
433
484
  alias get_pagination pagination
434
485
 
435
486
  def update_pagination(pagination)
436
- http_patch "/indexes/#{@uid}/settings/pagination", pagination
487
+ response = http_patch "/indexes/#{@uid}/settings/pagination", pagination
488
+ Models::Task.new(response, task_endpoint)
437
489
  end
438
490
  alias pagination= update_sortable_attributes
439
491
 
440
492
  def reset_pagination
441
- http_delete "/indexes/#{@uid}/settings/pagination"
493
+ response = http_delete "/indexes/#{@uid}/settings/pagination"
494
+ Models::Task.new(response, task_endpoint)
442
495
  end
443
496
 
444
497
  def typo_tolerance
@@ -448,12 +501,14 @@ module MeiliSearch
448
501
 
449
502
  def update_typo_tolerance(typo_tolerance_attributes)
450
503
  attributes = Utils.transform_attributes(typo_tolerance_attributes)
451
- http_patch("/indexes/#{@uid}/settings/typo-tolerance", attributes)
504
+ response = http_patch("/indexes/#{@uid}/settings/typo-tolerance", attributes)
505
+ Models::Task.new(response, task_endpoint)
452
506
  end
453
507
  alias typo_tolerance= update_typo_tolerance
454
508
 
455
509
  def reset_typo_tolerance
456
- http_delete("/indexes/#{@uid}/settings/typo-tolerance")
510
+ response = http_delete("/indexes/#{@uid}/settings/typo-tolerance")
511
+ Models::Task.new(response, task_endpoint)
457
512
  end
458
513
 
459
514
  def faceting
@@ -463,12 +518,14 @@ module MeiliSearch
463
518
 
464
519
  def update_faceting(faceting_attributes)
465
520
  attributes = Utils.transform_attributes(faceting_attributes)
466
- http_patch("/indexes/#{@uid}/settings/faceting", attributes)
521
+ response = http_patch("/indexes/#{@uid}/settings/faceting", attributes)
522
+ Models::Task.new(response, task_endpoint)
467
523
  end
468
524
  alias faceting= update_faceting
469
525
 
470
526
  def reset_faceting
471
- http_delete("/indexes/#{@uid}/settings/faceting")
527
+ response = http_delete("/indexes/#{@uid}/settings/faceting")
528
+ Models::Task.new(response, task_endpoint)
472
529
  end
473
530
 
474
531
  ### SETTINGS - DICTIONARY
@@ -479,11 +536,13 @@ module MeiliSearch
479
536
 
480
537
  def update_dictionary(dictionary_attributes)
481
538
  attributes = Utils.transform_attributes(dictionary_attributes)
482
- http_put("/indexes/#{@uid}/settings/dictionary", attributes)
539
+ response = http_put("/indexes/#{@uid}/settings/dictionary", attributes)
540
+ Models::Task.new(response, task_endpoint)
483
541
  end
484
542
 
485
543
  def reset_dictionary
486
- http_delete("/indexes/#{@uid}/settings/dictionary")
544
+ response = http_delete("/indexes/#{@uid}/settings/dictionary")
545
+ Models::Task.new(response, task_endpoint)
487
546
  end
488
547
  ### SETTINGS - SEPARATOR TOKENS
489
548
 
@@ -493,11 +552,13 @@ module MeiliSearch
493
552
 
494
553
  def update_separator_tokens(separator_tokens_attributes)
495
554
  attributes = Utils.transform_attributes(separator_tokens_attributes)
496
- http_put("/indexes/#{@uid}/settings/separator-tokens", attributes)
555
+ response = http_put("/indexes/#{@uid}/settings/separator-tokens", attributes)
556
+ Models::Task.new(response, task_endpoint)
497
557
  end
498
558
 
499
559
  def reset_separator_tokens
500
- http_delete("/indexes/#{@uid}/settings/separator-tokens")
560
+ response = http_delete("/indexes/#{@uid}/settings/separator-tokens")
561
+ Models::Task.new(response, task_endpoint)
501
562
  end
502
563
 
503
564
  ### SETTINGS - NON SEPARATOR TOKENS
@@ -508,11 +569,13 @@ module MeiliSearch
508
569
 
509
570
  def update_non_separator_tokens(non_separator_tokens_attributes)
510
571
  attributes = Utils.transform_attributes(non_separator_tokens_attributes)
511
- http_put("/indexes/#{@uid}/settings/non-separator-tokens", attributes)
572
+ response = http_put("/indexes/#{@uid}/settings/non-separator-tokens", attributes)
573
+ Models::Task.new(response, task_endpoint)
512
574
  end
513
575
 
514
576
  def reset_non_separator_tokens
515
- http_delete("/indexes/#{@uid}/settings/non-separator-tokens")
577
+ response = http_delete("/indexes/#{@uid}/settings/non-separator-tokens")
578
+ Models::Task.new(response, task_endpoint)
516
579
  end
517
580
 
518
581
  ### SETTINGS - PROXIMITY PRECISION
@@ -0,0 +1,160 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'forwardable'
4
+
5
+ module MeiliSearch
6
+ module Models
7
+ class Task
8
+ extend Forwardable
9
+
10
+ # Maintain backwards compatibility with task hash return type
11
+ def_delegators :metadata, :[], :dig, :keys, :key?, :has_key?
12
+
13
+ attr_reader :metadata
14
+
15
+ def initialize(metadata_hash, task_endpoint)
16
+ self.metadata = metadata_hash
17
+ validate_required_fields! metadata
18
+
19
+ @task_endpoint = task_endpoint
20
+ end
21
+
22
+ def uid
23
+ @metadata['taskUid']
24
+ end
25
+
26
+ def type
27
+ @metadata['type']
28
+ end
29
+
30
+ def status
31
+ @metadata['status']
32
+ end
33
+
34
+ def enqueued?
35
+ refresh if status_enqueued?
36
+
37
+ status_enqueued?
38
+ end
39
+
40
+ def processing?
41
+ refresh if status_processing? || status_enqueued?
42
+
43
+ status_processing?
44
+ end
45
+
46
+ def unfinished?
47
+ refresh if status_processing? || status_enqueued?
48
+
49
+ status_processing? || status_enqueued?
50
+ end
51
+ alias waiting? unfinished?
52
+
53
+ def finished?
54
+ !unfinished?
55
+ end
56
+
57
+ def succeeded?
58
+ Utils.warn_on_unfinished_task(self) if unfinished?
59
+
60
+ status == 'succeeded'
61
+ end
62
+ alias has_succeeded? succeeded?
63
+
64
+ def failed?
65
+ Utils.warn_on_unfinished_task(self) if unfinished?
66
+
67
+ status == 'failed'
68
+ end
69
+ alias has_failed? failed?
70
+
71
+ def cancelled?
72
+ Utils.warn_on_unfinished_task(self) if unfinished?
73
+
74
+ status_cancelled?
75
+ end
76
+
77
+ def deleted?
78
+ refresh unless @deleted
79
+
80
+ !!@deleted
81
+ end
82
+
83
+ def error
84
+ @metadata['error']
85
+ end
86
+
87
+ def refresh(with: nil)
88
+ self.metadata = with || @task_endpoint.task(uid)
89
+
90
+ self
91
+ rescue MeiliSearch::ApiError => e
92
+ raise e unless e.http_code == 404
93
+
94
+ @deleted = true
95
+
96
+ self
97
+ end
98
+
99
+ def await(timeout_in_ms = 5000, interval_in_ms = 50)
100
+ refresh with: @task_endpoint.wait_for_task(uid, timeout_in_ms, interval_in_ms) unless finished?
101
+
102
+ self
103
+ end
104
+
105
+ def cancel
106
+ return true if status_cancelled?
107
+ return false if status_finished?
108
+
109
+ @task_endpoint.cancel_tasks(uids: [uid]).await
110
+
111
+ cancelled?
112
+ end
113
+
114
+ def delete
115
+ return false unless status_finished?
116
+
117
+ @task_endpoint.delete_tasks(uids: [uid]).await
118
+
119
+ deleted?
120
+ end
121
+
122
+ def to_h
123
+ @metadata
124
+ end
125
+ alias to_hash to_h
126
+
127
+ private
128
+
129
+ def validate_required_fields!(task_hash)
130
+ raise ArgumentError, 'Cannot instantiate a task without an ID' unless task_hash['taskUid']
131
+ raise ArgumentError, 'Cannot instantiate a task without a type' unless task_hash['type']
132
+ raise ArgumentError, 'Cannot instantiate a task without a status' unless task_hash['status']
133
+ end
134
+
135
+ def status_enqueued?
136
+ status == 'enqueued'
137
+ end
138
+
139
+ def status_processing?
140
+ status == 'processing'
141
+ end
142
+
143
+ def status_finished?
144
+ ['succeeded', 'failed', 'cancelled'].include? status
145
+ end
146
+
147
+ def status_cancelled?
148
+ status == 'cancelled'
149
+ end
150
+
151
+ def metadata=(metadata)
152
+ @metadata = metadata
153
+
154
+ uid = @metadata['taskUid'] || @metadata['uid']
155
+ @metadata['uid'] = uid
156
+ @metadata['taskUid'] = uid
157
+ end
158
+ end
159
+ end
160
+ end
@@ -1,73 +1,98 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'logger'
4
+
3
5
  module MeiliSearch
4
6
  module Utils
5
7
  SNAKE_CASE = /[^a-zA-Z0-9]+(.)/
6
8
 
7
- def self.transform_attributes(body)
8
- case body
9
- when Array
10
- body.map { |item| transform_attributes(item) }
11
- when Hash
12
- warn_on_non_conforming_attribute_names(body)
13
- parse(body)
14
- else
15
- body
9
+ class << self
10
+ attr_writer :logger
11
+
12
+ def logger
13
+ @logger ||= Logger.new($stdout)
14
+ end
15
+
16
+ def soft_deprecate(subject, replacement)
17
+ logger.warn("[meilisearch-ruby] #{subject} is DEPRECATED, please use #{replacement} instead.")
16
18
  end
17
- end
18
19
 
19
- def self.parse(body)
20
- body
21
- .transform_keys(&:to_s)
22
- .transform_keys do |key|
23
- key.include?('_') ? key.downcase.gsub(SNAKE_CASE, &:upcase).gsub('_', '') : key
20
+ def warn_on_unfinished_task(task_uid)
21
+ message = <<~UNFINISHED_TASK_WARNING
22
+ [meilisearch-ruby] Task #{task_uid}'s finished state (succeeded?/failed?/cancelled?) is being checked before finishing.
23
+ [meilisearch-ruby] Tasks in meilisearch are processed in the background asynchronously.
24
+ [meilisearch-ruby] Please use the #finished? method to check if the task is finished or the #await method to wait for the task to finish.
25
+ UNFINISHED_TASK_WARNING
26
+
27
+ message.lines.each do |line|
28
+ logger.warn(line)
24
29
  end
25
- end
30
+ end
26
31
 
27
- def self.filter(original_options, allowed_params = [])
28
- original_options.transform_keys(&:to_sym).slice(*allowed_params)
29
- end
32
+ def transform_attributes(body)
33
+ case body
34
+ when Array
35
+ body.map { |item| transform_attributes(item) }
36
+ when Hash
37
+ warn_on_non_conforming_attribute_names(body)
38
+ parse(body)
39
+ else
40
+ body
41
+ end
42
+ end
30
43
 
31
- def self.parse_query(original_options, allowed_params = [])
32
- only_allowed_params = filter(original_options, allowed_params)
44
+ def filter(original_options, allowed_params = [])
45
+ original_options.transform_keys(&:to_sym).slice(*allowed_params)
46
+ end
47
+
48
+ def parse_query(original_options, allowed_params = [])
49
+ only_allowed_params = filter(original_options, allowed_params)
33
50
 
34
- Utils.transform_attributes(only_allowed_params).then do |body|
35
- body.transform_values do |v|
36
- v.respond_to?(:join) ? v.join(',') : v.to_s
51
+ Utils.transform_attributes(only_allowed_params).then do |body|
52
+ body.transform_values do |v|
53
+ v.respond_to?(:join) ? v.join(',') : v.to_s
54
+ end
37
55
  end
38
56
  end
39
- end
40
57
 
41
- def self.message_builder(current_message, method_name)
42
- "#{current_message}\nHint: It might not be working because maybe you're not up " \
43
- "to date with the Meilisearch version that `#{method_name}` call requires."
44
- end
58
+ def version_error_handler(method_name)
59
+ yield if block_given?
60
+ rescue MeiliSearch::ApiError => e
61
+ message = message_builder(e.http_message, method_name)
45
62
 
46
- def self.version_error_handler(method_name)
47
- yield if block_given?
48
- rescue MeiliSearch::ApiError => e
49
- message = message_builder(e.http_message, method_name)
63
+ raise MeiliSearch::ApiError.new(e.http_code, message, e.http_body)
64
+ rescue StandardError => e
65
+ raise e.class, message_builder(e.message, method_name)
66
+ end
50
67
 
51
- raise MeiliSearch::ApiError.new(e.http_code, message, e.http_body)
52
- rescue StandardError => e
53
- raise e.class, message_builder(e.message, method_name)
54
- end
68
+ def warn_on_non_conforming_attribute_names(body)
69
+ return if body.nil?
55
70
 
56
- def self.warn_on_non_conforming_attribute_names(body)
57
- return if body.nil?
71
+ non_snake_case = body.keys.grep_v(/^[a-z0-9_]+$/)
72
+ return if non_snake_case.empty?
58
73
 
59
- non_snake_case = body.keys.grep_v(/^[a-z0-9_]+$/)
60
- return if non_snake_case.empty?
74
+ message = <<~MSG
75
+ [meilisearch-ruby] Attributes will be expected to be snake_case in future versions.
76
+ [meilisearch-ruby] Non-conforming attributes: #{non_snake_case.join(', ')}
77
+ MSG
61
78
 
62
- message = <<~MSG
63
- Attributes will be expected to be snake_case in future versions of Meilisearch Ruby.
79
+ logger.warn(message)
80
+ end
64
81
 
65
- Non-conforming attributes: #{non_snake_case.join(', ')}
66
- MSG
82
+ private
67
83
 
68
- warn(message)
69
- end
84
+ def parse(body)
85
+ body
86
+ .transform_keys(&:to_s)
87
+ .transform_keys do |key|
88
+ key.include?('_') ? key.downcase.gsub(SNAKE_CASE, &:upcase).gsub('_', '') : key
89
+ end
90
+ end
70
91
 
71
- private_class_method :parse, :message_builder
92
+ def message_builder(current_message, method_name)
93
+ "#{current_message}\nHint: It might not be working because maybe you're not up " \
94
+ "to date with the Meilisearch version that `#{method_name}` call requires."
95
+ end
96
+ end
72
97
  end
73
98
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MeiliSearch
4
- VERSION = '0.27.0'
4
+ VERSION = '0.27.1'
5
5
 
6
6
  def self.qualified_version
7
7
  "Meilisearch Ruby (v#{VERSION})"
data/lib/meilisearch.rb CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'meilisearch/version'
4
4
  require 'meilisearch/utils'
5
+ require 'meilisearch/models/task'
5
6
  require 'meilisearch/http_request'
6
7
  require 'meilisearch/multi_search'
7
8
  require 'meilisearch/tenant_token'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: meilisearch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.27.0
4
+ version: 0.27.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Meili
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-14 00:00:00.000000000 Z
11
+ date: 2024-03-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -43,6 +43,7 @@ files:
43
43
  - lib/meilisearch/error.rb
44
44
  - lib/meilisearch/http_request.rb
45
45
  - lib/meilisearch/index.rb
46
+ - lib/meilisearch/models/task.rb
46
47
  - lib/meilisearch/multi_search.rb
47
48
  - lib/meilisearch/task.rb
48
49
  - lib/meilisearch/tenant_token.rb