commendo 1.2.4 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +3 -0
  3. data/bin/commendo-create-mysql-db +3 -0
  4. data/bin/commendo-create.sql +99 -0
  5. data/bin/commendo-load-tsv +11 -5
  6. data/bin/commendo-load-tsv-mysql.rb +43 -0
  7. data/bin/commendo-time-mysql.rb +31 -0
  8. data/commendo.gemspec +4 -2
  9. data/lib/commendo.rb +24 -0
  10. data/lib/commendo/configuration.rb +25 -0
  11. data/lib/commendo/content_set.rb +13 -182
  12. data/lib/commendo/mysql-backed/content_set.rb +152 -0
  13. data/lib/commendo/mysql-backed/tag_set.rb +81 -0
  14. data/lib/commendo/mysql-backed/weighted_group.rb +40 -0
  15. data/lib/commendo/redis-backed/content_set.rb +194 -0
  16. data/lib/commendo/{pair_comparison.lua → redis-backed/pair_comparison.lua} +0 -0
  17. data/lib/commendo/{similarity.lua → redis-backed/similarity.lua} +0 -0
  18. data/lib/commendo/redis-backed/tag_set.rb +54 -0
  19. data/lib/commendo/redis-backed/weighted_group.rb +54 -0
  20. data/lib/commendo/tag_set.rb +6 -42
  21. data/lib/commendo/version.rb +1 -1
  22. data/lib/commendo/weighted_group.rb +7 -41
  23. data/lib/mysql2/client.rb +17 -0
  24. data/model 2.mwb +0 -0
  25. data/sql_model.mwb +0 -0
  26. data/test/configuration_test.rb +71 -0
  27. data/test/mysql_content_set_test.rb +40 -0
  28. data/test/mysql_tag_set_test.rb +34 -0
  29. data/test/mysql_weighted_group_test.rb +54 -0
  30. data/test/redis_content_set_test.rb +57 -0
  31. data/test/redis_tag_set_test.rb +31 -0
  32. data/test/redis_weighted_group_test.rb +49 -0
  33. data/test/tests_for_content_sets.rb +379 -0
  34. data/test/tests_for_tag_sets.rb +130 -0
  35. data/test/tests_for_weighted_groups.rb +106 -0
  36. metadata +72 -12
  37. data/test/content_set_test.rb +0 -408
  38. data/test/tag_set_test.rb +0 -128
  39. data/test/weighted_group_test.rb +0 -191
