search_rails 2.0.2 → 3.0.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.
data/lib/search.rb CHANGED
@@ -28,7 +28,7 @@ module Search
28
28
  end
29
29
 
30
30
  def _search_cast(node:, type: "text")
31
- Arel::Nodes::NamedFunction.new("cast", [node.as(type)])
31
+ Arel::Nodes::NamedFunction.new("cast", [node.as(type.to_s)])
32
32
  end
33
33
 
34
34
  def _search_cast_boolean(value)
@@ -94,8 +94,8 @@ module Search
94
94
  # fields:
95
95
  # [:id, :name, :input]
96
96
  scope :search,
97
- ->(q: "", fields: self.search_fields&.keys) do
98
- raise ArgumentError unless self.search_fields.is_an?(Hash)
97
+ lambda { |q: "", fields: search_fields&.keys|
98
+ raise ArgumentError unless search_fields.is_an?(Hash)
99
99
  raise ArgumentError unless fields.is_an?(Array)
100
100
 
101
101
  fields = fields.map(&:to_s)
@@ -113,22 +113,24 @@ module Search
113
113
  fields: fields
114
114
  )
115
115
  )
116
- end
116
+ }
117
117
 
118
118
  scope :_search_joins,
119
- ->(scope:, fields:) do
119
+ lambda { |scope:, fields:|
120
120
  fields = fields.map(&:to_s)
121
121
 
122
122
  relations =
123
- fields.map { |field| self.search_fields.fetch(field.to_sym)[:relation] }.compact
123
+ fields.filter_map do |field|
124
+ search_fields.fetch(field.to_sym)[:relation]
125
+ end
124
126
 
125
127
  relations.reduce(scope) do |scope_with_relations, relation|
126
128
  relation.call(scope_with_relations)
127
129
  end
128
- end
130
+ }
129
131
 
130
132
  scope :_search_parsed,
131
- ->(parsed:, scope:, fields:) do
133
+ lambda { |parsed:, scope:, fields:|
132
134
  if parsed.is_a?(String)
133
135
  scope._search_fields(q: parsed, fields: fields)
134
136
  elsif parsed.is_a?(Hash)
@@ -186,7 +188,11 @@ module Search
186
188
  if key.blank?
187
189
  scope.none
188
190
  else
189
- scope._search_field(key: key, operator: operator, value: value)
191
+ scope._search_field(
192
+ key: key,
193
+ operator: operator,
194
+ value: value
195
+ )
190
196
  end
191
197
  else
192
198
  raise ArgumentError
@@ -194,14 +200,14 @@ module Search
194
200
  else
195
201
  raise ArgumentError
196
202
  end
197
- end
203
+ }
198
204
 
199
205
  # q:
200
206
  # "dorian"
201
207
  # "1"
202
208
  # fields: [:id, :given_name, :family_name]
203
209
  scope :_search_fields,
204
- ->(q: "", fields: search_fields&.keys) do
210
+ lambda { |q: "", fields: search_fields&.keys|
205
211
  raise ArgumentError unless search_fields.is_an?(Hash)
206
212
  raise ArgumentError unless fields.is_an?(Array)
207
213
 
@@ -211,21 +217,20 @@ module Search
211
217
  where(
212
218
  fields
213
219
  .map do |field|
214
- field = self.search_fields.fetch(field.to_sym)
220
+ field = search_fields.fetch(field.to_sym)
215
221
  node = field[:node].call
216
222
  casted_field = _search_cast(node: node, type: :text)
217
223
  casted_field.matches("%#{q}%", nil, false)
218
224
  end
219
225
  .reduce(&:or)
220
226
  )
221
-
222
- end
227
+ }
223
228
 
224
229
  # key: input, name, id, created_at, updated_at, verified, admin, ...
225
230
  # operator: :, =, >, ~, <, >=, ...
226
231
  # value: "pomodoro", 123, true, false
227
232
  scope :_search_field,
228
- ->(key:, operator: ":", value:, fields: search_fields&.keys) do
233
+ lambda { |key:, value:, operator: ":", fields: search_fields&.keys|
229
234
  raise ArgumentError unless search_fields.is_an?(Hash)
230
235
  raise ArgumentError unless fields.is_an?(Array)
231
236
 
@@ -235,7 +240,7 @@ module Search
235
240
  raise ArgumentError if key.blank?
236
241
  raise ArgumentError if operator.blank?
237
242
 
238
- field = self.search_fields.fetch(key.to_sym)
243
+ field = search_fields.fetch(key.to_sym)
239
244
 
240
245
  case operator
241
246
  when ":"
@@ -256,9 +261,7 @@ module Search
256
261
  _search_matches(field: field, value: value)
257
262
  when "="
258
263
  _search_equal(field: field, value: value)
259
- when "!:"
260
- where.not(id: _search_colon(field: field, value: value))
261
- when "!!"
264
+ when "!:", "!!"
262
265
  where.not(id: _search_colon(field: field, value: value))
263
266
  when "!^"
264
267
  where.not(id: _search_starts(field: field, value: value))
@@ -279,11 +282,11 @@ module Search
279
282
  else
280
283
  raise ArgumentError
281
284
  end
282
- end
285
+ }
283
286
 
