pursuit 0.4.5 → 1.1.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.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rubygem.yaml +46 -0
  3. data/Gemfile +14 -13
  4. data/Gemfile.lock +14 -13
  5. data/README.md +210 -27
  6. data/bin/console +10 -0
  7. data/lib/pursuit/aggregate_modifier_not_found.rb +20 -0
  8. data/lib/pursuit/aggregate_modifier_required.rb +20 -0
  9. data/lib/pursuit/aggregate_modifiers_not_available.rb +13 -0
  10. data/lib/pursuit/attribute_not_found.rb +20 -0
  11. data/lib/pursuit/constants.rb +1 -1
  12. data/lib/pursuit/error.rb +7 -0
  13. data/lib/pursuit/predicate_parser.rb +181 -0
  14. data/lib/pursuit/predicate_search.rb +86 -0
  15. data/lib/pursuit/predicate_transform.rb +231 -0
  16. data/lib/pursuit/query_error.rb +7 -0
  17. data/lib/pursuit/simple_search.rb +66 -0
  18. data/lib/pursuit/term_parser.rb +44 -0
  19. data/lib/pursuit/term_search.rb +74 -0
  20. data/lib/pursuit/term_transform.rb +35 -0
  21. data/lib/pursuit.rb +18 -4
  22. data/pursuit.gemspec +4 -3
  23. data/spec/internal/app/models/application_record.rb +5 -0
  24. data/spec/internal/app/models/product.rb +3 -14
  25. data/spec/internal/app/models/product_category.rb +3 -1
  26. data/spec/internal/app/models/product_variation.rb +3 -1
  27. data/spec/internal/app/searches/product_category_search.rb +50 -0
  28. data/spec/internal/app/searches/product_search.rb +53 -0
  29. data/spec/internal/app/searches/product_variation_search.rb +53 -0
  30. data/spec/lib/pursuit/predicate_parser_spec.rb +1604 -0
  31. data/spec/lib/pursuit/predicate_search_spec.rb +116 -0
  32. data/spec/lib/pursuit/predicate_transform_spec.rb +624 -0
  33. data/spec/lib/pursuit/simple_search_spec.rb +73 -0
  34. data/spec/lib/pursuit/term_parser_spec.rb +271 -0
  35. data/spec/lib/pursuit/term_search_spec.rb +85 -0
  36. data/spec/lib/pursuit/term_transform_spec.rb +105 -0
  37. metadata +50 -25
  38. data/.travis.yml +0 -26
  39. data/lib/pursuit/dsl.rb +0 -28
  40. data/lib/pursuit/railtie.rb +0 -13
  41. data/lib/pursuit/search.rb +0 -172
  42. data/lib/pursuit/search_options.rb +0 -86
  43. data/lib/pursuit/search_term_parser.rb +0 -46
  44. data/spec/lib/pursuit/dsl_spec.rb +0 -22
  45. data/spec/lib/pursuit/search_options_spec.rb +0 -146
  46. data/spec/lib/pursuit/search_spec.rb +0 -516
  47. data/spec/lib/pursuit/search_term_parser_spec.rb +0 -34
  48. data/travis/gemfiles/5.2.gemfile +0 -8
  49. data/travis/gemfiles/6.0.gemfile +0 -8
  50. data/travis/gemfiles/6.1.gemfile +0 -8
  51. data/travis/gemfiles/7.0.gemfile +0 -8
