forty_facets 0.1.9.1 → 0.2
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 +4 -4
- data/.ruby-version +1 -1
- data/CHANGELOG +8 -0
- data/forty_facets.gemspec +2 -2
- data/lib/forty_facets/filter/facet_filter_definition.rb +26 -20
- data/lib/forty_facets/filter/range_filter_definition.rb +15 -6
- data/lib/forty_facets/version.rb +3 -1
- data/test/smoke_test.rb +84 -74
- metadata +13 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 145715b5814badb1b542b7eac19af6683c1c624e55aeeb4cd65a3f7e69d84d1a
|
4
|
+
data.tar.gz: bfc630bf7222be66578beca4923982e7172343fdf08f7b932819eb73f7072e7e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 216b8f57082cd4d8b820484d089e47cde6e97ac21be0f9dd7761db01a150b30d110888d9826d617b6f9b8612880e446b5ffe86f0fddbdb7dddabe500d188d6c2
|
7
|
+
data.tar.gz: e635009e28fb7ec381295405d402f7026e9a3ca49eead6cd8541a93eea586734333eb9e60982e98fdd052869d4451fc32705d6045c328400cf3e3d7f8f07965c
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
3.1.2
|
data/CHANGELOG
ADDED
data/forty_facets.gemspec
CHANGED
@@ -18,11 +18,11 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_development_dependency "bundler"
|
21
|
+
spec.add_development_dependency "bundler"
|
22
22
|
spec.add_development_dependency "rake"
|
23
23
|
spec.add_development_dependency "minitest"
|
24
24
|
spec.add_development_dependency "sqlite3"
|
25
25
|
spec.add_development_dependency "coveralls"
|
26
|
-
spec.add_development_dependency "activerecord", "~>
|
26
|
+
spec.add_development_dependency "activerecord", "~> 7.0"
|
27
27
|
spec.add_development_dependency "byebug" # travis doenst like byebug
|
28
28
|
end
|
@@ -1,6 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module FortyFacets
|
2
4
|
class FacetFilterDefinition < FilterDefinition
|
3
|
-
|
4
5
|
class FacetFilter < Filter
|
5
6
|
def values
|
6
7
|
@values ||= Array.wrap(value).sort.uniq
|
@@ -12,12 +13,12 @@ module FortyFacets
|
|
12
13
|
order_accessor = definition.options[:order]
|
13
14
|
if order_accessor
|
14
15
|
if order_accessor.is_a?(Proc)
|
15
|
-
facet.sort_by!{|facet_value| order_accessor.call(facet_value.entity) }
|
16
|
+
facet.sort_by! { |facet_value| order_accessor.call(facet_value.entity) }
|
16
17
|
else
|
17
|
-
facet.sort_by!{|facet_value| facet_value.entity.send(order_accessor) }
|
18
|
+
facet.sort_by! { |facet_value| facet_value.entity.send(order_accessor) }
|
18
19
|
end
|
19
20
|
else
|
20
|
-
facet.sort_by!{|facet_value| -facet_value.count }
|
21
|
+
facet.sort_by! { |facet_value| -facet_value.count }
|
21
22
|
end
|
22
23
|
facet
|
23
24
|
end
|
@@ -49,12 +50,14 @@ module FortyFacets
|
|
49
50
|
def selected
|
50
51
|
entity = definition.origin_class
|
51
52
|
column = entity.columns_hash[definition.attribute.to_s]
|
52
|
-
|
53
|
+
type = entity.connection.lookup_cast_type_from_column(column)
|
54
|
+
values.map { |value| type.serialize(value) }
|
53
55
|
end
|
54
56
|
|
55
57
|
def build_scope
|
56
|
-
return
|
57
|
-
|
58
|
+
return proc { |base| base } if empty?
|
59
|
+
|
60
|
+
proc do |base|
|
58
61
|
base.joins(definition.joins).where(definition.qualified_column_name => value)
|
59
62
|
end
|
60
63
|
end
|
@@ -90,8 +93,9 @@ module FortyFacets
|
|
90
93
|
|
91
94
|
class BelongsToFilter < AssociationFacetFilter
|
92
95
|
def build_scope
|
93
|
-
return
|
94
|
-
|
96
|
+
return proc { |base| base } if empty?
|
97
|
+
|
98
|
+
proc do |base|
|
95
99
|
base.joins(definition.joins).where(definition.qualified_column_name => values)
|
96
100
|
end
|
97
101
|
end
|
@@ -115,8 +119,9 @@ module FortyFacets
|
|
115
119
|
|
116
120
|
class HasManyFilter < AssociationFacetFilter
|
117
121
|
def build_scope
|
118
|
-
return
|
119
|
-
|
122
|
+
return proc { |base| base } if empty?
|
123
|
+
|
124
|
+
proc do |base|
|
120
125
|
base_table = definition.origin_class.table_name
|
121
126
|
|
122
127
|
primary_key_column = "#{base_table}.#{definition.origin_class.primary_key}"
|
@@ -130,13 +135,13 @@ module FortyFacets
|
|
130
135
|
def facet
|
131
136
|
base_table = definition.search.root_class.table_name
|
132
137
|
join_name = [definition.association.name.to_s, base_table.to_s].sort.join('_')
|
133
|
-
foreign_id_col = definition.association.name.to_s.singularize
|
134
|
-
my_column = join_name
|
138
|
+
foreign_id_col = "#{definition.association.name.to_s.singularize}_id"
|
139
|
+
my_column = "#{join_name}.#{foreign_id_col}"
|
135
140
|
counts = without.result(skip_ordering: true)
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
141
|
+
.distinct
|
142
|
+
.joins(definition.joins)
|
143
|
+
.select("#{my_column} as foreign_id, count(#{my_column}) as occurrences")
|
144
|
+
.group(my_column)
|
140
145
|
counts.includes_values = []
|
141
146
|
entities_by_id = definition.association.klass.unscoped.find(counts.map(&:foreign_id)).group_by(&:id)
|
142
147
|
|
@@ -152,11 +157,12 @@ module FortyFacets
|
|
152
157
|
|
153
158
|
def build_filter(search_instance, param_value)
|
154
159
|
if association
|
155
|
-
|
160
|
+
case association.macro
|
161
|
+
when :belongs_to
|
156
162
|
BelongsToFilter.new(self, search_instance, param_value)
|
157
|
-
|
163
|
+
when :has_many
|
158
164
|
HasManyFilter.new(self, search_instance, param_value)
|
159
|
-
|
165
|
+
when :has_and_belongs_to_many
|
160
166
|
HasManyFilter.new(self, search_instance, param_value)
|
161
167
|
else
|
162
168
|
raise "Unsupported association type: #{association.macro}"
|
@@ -1,23 +1,27 @@
|
|
1
1
|
module FortyFacets
|
2
2
|
class RangeFilterDefinition < FilterDefinition
|
3
3
|
class RangeFilter < Filter
|
4
|
+
RANGE_REGEX = /(\d*) - (\d*)/.freeze
|
5
|
+
|
4
6
|
def build_scope
|
5
7
|
return Proc.new { |base| base } if empty?
|
6
8
|
|
7
9
|
Proc.new do |base|
|
8
|
-
base.joins(definition.joins)
|
9
|
-
|
10
|
+
scope = base.joins(definition.joins)
|
11
|
+
scope = scope.where("#{definition.qualified_column_name} >= ?", min_value) if min_value.present?
|
12
|
+
scope = scope.where("#{definition.qualified_column_name} <= ?", max_value) if max_value.present?
|
13
|
+
scope
|
10
14
|
end
|
11
15
|
end
|
12
16
|
|
13
17
|
def min_value
|
14
|
-
|
15
|
-
|
18
|
+
min, _max = range_values
|
19
|
+
min
|
16
20
|
end
|
17
21
|
|
18
22
|
def max_value
|
19
|
-
|
20
|
-
|
23
|
+
_min, max = range_values
|
24
|
+
max
|
21
25
|
end
|
22
26
|
|
23
27
|
def absolute_interval
|
@@ -32,6 +36,11 @@ module FortyFacets
|
|
32
36
|
absolute_interval.max
|
33
37
|
end
|
34
38
|
|
39
|
+
private
|
40
|
+
|
41
|
+
def range_values
|
42
|
+
value&.match(RANGE_REGEX)&.captures
|
43
|
+
end
|
35
44
|
end
|
36
45
|
|
37
46
|
def build_filter(search_instance, value)
|
data/lib/forty_facets/version.rb
CHANGED
data/test/smoke_test.rb
CHANGED
@@ -1,47 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'coveralls'
|
2
4
|
Coveralls.wear!
|
3
5
|
|
4
|
-
require
|
6
|
+
require 'minitest/autorun'
|
5
7
|
require 'test_helper'
|
6
8
|
require 'logger'
|
7
9
|
# require 'byebug'# travis doenst like byebug
|
8
10
|
require_relative '../lib/forty_facets'
|
9
11
|
|
10
|
-
#silence_warnings do
|
12
|
+
# silence_warnings do
|
11
13
|
require_relative 'fixtures'
|
12
|
-
#end
|
14
|
+
# end
|
13
15
|
|
14
16
|
class MovieSearch < FortyFacets::FacetSearch
|
15
17
|
model 'Movie'
|
16
18
|
|
17
19
|
text :title, name: 'Title'
|
18
20
|
facet :studio, name: 'Studio'
|
19
|
-
facet :year, order:
|
21
|
+
facet :year, order: proc { |year| -year }
|
20
22
|
facet :genres, name: 'Genre'
|
21
23
|
facet :actors, name: 'Actor'
|
22
24
|
range :price, name: 'Price'
|
23
25
|
facet :writers, name: 'Writer'
|
24
|
-
facet [
|
25
|
-
facet [
|
26
|
-
facet [
|
26
|
+
facet %i[studio country], name: 'Country'
|
27
|
+
facet %i[studio status], name: 'Studio status'
|
28
|
+
facet %i[studio producers], name: 'Producers'
|
27
29
|
sql_facet({ uschis: "studios.name = 'Uschi'", non_uschis: "studios.name != 'USCHI'" },
|
28
|
-
{ name:
|
29
|
-
sql_facet({ classic:
|
30
|
-
{ name:
|
31
|
-
sql_facet({ classic:
|
32
|
-
{ name:
|
33
|
-
text [
|
30
|
+
{ name: 'Uschis', path: %i[studio uschis], joins: [:studio] })
|
31
|
+
sql_facet({ classic: 'year <= 1980', non_classic: 'year > 1980' },
|
32
|
+
{ name: 'Classic', path: :classic })
|
33
|
+
sql_facet({ classic: 'year <= 1980', non_classic: 'year > 1980' },
|
34
|
+
{ name: 'Classic' })
|
35
|
+
text %i[studio description], name: 'Studio Description'
|
34
36
|
scope :classics, name: 'Name classics'
|
35
37
|
scope :year_lte, name: 'Year less than or equal', pass_value: true
|
36
38
|
custom :needs_complex_filtering
|
37
39
|
end
|
38
40
|
|
39
41
|
class SmokeTest < Minitest::Test
|
40
|
-
|
41
42
|
def test_sql_facet_with_belongs_to
|
42
|
-
search = MovieSearch.new({'studio-uschis' => {}})
|
43
|
+
search = MovieSearch.new({ 'studio-uschis' => {} })
|
43
44
|
assert_equal Movie.count, search.result.size
|
44
|
-
assert_equal search.filter([
|
45
|
+
assert_equal search.filter(%i[studio uschis]).facet,
|
46
|
+
[FortyFacets::FacetValue.new(:uschis, 0, false), FortyFacets::FacetValue.new(:non_uschis, 40, false)]
|
45
47
|
end
|
46
48
|
|
47
49
|
def test_it_finds_all_movies
|
@@ -50,57 +52,57 @@ class SmokeTest < Minitest::Test
|
|
50
52
|
end
|
51
53
|
|
52
54
|
def test_scope_filter
|
53
|
-
search = MovieSearch.new(
|
55
|
+
search = MovieSearch.new('search' => {})
|
54
56
|
assert_equal 40, search.result.size
|
55
57
|
assert search.filter(:classic).facet.include? FortyFacets::FacetValue.new(:classic, 6, false)
|
56
58
|
assert search.filter(:classic).facet.include? FortyFacets::FacetValue.new(:non_classic, 34, false)
|
57
59
|
|
58
|
-
search = MovieSearch.new(
|
60
|
+
search = MovieSearch.new('search' => { 'classic' => 'classic' })
|
59
61
|
assert_equal 6, search.result.size
|
60
62
|
assert search.filter(:classic).facet.include? FortyFacets::FacetValue.new(:classic, 6, true)
|
61
63
|
assert search.filter(:classic).facet.include? FortyFacets::FacetValue.new(:non_classic, 34, false)
|
62
64
|
|
63
|
-
search = MovieSearch.new(
|
65
|
+
search = MovieSearch.new('search' => { 'classic' => 'non_classic' })
|
64
66
|
assert_equal 34, search.result.size
|
65
67
|
assert search.filter(:classic).facet.include? FortyFacets::FacetValue.new(:classic, 6, false)
|
66
68
|
assert search.filter(:classic).facet.include? FortyFacets::FacetValue.new(:non_classic, 34, true)
|
67
69
|
|
68
|
-
search = MovieSearch.new(
|
70
|
+
search = MovieSearch.new('search' => { 'classic' => %w[non_classic classic] })
|
69
71
|
assert_equal 40, search.result.size
|
70
72
|
assert search.filter(:classic).facet.include? FortyFacets::FacetValue.new(:classic, 6, true)
|
71
73
|
assert search.filter(:classic).facet.include? FortyFacets::FacetValue.new(:non_classic, 34, true)
|
72
74
|
end
|
73
75
|
|
74
76
|
def test_scope_filter_without_path
|
75
|
-
search = MovieSearch.new(
|
77
|
+
search = MovieSearch.new('search' => {})
|
76
78
|
assert_equal 40, search.result.size
|
77
|
-
assert search.filter([
|
78
|
-
assert search.filter([
|
79
|
+
assert search.filter(%i[classic non_classic]).facet.include? FortyFacets::FacetValue.new(:classic, 6, false)
|
80
|
+
assert search.filter(%i[classic non_classic]).facet.include? FortyFacets::FacetValue.new(:non_classic, 34, false)
|
79
81
|
|
80
|
-
search = MovieSearch.new(
|
82
|
+
search = MovieSearch.new('search' => { 'classic-non_classic' => 'classic' })
|
81
83
|
assert_equal 6, search.result.size
|
82
|
-
assert search.filter([
|
83
|
-
assert search.filter([
|
84
|
+
assert search.filter(%i[classic non_classic]).facet.include? FortyFacets::FacetValue.new(:classic, 6, true)
|
85
|
+
assert search.filter(%i[classic non_classic]).facet.include? FortyFacets::FacetValue.new(:non_classic, 34, false)
|
84
86
|
|
85
|
-
search = MovieSearch.new(
|
87
|
+
search = MovieSearch.new('search' => { 'classic-non_classic' => 'non_classic' })
|
86
88
|
assert_equal 34, search.result.size
|
87
|
-
assert search.filter([
|
88
|
-
assert search.filter([
|
89
|
+
assert search.filter(%i[classic non_classic]).facet.include? FortyFacets::FacetValue.new(:classic, 6, false)
|
90
|
+
assert search.filter(%i[classic non_classic]).facet.include? FortyFacets::FacetValue.new(:non_classic, 34, true)
|
89
91
|
|
90
|
-
search = MovieSearch.new(
|
92
|
+
search = MovieSearch.new('search' => { 'classic-non_classic' => %w[non_classic classic] })
|
91
93
|
assert_equal 40, search.result.size
|
92
|
-
assert search.filter([
|
93
|
-
assert search.filter([
|
94
|
+
assert search.filter(%i[classic non_classic]).facet.include? FortyFacets::FacetValue.new(:classic, 6, true)
|
95
|
+
assert search.filter(%i[classic non_classic]).facet.include? FortyFacets::FacetValue.new(:non_classic, 34, true)
|
94
96
|
end
|
95
97
|
|
96
98
|
def test_text_filter
|
97
|
-
search = MovieSearch.new({'search' => { 'title' => 'ipsum' }})
|
99
|
+
search = MovieSearch.new({ 'search' => { 'title' => 'ipsum' } })
|
98
100
|
assert_equal 1, search.result.size
|
99
101
|
assert_equal 'ipsum', search.result.first.title
|
100
102
|
end
|
101
103
|
|
102
104
|
def test_year_filter
|
103
|
-
search = MovieSearch.new({'search' => { 'year' => '2011' }})
|
105
|
+
search = MovieSearch.new({ 'search' => { 'year' => '2011' } })
|
104
106
|
assert_equal [2011], search.result.map(&:year).uniq
|
105
107
|
|
106
108
|
facet = search.filter(:year).facet
|
@@ -108,34 +110,43 @@ class SmokeTest < Minitest::Test
|
|
108
110
|
end
|
109
111
|
|
110
112
|
def test_range_filter
|
111
|
-
search = MovieSearch.new({'search' => {'price' => '0 - 20'}})
|
113
|
+
search = MovieSearch.new({ 'search' => { 'price' => '0 - 20' } })
|
112
114
|
assert_equal Movie.count, search.result.size
|
113
115
|
|
114
|
-
search = MovieSearch.new({'search' => {'price' => '
|
115
|
-
assert_equal Movie.
|
116
|
+
search = MovieSearch.new({ 'search' => { 'price' => '5 - 10' } })
|
117
|
+
assert_equal Movie.where('price >= ? AND price <= ?', 5, 10).count, search.result.size
|
118
|
+
|
119
|
+
search = MovieSearch.new({ 'search' => { 'price' => '5 - ' } })
|
120
|
+
assert_equal Movie.where('price >= ?', 5).count, search.result.size
|
121
|
+
|
122
|
+
search = MovieSearch.new({ 'search' => { 'price' => ' - 5' } })
|
123
|
+
assert_equal Movie.where('price <= ?', 5).count, search.result.size
|
124
|
+
|
125
|
+
search = MovieSearch.new({ 'search' => { 'price' => '' } })
|
126
|
+
assert_equal Movie.count, search.result.size
|
116
127
|
end
|
117
128
|
|
118
129
|
def test_text_filter_via_belongs_to
|
119
130
|
description = Studio.first.description
|
120
|
-
search = MovieSearch.new({'search' => { 'studio-description' => description }})
|
131
|
+
search = MovieSearch.new({ 'search' => { 'studio-description' => description } })
|
121
132
|
|
122
|
-
assert_equal Movie.all.
|
133
|
+
assert_equal Movie.all.select { |m| m.studio.description == description }.size, search.result.size
|
123
134
|
assert_equal description, search.result.first.studio.description
|
124
135
|
end
|
125
136
|
|
126
137
|
def test_country_filter
|
127
|
-
search = MovieSearch.new('search' => { 'studio-country' => Country.first.id.to_s})
|
128
|
-
assert_equal [Country.first], search.result.map{|m| m.studio.country}.uniq
|
138
|
+
search = MovieSearch.new('search' => { 'studio-country' => Country.first.id.to_s })
|
139
|
+
assert_equal [Country.first], search.result.map { |m| m.studio.country }.uniq
|
129
140
|
assert_equal Movie.count / 2, search.result.count
|
130
141
|
|
131
|
-
search = MovieSearch.new('search' => { 'studio-country' => Country.last.id.to_s})
|
132
|
-
assert_equal [Country.last], search.result.map{|m| m.studio.country}.uniq
|
142
|
+
search = MovieSearch.new('search' => { 'studio-country' => Country.last.id.to_s })
|
143
|
+
assert_equal [Country.last], search.result.map { |m| m.studio.country }.uniq
|
133
144
|
assert_equal Movie.count / 2, search.result.count
|
134
145
|
end
|
135
146
|
|
136
147
|
def test_selected_country_filter
|
137
|
-
search = MovieSearch.new('search' => { 'studio-country' => Country.first.id.to_s})
|
138
|
-
filter = search.filter([
|
148
|
+
search = MovieSearch.new('search' => { 'studio-country' => Country.first.id.to_s })
|
149
|
+
filter = search.filter(%i[studio country])
|
139
150
|
assert_equal FortyFacets::FacetFilterDefinition::BelongsToFilter, filter.class
|
140
151
|
assert_equal [Country.first], filter.selected
|
141
152
|
|
@@ -143,17 +154,16 @@ class SmokeTest < Minitest::Test
|
|
143
154
|
end
|
144
155
|
|
145
156
|
def test_studio_status_filter
|
146
|
-
search = MovieSearch.new('search' => { 'studio-status' => 'active'})
|
147
|
-
assert_equal ['active'], search.result.map{|m| m.studio.status}.uniq
|
157
|
+
search = MovieSearch.new('search' => { 'studio-status' => 'active' })
|
158
|
+
assert_equal ['active'], search.result.map { |m| m.studio.status }.uniq
|
148
159
|
assert_equal Movie.count / 2, search.result.count
|
149
160
|
|
150
|
-
filter = search.filter([
|
161
|
+
filter = search.filter(%i[studio status])
|
151
162
|
assert_equal ['active'], filter.selected
|
152
163
|
end
|
153
164
|
|
154
165
|
def test_year_add_remove_filter
|
155
|
-
|
156
|
-
search = MovieSearch.new()
|
166
|
+
search = MovieSearch.new
|
157
167
|
|
158
168
|
search = search.filter(:year).add(2010)
|
159
169
|
assert_equal Movie.where(year: 2010).count, search.result.count
|
@@ -166,7 +176,7 @@ class SmokeTest < Minitest::Test
|
|
166
176
|
end
|
167
177
|
|
168
178
|
def test_selected_year_filter
|
169
|
-
search = MovieSearch.new
|
179
|
+
search = MovieSearch.new
|
170
180
|
|
171
181
|
search = search.filter(:year).add(2010)
|
172
182
|
assert_equal [2010], search.filter(:year).selected
|
@@ -175,9 +185,9 @@ class SmokeTest < Minitest::Test
|
|
175
185
|
assert_equal [2010, 2011], search.filter(:year).selected
|
176
186
|
|
177
187
|
facet = search.filter(:year).facet
|
178
|
-
assert facet.find{|fv| fv.entity == 2010}.selected
|
179
|
-
assert facet.find{|fv| fv.entity == 2011}.selected
|
180
|
-
assert !facet.find{|fv| fv.entity == 2012}.selected
|
188
|
+
assert facet.find { |fv| fv.entity == 2010 }.selected
|
189
|
+
assert facet.find { |fv| fv.entity == 2011 }.selected
|
190
|
+
assert !facet.find { |fv| fv.entity == 2012 }.selected
|
181
191
|
end
|
182
192
|
|
183
193
|
def test_belongs_to_filter
|
@@ -186,7 +196,7 @@ class SmokeTest < Minitest::Test
|
|
186
196
|
studio = first_facet_value.entity
|
187
197
|
assert_kind_of Studio, studio
|
188
198
|
|
189
|
-
movies_with_studio = Movie.where(studio:
|
199
|
+
movies_with_studio = Movie.where(studio:)
|
190
200
|
search_with_studio = blank_search.filter(:studio).add(studio)
|
191
201
|
|
192
202
|
assert_equal movies_with_studio.size, search_with_studio.result.size
|
@@ -196,7 +206,7 @@ class SmokeTest < Minitest::Test
|
|
196
206
|
def test_belongs_to_filter_with_default_scope
|
197
207
|
wrap_in_db_transaction do
|
198
208
|
deleted_studio = Studio.create!(name: 'Deleted studio', status: 'active')
|
199
|
-
|
209
|
+
Movie.create!(studio: deleted_studio)
|
200
210
|
deleted_studio.update!(deleted_at: Time.now)
|
201
211
|
|
202
212
|
blank_search = MovieSearch.new
|
@@ -216,7 +226,7 @@ class SmokeTest < Minitest::Test
|
|
216
226
|
def test_has_many
|
217
227
|
blank_search = MovieSearch.new
|
218
228
|
genre = Genre.first
|
219
|
-
expected = Movie.order(:id).select{|m| m.genres.include?(genre)}
|
229
|
+
expected = Movie.order(:id).select { |m| m.genres.include?(genre) }
|
220
230
|
assert blank_search.filter(:genres).is_a?(FortyFacets::FacetFilterDefinition::HasManyFilter)
|
221
231
|
search = blank_search.filter(:genres).add(genre)
|
222
232
|
actual = search.result
|
@@ -227,9 +237,9 @@ class SmokeTest < Minitest::Test
|
|
227
237
|
def test_hast_many_via_belongs_to
|
228
238
|
blank_search = MovieSearch.new
|
229
239
|
producer = Producer.first
|
230
|
-
expected = Movie.order(:id).select{|m| m.studio.producers.include? producer}
|
231
|
-
assert blank_search.filter([
|
232
|
-
search = blank_search.filter([
|
240
|
+
expected = Movie.order(:id).select { |m| m.studio.producers.include? producer }
|
241
|
+
assert blank_search.filter(%i[studio producers]).is_a?(FortyFacets::FacetFilterDefinition::HasManyFilter)
|
242
|
+
search = blank_search.filter(%i[studio producers]).add(producer)
|
233
243
|
actual = search.result
|
234
244
|
|
235
245
|
assert_equal expected.size, actual.size
|
@@ -238,7 +248,7 @@ class SmokeTest < Minitest::Test
|
|
238
248
|
def test_has_many_writers
|
239
249
|
blank_search = MovieSearch.new
|
240
250
|
writer = Writer.first
|
241
|
-
expected = Movie.order(:id).select{|m| m.writers.include?(writer)}
|
251
|
+
expected = Movie.order(:id).select { |m| m.writers.include?(writer) }
|
242
252
|
assert blank_search.filter(:writers).is_a?(FortyFacets::FacetFilterDefinition::HasManyFilter)
|
243
253
|
search = blank_search.filter(:writers).add(writer)
|
244
254
|
actual = search.result
|
@@ -251,8 +261,8 @@ class SmokeTest < Minitest::Test
|
|
251
261
|
genre = Genre.first
|
252
262
|
actor = Actor.first
|
253
263
|
expected = Movie.order(:id)
|
254
|
-
|
255
|
-
|
264
|
+
.select { |m| m.genres.include?(genre) }
|
265
|
+
.select { |m| m.actors.include?(actor) }
|
256
266
|
assert blank_search.filter(:genres).is_a?(FortyFacets::FacetFilterDefinition::HasManyFilter)
|
257
267
|
search_with_genre = blank_search.filter(:genres).add(genre)
|
258
268
|
search_with_genre_and_actor = search_with_genre.filter(:actors).add(actor)
|
@@ -267,11 +277,11 @@ class SmokeTest < Minitest::Test
|
|
267
277
|
|
268
278
|
search.filter(:writers).facet.each do |facet_value|
|
269
279
|
writer = facet_value.entity
|
270
|
-
expected = Movie.order(:id).select{|m| m.writers.include?(writer)}.count
|
271
|
-
assert_equal expected, facet_value.count,
|
280
|
+
expected = Movie.order(:id).select { |m| m.writers.include?(writer) }.count
|
281
|
+
assert_equal expected, facet_value.count,
|
282
|
+
'The amount of movies for a writer should match the number indicated in the facet'
|
272
283
|
assert_equal writer.id == selected_writer.id, facet_value.selected
|
273
284
|
end
|
274
|
-
|
275
285
|
end
|
276
286
|
|
277
287
|
def test_has_many_facet_values_genres
|
@@ -280,11 +290,11 @@ class SmokeTest < Minitest::Test
|
|
280
290
|
|
281
291
|
search.filter(:genres).facet.each do |facet_value|
|
282
292
|
genre = facet_value.entity
|
283
|
-
expected = Movie.order(:id).select{|m| m.genres.include?(genre)}.count
|
284
|
-
assert_equal expected, facet_value.count,
|
293
|
+
expected = Movie.order(:id).select { |m| m.genres.include?(genre) }.count
|
294
|
+
assert_equal expected, facet_value.count,
|
295
|
+
'The amount of movies for a genre should match the number indicated in the facet'
|
285
296
|
assert_equal genre.id == selected_genre.id, facet_value.selected
|
286
297
|
end
|
287
|
-
|
288
298
|
end
|
289
299
|
|
290
300
|
def test_includes_does_not_blow_up
|
@@ -293,14 +303,15 @@ class SmokeTest < Minitest::Test
|
|
293
303
|
search.filter(:studio).facet.reject(&:selected).to_a
|
294
304
|
end
|
295
305
|
|
296
|
-
def
|
297
|
-
search_with_scope = MovieSearch.new
|
306
|
+
def test_activating_scope_filter
|
307
|
+
search_with_scope = MovieSearch.new.filter(:classics).add('1')
|
298
308
|
assert search_with_scope.result.count < Movie.count, 'Activating the scope should yield a smaller set of movies'
|
299
309
|
end
|
300
310
|
|
301
311
|
def test_scope_filter_with_params
|
302
|
-
search_with_scope = MovieSearch.new
|
303
|
-
assert search_with_scope.result.count < Movie.count,
|
312
|
+
search_with_scope = MovieSearch.new.filter(:year_lte).add(1980)
|
313
|
+
assert search_with_scope.result.count < Movie.count,
|
314
|
+
'Activating the scope with filter should yield a smaller set of movies'
|
304
315
|
end
|
305
316
|
|
306
317
|
def test_custom_filter
|
@@ -309,5 +320,4 @@ class SmokeTest < Minitest::Test
|
|
309
320
|
|
310
321
|
assert_equal 'foo', new_search.filter(:needs_complex_filtering).value
|
311
322
|
end
|
312
|
-
|
313
323
|
end
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: forty_facets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.2'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Axel Tetzlaff
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-06-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,14 +86,14 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
89
|
+
version: '7.0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
96
|
+
version: '7.0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: byebug
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -121,6 +121,7 @@ files:
|
|
121
121
|
- ".ruby-gemset"
|
122
122
|
- ".ruby-version"
|
123
123
|
- ".travis.yml"
|
124
|
+
- CHANGELOG
|
124
125
|
- Gemfile
|
125
126
|
- LICENSE.txt
|
126
127
|
- README.md
|
@@ -146,7 +147,7 @@ homepage: https://github.com/fortytools/forty_facets
|
|
146
147
|
licenses:
|
147
148
|
- MIT
|
148
149
|
metadata: {}
|
149
|
-
post_install_message:
|
150
|
+
post_install_message:
|
150
151
|
rdoc_options: []
|
151
152
|
require_paths:
|
152
153
|
- lib
|
@@ -161,8 +162,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
161
162
|
- !ruby/object:Gem::Version
|
162
163
|
version: '0'
|
163
164
|
requirements: []
|
164
|
-
rubygems_version: 3.
|
165
|
-
signing_key:
|
165
|
+
rubygems_version: 3.3.7
|
166
|
+
signing_key:
|
166
167
|
specification_version: 4
|
167
168
|
summary: Library for building facet searches for active_record models
|
168
169
|
test_files:
|