284
287
  # id:1, name:dorian, verified:true, created_at:today
285
288
  scope :_search_colon,
286
- ->(field:, value:) do
289
+ lambda { |field:, value:|
287
290
  node = field[:node].call
288
291
 
289
292
  case field[:type]
@@ -298,10 +301,10 @@ module Search
298
301
  else
299
302
  raise ArgumentError
300
303
  end
301
- end
304
+ }
302
305
 
303
306
  scope :_search_matches,
304
- ->(field:, value:) do
307
+ lambda { |field:, value:|
305
308
  node = field[:node].call
306
309
 
307
310
  case field[:type]
@@ -316,10 +319,10 @@ module Search
316
319
  else
317
320
  raise ArgumentError
318
321
  end
319
- end
322
+ }
320
323
 
321
324
  scope :_search_ends,
322
- ->(field:, value:) do
325
+ lambda { |field:, value:|
323
326
  node = field[:node].call
324
327
 
325
328
  case field[:type]
@@ -334,10 +337,10 @@ module Search
334
337
  else
335
338
  raise ArgumentError
336
339
  end
337
- end
340
+ }
338
341
 
339
342
  scope :_search_starts,
340
- ->(field:, value:) do
343
+ lambda { |field:, value:|
341
344
  node = field[:node].call
342
345
 
343
346
  case field[:type]
@@ -352,10 +355,10 @@ module Search
352
355
  else
353
356
  raise ArgumentError
354
357
  end
355
- end
358
+ }
356
359
 
357
360
  scope :_search_equal,
358
- ->(field:, value:) do
361
+ lambda { |field:, value:|
359
362
  node = field[:node].call
360
363
 
361
364
  case field[:type]
@@ -370,10 +373,10 @@ module Search
370
373
  else
371
374
  raise ArgumentError
372
375
  end
373
- end
376
+ }
374
377
 
375
378
  scope :_search_lesser,
376
- ->(field:, value:) do
379
+ lambda { |field:, value:|
377
380
  node = field[:node].call
378
381
 
379
382
  case field[:type]
@@ -388,10 +391,10 @@ module Search
388
391
  else
389
392
  raise ArgumentError
390
393
  end
391
- end
394
+ }
392
395
 
393
396
  scope :_search_lesser_or_equal,
394
- ->(field:, value:) do
397
+ lambda { |field:, value:|
395
398
  node = field[:node].call
396
399
 
397
400
  case field[:type]
@@ -406,10 +409,10 @@ module Search
406
409
  else
407
410
  raise ArgumentError
408
411
  end
409
- end
412
+ }
410
413
 
411
414
  scope :_search_greater,
412
- ->(field:, value:) do
415
+ lambda { |field:, value:|
413
416
  node = field[:node].call
414
417
 
415
418
  case field[:type]
@@ -424,10 +427,10 @@ module Search
424
427
  else
425
428
  raise ArgumentError
426
429
  end
427
- end
430
+ }
428
431
 
429
432
  scope :_search_greater_or_equal,
430
- ->(field:, value:) do
433
+ lambda { |field:, value:|
431
434
  node = field[:node].call
432
435
 
433
436
  case field[:type]
@@ -442,10 +445,10 @@ module Search
442
445
  else
443
446
  raise ArgumentError
444
447
  end
445
- end
448
+ }
446
449
 
447
450
  scope :_search_integer_eq,
448
- ->(node:, value:) do
451
+ lambda { |node:, value:|
449
452
  node = _search_cast(node: node, type: :bigint)
450
453
  value = _search_cast_integer(value)
451
454
 
@@ -458,10 +461,10 @@ module Search
458
461
  else
459
462
  where(node.eq(value))
460
463
  end
461
- end
464
+ }
462
465
 
463
466
  scope :_search_datetime_eq,
464
- ->(node:, value:) do
467
+ lambda { |node:, value:|
465
468
  node = _search_cast(node: node, type: :timestamp)
466
469
  value = _search_cast_datetime(value)
467
470
 
@@ -474,10 +477,10 @@ module Search
474
477
  else
475
478
  where(node.eq(value))
476
479
  end
477
- end
480
+ }
478
481
 
479
482
  scope :_search_string_eq,
480
- ->(node:, value:) do
483
+ lambda { |node:, value:|
481
484
  node = _search_cast(node: node, type: :text)
482
485
  value = _search_cast_string(value)
483
486
 
@@ -490,10 +493,10 @@ module Search
490
493
  else
491
494
  where(node.eq(value))
492
495
  end
493
- end
496
+ }
494
497
 