@@ -1,128 +0,0 @@
1
- gem 'minitest'
2
- require 'minitest/autorun'
3
- require 'minitest/pride'
4
- require 'minitest/mock'
5
- require 'mocha/setup'
6
- require 'commendo'
7
-
8
- module Commendo
9
-
10
- class TagSetTest < Minitest::Test
11
-
12
- def setup
13
- @redis = Redis.new(db: 15)
14
- @redis.flushdb
15
- @ts = TagSet.new(@redis, 'TagSetTest')
16
- end
17
-
18
- def test_adds_tags_for_resource
19
- assert_equal [], @ts.get(1)
20
- @ts.add(1, 'foo', 'bar', 'baz')
21
- assert_equal %w(bar baz foo), @ts.get(1)
22
- @ts.add(1, 'qux', 'qip')
23
- assert_equal %w(bar baz foo qip qux), @ts.get(1)
24
- end
25
-
26
- def test_empty?
27
- assert @ts.respond_to? :empty?
28
- assert @ts.empty?
29
- @ts.add(1, 'qux', 'qip')
30
- refute @ts.empty?
31
- @ts.delete(1)
32
- assert @ts.empty?
33
- end
34
-
35
- def test_sets_tags_for_resource
36
- assert_equal [], @ts.get(1)
37
- @ts.set(1, 'foo', 'bar', 'baz')
38
- assert_equal %w(bar baz foo), @ts.get(1)
39
- @ts.set(1, 'qux', 'qip')
40
- assert_equal %w(qip qux), @ts.get(1)
41
- end
42
-
43
- def test_sets_tags_when_empty
44
- @ts.set(1, 'foo', 'bar', 'baz')
45
- @ts.set(2, 'qux', 'qip')
46
- assert_equal %w(bar baz foo), @ts.get(1)
47
- assert_equal %w(qip qux), @ts.get(2)
48
- @ts.set(1, *[])
49
- assert_equal [], @ts.get(1)
50
- assert_equal %w(qip qux), @ts.get(2)
51
- end
52
-
53
- def test_deletes_all_tags_for_resource
54
- @ts.set(1, 'foo', 'bar', 'baz')
55
- @ts.set(2, 'qux', 'qip')
56
- assert_equal %w(bar baz foo), @ts.get(1)
57
- assert_equal %w(qip qux), @ts.get(2)
58
- @ts.delete(1)
59
- assert_equal [], @ts.get(1)
60
- assert_equal %w(qip qux), @ts.get(2)
61
- end
62
-
63
- def test_deletes_given_tags_for_resource
64
- assert_equal [], @ts.get(1)
65
- @ts.set(1, 'foo', 'bar', 'baz', 'qux', 'qip')
66
- @ts.delete(1, 'qux', 'qip')
67
- assert_equal %w(bar baz foo), @ts.get(1)
68
- end
69
-
70
- def test_matches_tags
71
- @ts.set(1, 'foo', 'bar', 'baz')
72
- @ts.set(2, 'qux', 'qip')
73
-
74
- assert @ts.matches(1, ['foo'])
75
- assert @ts.matches(1, %w(bar baz))
76
- assert @ts.matches(1, %w(bar baz foo))
77
- refute @ts.matches(1, ['qux'])
78
- refute @ts.matches(1, ['qip'])
79
-
80
- refute @ts.matches(2, ['foo'])
81
- refute @ts.matches(2, %w(bar baz))
82
- refute @ts.matches(2, %w(bar baz foo))
83
- assert @ts.matches(2, %w(qux qip))
84
- assert @ts.matches(2, ['qux'])
85
- assert @ts.matches(2, ['qip'])
86
- end
87
-
88
- def test_matches_exclude_tags
89
- @ts.set(1, 'foo', 'bar', 'baz')
90
- @ts.set(2, 'qux', 'qip')
91
-
92
- refute @ts.matches(1, nil, ['foo'])
93
- refute @ts.matches(1, [], ['foo'])
94
- refute @ts.matches(1, [], %w(bar baz))
95
- refute @ts.matches(1, [], %w(bar baz foo))
96
- assert @ts.matches(1, [], ['qux'])
97
- assert @ts.matches(1, [], ['qip'])
98
-
99
- assert @ts.matches(2, nil, ['foo'])
100
- assert @ts.matches(2, [], ['foo'])
101
- assert @ts.matches(2, [], %w(bar baz))
102
- assert @ts.matches(2, [], %w(bar baz foo))
103
- refute @ts.matches(2, [], %w(qux qip))
104
- refute @ts.matches(2, [], ['qux'])
105
- refute @ts.matches(2, [], ['qip'])
106
- end
107
-
108
- def test_matches_include_and_exclude_tags
109
- @ts.set(1, 'foo', 'bar', 'baz')
110
- @ts.set(2, 'qux', 'qip')
111
-
112
- refute @ts.matches(1, ['foo'], ['bar'])
113
- refute @ts.matches(1, ['bar'], ['foo'])
114
-
115
- assert @ts.matches(1, ['foo'], [])
116
- assert @ts.matches(1, ['foo'], nil)
117
- assert @ts.matches(1, ['foo'], ['qux'])
118
-
119
- assert @ts.matches(2, ['qip'], ['foo'])
120
- assert @ts.matches(2, ['qux'], %w(bar baz))
121
- assert @ts.matches(2, ['qip'], %w(bar baz foo))
122
- refute @ts.matches(2, ['qip'], %w(qux qip))
123
- refute @ts.matches(2, ['qip'], ['qux'])
124
- refute @ts.matches(2, ['qux'], ['qip'])
125
- end
126
-
127
- end
128
- end
@@ -1,191 +0,0 @@
1
- gem 'minitest'
2
- require 'minitest/autorun'
3
- require 'minitest/pride'
4
- require 'minitest/mock'
5
- require 'mocha/setup'
6
- require 'commendo'
7
-
8
- module Commendo
9
-
10
- class WeightedGroupTest < Minitest::Test
11
-
12
- def setup
13
- super
14
- @redis ||= Redis.new(db: 15)
15
- @redis.flushdb
16
- @tag_set = TagSet.new(@redis, 'CommendoTests:Tags')
17
- @cs1 = ContentSet.new(@redis, 'CommendoTests:ContentSet1', @tag_set)
18
- @cs2 = ContentSet.new(@redis, 'CommendoTests:ContentSet2', @tag_set)
19
- @cs3 = ContentSet.new(@redis, 'CommendoTests:ContentSet3', @tag_set)
20
- (3..23).each do |group|
21
- (3..23).each do |res|
22
- @cs1.add_by_group(group, res) if res.modulo(group).zero? && res.modulo(2).zero?
23
- @cs2.add_by_group(group, res) if res.modulo(group).zero? && res.modulo(3).zero?
24
- @cs3.add_by_group(group, res) if res.modulo(group).zero? && res.modulo(6).zero?
25
- @tag_set.add(res, 'mod3') if res.modulo(3).zero?
26
- @tag_set.add(res, 'mod4') if res.modulo(4).zero?
27
- @tag_set.add(res, 'mod5') if res.modulo(5).zero?
28
- @tag_set.add(res, 'mod7') if res.modulo(7).zero?
29
- end
30
- end
31
- [@cs1, @cs2, @cs3].each { |cs| cs.calculate_similarity }
32
- end
33
-
34
- def test_calls_each_content_set
35
- weighted_group = WeightedGroup.new(
36
- @redis,
37
- 'CommendoTests:WeightedGroup',
38
- {cs: @cs1, weight: 1.0},
39
- {cs: @cs2, weight: 10.0},
40
- {cs: @cs3, weight: 100.0}
41
- )
42
- expected = [
43
- {resource: '6', similarity: 74.037},
44
- {resource: '12', similarity: 55.5},
45
- {resource: '9', similarity: 6.67},
46
- {resource: '3', similarity: 4.0},
47
- {resource: '21', similarity: 2.86},
48
- {resource: '15', similarity: 2.86}
49
- ]
50
- assert_equal expected, weighted_group.similar_to(18)
51
- end
52
-
53
- def test_calls_each_content_set_with_limits
54
- weighted_group = WeightedGroup.new(
55
- @redis,
56
- 'CommendoTests:WeightedGroup',
57
- {cs: @cs1, weight: 1.0},
58
- {cs: @cs2, weight: 10.0},
59
- {cs: @cs3, weight: 100.0}
60
- )
61
- expected = [
62
- {resource: '6', similarity: 74.037},
63
- {resource: '12', similarity: 55.5},
64
- {resource: '9', similarity: 6.67},
65
- {resource: '3', similarity: 4.0},
66
- {resource: '21', similarity: 2.86},
67
- {resource: '15', similarity: 2.86}
68
- ]
69
- assert_equal expected[0..0], weighted_group.similar_to(18, 1)
70
- assert_equal expected[0..2], weighted_group.similar_to(18, 3)
71
- assert_equal expected, weighted_group.similar_to(18, 6)
72
- assert_equal expected, weighted_group.similar_to(18, 99)
73
- end
74
-
75
- def test_filters_include_recommendations
76
- weighted_group = WeightedGroup.new(
77
- @redis,
78
- 'CommendoTests:WeightedGroup',
79
- {cs: @cs1, weight: 1.0},
80
- {cs: @cs2, weight: 10.0},
81
- {cs: @cs3, weight: 100.0}
82
- )
83
- expected = [{resource: '15', similarity: 2.86}]
84
- weighted_group.tag_set = @tag_set
85
- assert_equal expected, weighted_group.filtered_similar_to(18, include: ['mod5'])
86
- end
87
-
88
- def test_filters_exclude_recommendations
89
- weighted_group = WeightedGroup.new(
90
- @redis,
91
- 'CommendoTests:WeightedGroup',
92
- {cs: @cs1, weight: 1.0},
93
- {cs: @cs2, weight: 10.0},
94
- {cs: @cs3, weight: 100.0}
95
- )
96
- expected = [
97
- {resource: '6', similarity: 74.037},
98
- {resource: '12', similarity: 55.5},
99
- {resource: '9', similarity: 6.67},
100
- {resource: '3', similarity: 4.0}
101
- ]
102
- weighted_group.tag_set = @tag_set
103
- assert_equal expected, weighted_group.filtered_similar_to(18, exclude: ['mod5', 'mod7'])
104
- end
105
-
106
- def test_filters_include_and_exclude_recommendations
107
- weighted_group = WeightedGroup.new(
108
- @redis,
109
- 'CommendoTests:WeightedGroup',
110
- {cs: @cs1, weight: 100.0},
111
- {cs: @cs2, weight: 10.0},
112
- {cs: @cs3, weight: 1.0}
113
- )
114
- expected = [
115
- {resource: '16', similarity: 80.0},
116
- {resource: '4', similarity: 66.7},
117
- {resource: '12', similarity: 33.3}
118
- ]
119
- weighted_group.tag_set = @tag_set
120
- assert_equal expected, weighted_group.filtered_similar_to(8, include: ['mod4'], exclude: ['mod5'])
121
- end
122
-
123
- def test_filters_include_and_exclude_recommendations_and_limits
124
- weighted_group = WeightedGroup.new(
125
- @redis,
126
- 'CommendoTests:WeightedGroup',
127
- {cs: @cs1, weight: 100.0},
128
- {cs: @cs2, weight: 10.0},
129
- {cs: @cs3, weight: 1.0}
130
- )
131
- expected = [
132
- {resource: '16', similarity: 80.0},
133
- {resource: '4', similarity: 66.7},
134
- {resource: '12', similarity: 33.3}
135
- ]
136
- weighted_group.tag_set = @tag_set
137
- assert_equal expected[0..0], weighted_group.filtered_similar_to(8, include: ['mod4'], exclude: ['mod5'], limit: 1)
138
- assert_equal expected[0..1], weighted_group.filtered_similar_to(8, include: ['mod4'], exclude: ['mod5'], limit: 2)
139
- assert_equal expected, weighted_group.filtered_similar_to(8, include: ['mod4'], exclude: ['mod5'], limit: 3)
140
- assert_equal expected, weighted_group.filtered_similar_to(8, include: ['mod4'], exclude: ['mod5'], limit: 99)
141
- end
142
-
143
- def test_similar_to_mutliple_items
144
- weighted_group = WeightedGroup.new(
145
- @redis,
146
- 'CommendoTests:WeightedGroup',
147
- {cs: @cs1, weight: 100.0},
148
- {cs: @cs2, weight: 10.0},
149
- {cs: @cs3, weight: 1.0}
150
- )
151
- expected = [
152
- {resource: '12', similarity: 118.037},
153
- {resource: '18', similarity: 78.037},
154
- {resource: '8', similarity: 66.7},
155
- {resource: '16', similarity: 50.0},
156
- {resource: '20', similarity: 40.0},
157
- {resource: '9', similarity: 11.67},
158
- {resource: '21', similarity: 9.0},
159
- {resource: '15', similarity: 9.0},
160
- {resource: '6', similarity: 6.67},
161
- {resource: '3', similarity: 6.67}
162
- ]
163
- weighted_group.tag_set = @tag_set
164
- assert_equal expected, weighted_group.similar_to([3,4,5,6,7])
165
- end
166
-
167
- def test_filtered_similar_to_mutliple_items
168
- weighted_group = WeightedGroup.new(
169
- @redis,
170
- 'CommendoTests:WeightedGroup',
171
- {cs: @cs1, weight: 100.0},
172
- {cs: @cs2, weight: 10.0},
173
- {cs: @cs3, weight: 1.0}
174
- )
175
- expected = [
176
- {resource: '12', similarity: 118.037},
177
- {resource: '8', similarity: 66.7},
178
- {resource: '16', similarity: 50.0},
179
- ]
180
- weighted_group.tag_set = @tag_set
181
- assert_equal expected, weighted_group.filtered_similar_to([3,4,5,6,7], include: ['mod4'], exclude: ['mod5'])
182
- end
183
-
184
- def test_precalculates
185
- skip
186
- end
187
-
188
-
189
- end
190
-
191
- end