meducation_sdk 1.6.3 → 1.6.4
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/CHANGELOG.md +3 -0
- data/lib/meducation_sdk/services/recommender.rb +10 -3
- data/lib/meducation_sdk/version.rb +1 -1
- data/test/services/recommender_test.rb +70 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1c88f47006482637173b6f0ecefb769bf0fc8cba
|
4
|
+
data.tar.gz: 413eca4a6ba923a7374bf5d4f0c526a0836c5969
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cc609c0703bfb356080658287b5ae6f4fe156d8eadbb3a2a5e69e5a80eebfd1638429ab3265bd277fe18a573efbbf8d3ebb570dd97bf6bca8a9d380a89cb5816
|
7
|
+
data.tar.gz: e5145e0d61744cba03195e9899de18ed8e4cae404b0c53783c0ed5ae254790d5663d48f6f59cb21433d55007172d072daeed6efb6e81ef48c5b5a0268f94e2f8
|
data/CHANGELOG.md
CHANGED
@@ -10,16 +10,23 @@ module MeducationSDK
|
|
10
10
|
def initialize(item, options = {})
|
11
11
|
@item = item
|
12
12
|
@options = options
|
13
|
+
@limit = options[:limit] || 5
|
13
14
|
end
|
14
15
|
|
15
16
|
def recommend
|
16
|
-
generate_recommendations
|
17
|
+
recommendations = generate_recommendations
|
18
|
+
if recommendations.size < @limit
|
19
|
+
log "recommendations.size (#{recommendations.size}) is < limit of #{@limit}"
|
20
|
+
recommendations += MeducationSDK::MediaFile.where('rating > 2').per(@limit - recommendations.size).order(:random).to_a
|
21
|
+
else
|
22
|
+
log "recommendations.size (#{recommendations.size}) is >= limit of #{@limit}"
|
23
|
+
end
|
24
|
+
recommendations
|
17
25
|
rescue => e
|
18
26
|
log_error("!!Recommender Error!!")
|
19
27
|
log_error(e.message)
|
20
28
|
log_error(e.backtrace)
|
21
|
-
|
22
|
-
[]
|
29
|
+
MeducationSDK::MediaFile.where('rating > 2').per(@limit).order(:random).to_a
|
23
30
|
end
|
24
31
|
|
25
32
|
def generate_recommendations
|
@@ -3,6 +3,14 @@ require_relative '../test_helper'
|
|
3
3
|
module MeducationSDK
|
4
4
|
class RecommenderTest < Minitest::Test
|
5
5
|
|
6
|
+
def setup
|
7
|
+
@per_result = mock
|
8
|
+
@per_result.stubs(where: @per_result)
|
9
|
+
@per_result.stubs(order: @per_result)
|
10
|
+
@per_result.stubs(per: @per_result)
|
11
|
+
@per_result.stubs(to_a: [])
|
12
|
+
end
|
13
|
+
|
6
14
|
def empty_response
|
7
15
|
mock(body: '[]')
|
8
16
|
end
|
@@ -15,6 +23,10 @@ module MeducationSDK
|
|
15
23
|
@item2 ||= MediaFile.new({id: 56})
|
16
24
|
end
|
17
25
|
|
26
|
+
def item3
|
27
|
+
@item3 ||= MediaFile.new({id: 57})
|
28
|
+
end
|
29
|
+
|
18
30
|
def test_should_call_new
|
19
31
|
Recommender.expects(:new).with(item, {}).returns(mock(recommend: nil))
|
20
32
|
Recommender.recommend(item)
|
@@ -26,7 +38,9 @@ module MeducationSDK
|
|
26
38
|
end
|
27
39
|
|
28
40
|
def test_should_call_the_recommender_service
|
41
|
+
@per_result.expects(:per).with(5).returns(@per_result)
|
29
42
|
Net::HTTP.expects(:get_response).with("recommender.meducation.net", "/MediaFile/#{item.id}", 4567).returns(empty_response)
|
43
|
+
MediaFile.expects(:where).with('rating > 2').returns(@per_result)
|
30
44
|
Recommender.new(item).recommend
|
31
45
|
end
|
32
46
|
|
@@ -36,12 +50,46 @@ module MeducationSDK
|
|
36
50
|
{"type" => "MediaFile", "id" => item2.id, "score" => 0.0078}
|
37
51
|
].to_json
|
38
52
|
|
53
|
+
@per_result.expects(:per).with(3).returns(@per_result)
|
39
54
|
Net::HTTP.expects(:get_response).returns(mock(body: json))
|
40
55
|
MediaFile.expects(:where).with({id: [item.id, item2.id]}).returns([item, item2])
|
56
|
+
MediaFile.expects(:where).with('rating > 2').returns(@per_result)
|
41
57
|
items = Recommender.new(item).recommend
|
42
58
|
assert_equal [item, item2], items
|
43
59
|
end
|
44
60
|
|
61
|
+
def test_should_not_get_more_resources_if_enough_recommendations
|
62
|
+
json = [
|
63
|
+
{"type" => "MediaFile", "id" => item.id, "score" => 0.0097},
|
64
|
+
{"type" => "MediaFile", "id" => item2.id, "score" => 0.0078}
|
65
|
+
].to_json
|
66
|
+
|
67
|
+
Net::HTTP.expects(:get_response).returns(mock(body: json))
|
68
|
+
MediaFile.expects(:where).with({id: [item.id, item2.id]}).returns([item, item2])
|
69
|
+
MediaFile.expects(:where).with('rating > 2').never
|
70
|
+
items = Recommender.new(item, limit: 2).recommend
|
71
|
+
assert_equal [item, item2], items
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_should_get_more_resources_if_too_few_recommendations
|
75
|
+
json = [
|
76
|
+
{"type" => "MediaFile", "id" => item.id, "score" => 0.0097},
|
77
|
+
{"type" => "MediaFile", "id" => item2.id, "score" => 0.0078}
|
78
|
+
].to_json
|
79
|
+
|
80
|
+
limit = 5
|
81
|
+
|
82
|
+
@per_result.expects(:per).with(3).returns(@per_result)
|
83
|
+
@per_result.stubs(to_a: [item3])
|
84
|
+
|
85
|
+
Net::HTTP.expects(:get_response).returns(mock(body: json))
|
86
|
+
MediaFile.expects(:where).with({id: [item.id, item2.id]}).returns([item, item2])
|
87
|
+
good_resources = mock
|
88
|
+
MediaFile.expects(:where).with('rating > 2').returns(@per_result)
|
89
|
+
items = Recommender.new(item, limit: limit).recommend
|
90
|
+
assert_equal [item, item2, item3], items
|
91
|
+
end
|
92
|
+
|
45
93
|
def test_should_limit_correctly
|
46
94
|
items = 6.times.map { |x| MediaFile.new({id: x}) }
|
47
95
|
json = items.map {|item| {"type" => "MediaFile", "id" => item.id, "score" => 0.0097} }.to_json
|
@@ -51,13 +99,34 @@ module MeducationSDK
|
|
51
99
|
results = Recommender.new(item, limit: 3).recommend
|
52
100
|
end
|
53
101
|
|
54
|
-
def
|
102
|
+
def test_should_log_recommender_exception
|
103
|
+
@per_result.expects(:per).with(5).returns(@per_result)
|
104
|
+
@per_result.stubs(to_a: [item3])
|
55
105
|
Net::HTTP.expects(:get_response).raises(StandardError)
|
56
106
|
MeducationSDK.config.logger.expects(:error).with("!!Recommender Error!!")
|
57
107
|
MeducationSDK.config.logger.expects(:error).with("StandardError")
|
108
|
+
MediaFile.stubs(:where).with('rating > 2').returns(@per_result)
|
58
109
|
Recommender.new(item).recommend
|
59
110
|
end
|
60
111
|
|
112
|
+
def test_should_get_good_resources_if_error_from_recommender
|
113
|
+
@per_result.expects(:per).with(5).returns(@per_result)
|
114
|
+
@per_result.stubs(to_a: [item3])
|
115
|
+
Net::HTTP.expects(:get_response).raises(StandardError)
|
116
|
+
MediaFile.stubs(:where).with('rating > 2').returns(@per_result)
|
117
|
+
items = Recommender.new(item).recommend
|
118
|
+
assert_equal [item3], items
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_should_get_good_resources_if_error_from_recommender
|
122
|
+
@per_result.expects(:per).with(5).returns(@per_result)
|
123
|
+
@per_result.stubs(to_a: [item3])
|
124
|
+
Net::HTTP.expects(:get_response).raises(StandardError)
|
125
|
+
MediaFile.stubs(:where).with('rating > 2').returns(@per_result)
|
126
|
+
items = Recommender.new(item).recommend
|
127
|
+
assert_equal [item3], items
|
128
|
+
end
|
129
|
+
|
61
130
|
def test_should_catch_an_exception_and_render_backup_recommendations
|
62
131
|
skip
|
63
132
|
recommendation = Item::Recommendation.create!(
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: meducation_sdk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.6.
|
4
|
+
version: 1.6.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Walker
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|