495
498
  scope :_search_boolean_eq,
496
- ->(node:, value:) do
499
+ lambda { |node:, value:|
497
500
  node = _search_cast(node: node, type: :boolean)
498
501
  value = _search_cast_boolean(value)
499
502
 
@@ -506,118 +509,118 @@ module Search
506
509
  else
507
510
  where(node.eq(value))
508
511
  end
509
- end
512
+ }
510
513
 
511
514
  scope :_search_integer_lt,
512
- ->(node:, value:) do
515
+ lambda { |node:, value:|
513
516
  node = _search_cast(node: node, type: :bigint)
514
517
  value = _search_cast_integer(value)
515
518
  value = value.first if value.is_a?(Range)
516
519
 
517
520
  where(node.lt(value))
518
- end
521
+ }
519
522
 
520
523
  scope :_search_datetime_lt,
521
- ->(node:, value:) do
524
+ lambda { |node:, value:|
522
525
  node = _search_cast(node: node, type: :timestamp)
523
526
  value = _search_cast_datetime(value)
524
527
  value = value.first if value.is_a?(Range)
525
528
 
526
529
  where(node.lt(value))
527
- end
530
+ }
528
531
 
529
532
  scope :_search_string_lt,
530
- ->(node:, value:) do
533
+ lambda { |node:, value:|
531
534
  node = _search_cast(node: node, type: :text)
532
535
  value = _search_cast_string(value)
533
536
  value = value.first if value.is_a?(Range)
534
537
 
535
538
  where(node.lt(value))
536
- end
539
+ }
537
540
 
538
541
  scope :_search_integer_lteq,
539
- ->(node:, value:) do
542
+ lambda { |node:, value:|
540
543
  node = _search_cast(node: node, type: :bigint)
541
544
  value = _search_cast_integer(value)
542
545
  value = value.first if value.is_a?(Range)
543
546
 
544
547
  where(node.lteq(value))
545
- end
548
+ }
546
549
 
547
550
  scope :_search_datetime_lteq,
548
- ->(node:, value:) do
551
+ lambda { |node:, value:|
549
552
  node = _search_cast(node: node, type: :timestamp)
550
553
  value = _search_cast_datetime(value)
551
554
  value = value.first if value.is_a?(Range)
552
555
 
553
556
  where(node.lteq(value))
554
- end
557
+ }
555
558
 
556
559
  scope :_search_string_lteq,
557
- ->(node:, value:) do
560
+ lambda { |node:, value:|
558
561
  node = _search_cast(node: node, type: :text)
559
562
  value = _search_cast_string(value)
560
563
  value = value.first if value.is_a?(Range)
561
564
 
562
565
  where(node.lteq(value))
563
- end
566
+ }
564
567
 
565
568
  scope :_search_integer_gt,
566
- ->(node:, value:) do
569
+ lambda { |node:, value:|
567
570
  node = _search_cast(node: node, type: :bigint)
568
571
  value = _search_cast_integer(value)
569
572
  value = value.last if value.is_a?(Range)
570
573
 
571
574
  where(node.gt(value))
572
- end
575
+ }
573
576
 
574
577
  scope :_search_datetime_gt,
575
- ->(node:, value:) do
578
+ lambda { |node:, value:|
576
579
  node = _search_cast(node: node, type: :timestamp)
577
580
  value = _search_cast_datetime(value)
578
581
  value = value.last if value.is_a?(Range)
579
582
 
580
583
  where(node.gt(value))
581
- end
584
+ }
582
585
 
583
586
  scope :_search_string_gt,
584
- ->(node:, value:) do
587
+ lambda { |node:, value:|
585
588
  node = _search_cast(node: node, type: :text)
586
589
  value = _search_cast_string(value)
587
590
  value = value.last if value.is_a?(Range)
588
591
 
589
592
  where(node.gt(value))
590
- end
593
+ }
591
594
 
592
595
  scope :_search_integer_gteq,
593
- ->(node:, value:) do
596
+ lambda { |node:, value:|
594
597
  node = _search_cast(node: node, type: :bigint)
595
598
  value = _search_cast_integer(value)
596
599
  value = value.last if value.is_a?(Range)
597
600
 
598
601
  where(node.gteq(value))
599
- end
602
+ }
600
603
 
601
604
  scope :_search_datetime_gteq,
602
- ->(node:, value:) do
605
+ lambda { |node:, value:|
603
606
  node = _search_cast(node: node, type: :timestamp)
604
607
  value = _search_cast_datetime(value)
605
608
  value = value.last if value.is_a?(Range)
606
609
 
607
610
  where(node.gteq(value))
608
- end
611
+ }
609
612
 
610
613
  scope :_search_string_gteq,