@@ -0,0 +1,116 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Pursuit::PredicateSearch do
4
+ subject(:predicate_search) do
5
+ described_class.new(default_table: Product.arel_table, permit_aggregate_modifiers: true)
6
+ end
7
+
8
+ describe '#initialize' do
9
+ it 'is expected to set #default_table eq `default_table`' do
10
+ expect(predicate_search).to have_attributes(default_table: Product.arel_table)
11
+ end
12
+
13
+ it 'is expected to set #permit_aggregate_modifiers eq `permit_aggregate_modifiers`' do
14
+ expect(predicate_search).to have_attributes(permit_aggregate_modifiers: true)
15
+ end
16
+
17
+ it 'is expected to invoke the passed block' do
18
+ expect { |block| described_class.new(&block) }.to yield_control
19
+ end
20
+ end
21
+
22
+ describe '#permit_attribute' do
23
+ subject(:permit_attribute) { predicate_search.permit_attribute(name, attribute) }
24
+
25
+ context 'when `attribute` is nil' do
26
+ let(:name) { :title }
27
+ let(:attribute) { nil }
28
+
29
+ it 'is expected to add the attribute from #default_table to #permitted_attributes' do
30
+ permit_attribute
31
+ expect(predicate_search.permitted_attributes).to match(
32
+ hash_including(
33
+ title: Product.arel_table[:title]
34
+ )
35
+ )
36
+ end
37
+ end
38
+
39
+ context 'when `attribute` is a Symbol' do
40
+ let(:name) { :name }
41
+ let(:attribute) { :title }
42
+
43
+ it 'is expected to add the attribute from #default_table to #permitted_attributes' do
44
+ permit_attribute
45
+ expect(predicate_search.permitted_attributes).to match(
46
+ hash_including(
47
+ name: Product.arel_table[:title]
48
+ )
49
+ )
50
+ end
51
+ end
52
+
53
+ context 'when `attribute` is an Arel::Attributes::Attribute' do
54
+ let(:name) { :variation_currency }
55
+ let(:attribute) { ProductVariation.arel_table[:currency] }
56
+
57
+ it 'is expected to add the attribute to #permitted_attributes' do
58
+ permit_attribute
59
+ expect(predicate_search.permitted_attributes).to match(
60
+ hash_including(
61
+ variation_currency: ProductVariation.arel_table[:currency]
62
+ )
63
+ )
64
+ end
65
+ end
66
+ end
67
+
68
+ describe '#parser' do
69
+ subject(:parser) { predicate_search.parser }
70
+
71
+ it { is_expected.to be_a(Pursuit::PredicateParser) }
72
+ end
73
+
74
+ describe '#transform' do
75
+ subject(:transform) { predicate_search.transform }
76
+
77
+ it { is_expected.to be_a(Pursuit::PredicateTransform) }
78
+ end
79
+
80
+ describe '#parse' do
81
+ subject(:parse) { predicate_search.parse('title ~ Shirt & #variation > 0') }
82
+
83
+ before do
84
+ predicate_search.permitted_attributes[:title] = Product.arel_table[:title]
85
+ predicate_search.permitted_attributes[:variation] = ProductVariation.arel_table[:id]
86
+ predicate_search.permitted_attributes[:variation_title] = ProductVariation.arel_table[:title]
87
+ end
88
+
89
+ it 'is expected to equal a Hash containing the ARel nodes' do
90
+ expect(parse).to eq(
91
+ {
92
+ where: Product.arel_table[:title].matches('%Shirt%'),
93
+ having: ProductVariation.arel_table[:id].count.gt(0)
94
+ }
95
+ )
96
+ end
97
+ end
98
+
99
+ describe '#apply' do
100
+ subject(:apply) { predicate_search.apply('title ~ Shirt', Product.left_outer_joins(:variations).group(:id)) }
101
+
102
+ before do
103
+ predicate_search.permitted_attributes[:title] = Product.arel_table[:title]
104
+ predicate_search.permitted_attributes[:variation] = ProductVariation.arel_table[:id]
105
+ predicate_search.permitted_attributes[:variation_title] = ProductVariation.arel_table[:title]
106
+ end
107
+
108
+ it 'is expected to equal `relation` with predicate clauses applied' do
109
+ expect(apply).to eq(
110
+ Product.left_outer_joins(:variations).group(:id).where(
111
+ Product.arel_table[:title].matches('%Shirt%')
112
+ )
113
+ )
114
+ end
115
+ end
116
+ end