611
- ->(node:, value:) do
614
+ lambda { |node:, value:|
612
615
  node = _search_cast(node: node, type: :text)
613
616
  value = _search_cast_string(value)
614
617
  value = value.last if value.is_a?(Range)
615
618
 
616
619
  where(node.gteq(value))
617
- end
620
+ }
618
621
 
619
622
  scope :_search_string_matches,
620
- ->(node:, value:) do
623
+ lambda { |node:, value:|
621
624
  node = _search_cast(node: node, type: :text)
622
625
  value = _search_cast_string(value)
623
626
 
@@ -630,10 +633,10 @@ module Search
630
633
  else
631
634
  where(node.matches("%#{value}%", nil, false))
632
635
  end
633
- end
636
+ }
634
637
 
635
638
  scope :_search_string_ends,
636
- ->(node:, value:) do
639
+ lambda { |node:, value:|
637
640
  node = _search_cast(node: node, type: :text)
638
641
  value = _search_cast_string(value)
639
642
 
@@ -646,10 +649,10 @@ module Search
646
649
  else
647
650
  where(node.matches("%#{value}", nil, false))
648
651
  end
649
- end
652
+ }
650
653
 
651
654
  scope :_search_string_starts,
652
- ->(node:, value:) do
655
+ lambda { |node:, value:|
653
656
  node = _search_cast(node: node, type: :text)
654
657
  value = _search_cast_string(value)
655
658
 
@@ -662,6 +665,6 @@ module Search
662
665
  else
663
666
  where(node.matches("#{value}%", nil, false))
664
667
  end
665
- end
668
+ }
666
669
  end
667
670
  end
data/package-lock.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
- "name": "code-ruby",
2
+ "name": "search_rails",
3
3
  "lockfileVersion": 3,
4
4
  "requires": true,
5
5
  "packages": {
6
6
  "": {
7
7
  "license": "MIT",
8
8
  "engines": {
9
- "node": "23.11.0",
10
- "npm": "11.2.0"
9
+ "node": "26.3.1",
10
+ "npm": "11.17.0"
11
11
  }
12
12
  }
13
13
  }
14
- }
14
+ }
data/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "license": "MIT",
3
3
  "engines": {
4
- "node": "23.11.0",
5
- "npm": "11.2.0"
4
+ "node": "26.3.1",
5
+ "npm": "11.17.0"
6
6
  }
7
- }
7
+ }
data/search_rails.gemspec CHANGED
@@ -12,12 +12,12 @@ Gem::Specification.new do |s|
12
12
  s.homepage = "https://github.com/dorianmariecom/search_rails"
13
13
  s.license = "MIT"
14
14
 
15
- s.add_dependency "rails"
15
+ s.add_dependency "chronic"
16
16
  s.add_dependency "query-ruby"
17
+ s.add_dependency "rails"
17
18
  s.add_dependency "zeitwerk"
18
- s.add_dependency "chronic"
19
19
 
20
20
  s.metadata["rubygems_mfa_required"] = "true"
21
21
 
22
- s.required_ruby_version = ">= 3.0"
22
+ s.required_ruby_version = ">= 4.0"
23
23
  end
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: search_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dorian Marié
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-05-17 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
- name: rails
13
+ name: chronic
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
16
  - - ">="
@@ -38,7 +38,7 @@ dependencies:
38
38
  - !ruby/object:Gem::Version
39
39
  version: '0'
40
40
  - !ruby/object:Gem::Dependency
41
- name: zeitwerk
41
+ name: rails
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - ">="
@@ -52,7 +52,7 @@ dependencies:
52
52
  - !ruby/object:Gem::Version
53
53
  version: '0'
54
54
  - !ruby/object:Gem::Dependency
55
- name: chronic
55
+ name: zeitwerk
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - ">="
@@ -87,6 +87,12 @@ files:
87
87
  - README.md
88
88
  - Rakefile
89
89
  - VERSION
90
+ - bin/bundle
91
+ - bin/bundle-audit
92
+ - bin/bundler-audit
93
+ - bin/dorian
94
+ - bin/rubocop
95
+ - bin/test
90
96
  - lib/search.rb
91
97
  - lib/search/version.rb
92
98
  - lib/search_rails.rb
@@ -105,14 +111,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
105
111
  requirements:
106
112
  - - ">="
107
113
  - !ruby/object:Gem::Version
108
- version: '3.0'
114
+ version: '4.0'
109
115
  required_rubygems_version: !ruby/object:Gem::Requirement
110
116
  requirements:
111
117
  - - ">="
112
118
  - !ruby/object:Gem::Version
113
119
  version: '0'
114
120
  requirements: []
115
- rubygems_version: 3.6.2
121
+ rubygems_version: 4.0.15
116
122
  specification_version: 4
117
123
  summary: a powerful search for rails
118
124
  test_files: []