attune 0.0.7 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a563fd197a9c289b606b60513d1ff6d59e923f59
4
- data.tar.gz: db9e422ab1230d0df8b763d04d3b18f6ef263a78
3
+ metadata.gz: 0cdd1d33ca1623326bd2c704e63db89f4fcd2108
4
+ data.tar.gz: 3c0959d27267e602ed662f979601d96cf0afa9f0
5
5
  SHA512:
6
- metadata.gz: 77f9eee386f7c94052fcae0e1c9badbe97294ad0fdb7cf5227876cd6a41127bf6563398c808904cddf9ba3a2968e95d3c28f3554b036a26158c841665f521eb1
7
- data.tar.gz: dcdabaec2faf8cc7d3e39f170a90a8fa970fae7de0dc3cfb2804a95067196c5bd7fe994c41a199557b6fc9b1d2ec8783f4ae64282698b96a18b7723e83691cbb
6
+ metadata.gz: d925942d0c3305bbdeb954f4d434f865b83930980ccd133738d67333dc7ab90e1ce075362bd29a866c5b2c20fb474fbaf21c49da4dc7a2bcf15a7a4c68c21f31
7
+ data.tar.gz: 209966761a7586eedc8234452f3fff3dac1d02928a4170d11f1ce255097ffe3a699b1fb52854956e0c4f5077cd971b3e05e92176c9022fbb5fdbfef252da9b41
data/README.md CHANGED
@@ -71,7 +71,7 @@ class ProductsController
71
71
  entities: products.map(&:id)
72
72
  )
73
73
  products.sort_by do |product|
74
- ranking.index(product.id.to_s)
74
+ ranking[:entities].index(product.id.to_s)
75
75
  end
76
76
  end
77
77
  end
data/lib/attune/client.rb CHANGED
@@ -112,18 +112,24 @@ module Attune
112
112
  # @option options [Array<String>] :entities entities to be ranked. These should be numeric strings or integers.
113
113
  # @option options [String] :ip ip address of remote user. Used for geolocation (optional)
114
114
  # @option options [String] :customer id of customer (optional)
115
- # @return ranking [Array<String>] The entities in their ranked order
115
+ # @return [Hash{Symbol => Hash, Array<String>}]
116
+ # * :headers the attune headers indicating ranking performed
117
+ # * :entities entities in their ranked order
116
118
  # @raise [ArgumentError] if required parameters are missing
117
119
  # @raise [Faraday::Error::ClientError] if the request fails or exceeds the timeout
118
120
  # @raise [AuthenticationException] if authorization header not accepted
119
121
  def get_rankings(options)
120
122
  qs = encoded_ranking_params(options)
123
+ rankings = {}
121
124
  if response = get("rankings/#{qs}", customer: options.fetch(:customer, 'none'))
122
- JSON.parse(response.body)['ranking']
125
+ rankings[:headers] = response.headers.select { |k,v| k =~ /^attune/ }
126
+ rankings[:entities] = JSON.parse(response.body)['ranking']
123
127
  else
124
128
  # In mock mode: return the entities in the order passed in
125
- options[:entities]
129
+ rankings[:headers] = {"attune-cell"=>"mock", "attune-ranking"=>"mock"}
130
+ rankings[:entities] = options[:entities]
126
131
  end
132
+ rankings
127
133
  end
128
134
 
129
135
  # Get multiple rankings in one call
@@ -144,29 +150,35 @@ module Attune
144
150
  # }
145
151
  # ])
146
152
  # @param [Array<Hash>] multi_options An array of options (see #get_rankings)
147
- # @return [Array<Array<String>>] rankings
153
+ # @return [Hash{Symbol => Hash, Array<Array<String>>}]
154
+ # * :headers the attune headers indicating ranking performed
155
+ # * :entities entities in their ranked order
148
156
  # @raise [Faraday::Error::ClientError] if the request fails or exceeds the timeout
149
157
  # @raise [AuthenticationException] if authorization header not accepted
150
158
  def multi_get_rankings(multi_options)
151
159
  requests = multi_options.map do |options|
152
160
  encoded_ranking_params(options)
153
161
  end
162
+ rankings = {}
154
163
  if response = get("rankings", ids: requests)
155
164
  results = JSON.parse(response.body)['results']
165
+ rankings[:headers] = response.headers.select { |k,v| k =~ /^attune/ }
156
166
 
157
167
  # Order of encoded paramaters may change, so we must parse them
158
168
  results = Hash[results.map do |request, result|
159
169
  [CGI.parse(request), result]
160
170
  end]
161
- requests.map do |request|
171
+ rankings[:entities] = requests.map do |request|
162
172
  results[CGI.parse(request)]['ranking']
163
173
  end
164
174
  else
165
175
  # In mock mode: return the entities in the order passed in
166
- multi_options.map do |options|
176
+ rankings[:headers] = {"attune-cell"=>"mock", "attune-ranking"=>"mock"}
177
+ rankings[:entities] = multi_options.map do |options|
167
178
  options[:entities]
168
179
  end
169
180
  end
181
+ rankings
170
182
  end
171
183
 
172
184
  # Binds an anonymous user to a customer id
@@ -1,3 +1,3 @@
1
1
  module Attune
2
- VERSION = "0.0.7"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -80,7 +80,11 @@ describe Attune::Client do
80
80
  collection: 'products',
81
81
  entities: %w[1001, 1002, 1003, 1004]
82
82
  )
83
- expect(result).to eq %w[1001, 1002, 1003, 1004]
83
+ expected = {
84
+ headers: {"attune-cell"=>"mock", "attune-ranking"=>"mock"},
85
+ entities: %w[1001, 1002, 1003, 1004]
86
+ }
87
+ expect(result).to eq expected
84
88
  end
85
89
  it "mocks multi_get_rankings" do
86
90
  result = client.multi_get_rankings([
@@ -89,7 +93,11 @@ describe Attune::Client do
89
93
  collection: 'products',
90
94
  entities: %w[1001, 1002, 1003, 1004]
91
95
  ])
92
- expect(result).to eq [%w[1001, 1002, 1003, 1004]]
96
+ expected = {
97
+ headers: {"attune-cell"=>"mock", "attune-ranking"=>"mock"},
98
+ entities: [%w[1001, 1002, 1003, 1004]]
99
+ }
100
+ expect(result).to eq expected
93
101
  end
94
102
  end
95
103
  end
@@ -125,66 +133,83 @@ describe Attune::Client do
125
133
  expect(id).to eq('abcd123')
126
134
  end
127
135
 
128
- it "can get_rankings" do
129
- stubs.get("rankings/anonymous=abcd123&entities=1001%2C%2C1002%2C%2C1003%2C%2C1004&entity_collection=products&ip=none&view=b%2Fmens-pants"){ [200, {}, %[{"ranking":["1004","1003","1002","1001"]}]] }
130
- rankings = client.get_rankings(
131
- id: 'abcd123',
132
- view: 'b/mens-pants',
133
- collection: 'products',
134
- entities: %w[1001, 1002, 1003, 1004]
135
- )
136
- stubs.verify_stubbed_calls
136
+ describe "get_rankings" do
137
+ before(:each) do
138
+ stubs.get("rankings/anonymous=abcd123&entities=1001%2C%2C1002%2C%2C1003%2C%2C1004&entity_collection=products&ip=none&view=b%2Fmens-pants"){ [200, {"attune-ranking"=>"test", "attune-cell"=>"test"}, %[{"ranking":["1004","1003","1002","1001"]}]] }
139
+ @rankings = client.get_rankings(
140
+ id: 'abcd123',
141
+ view: 'b/mens-pants',
142
+ collection: 'products',
143
+ entities: %w[1001, 1002, 1003, 1004]
144
+ )
145
+ stubs.verify_stubbed_calls
146
+ end
147
+
148
+ it "can get ranked entities" do
149
+ expect(@rankings[:entities]).to eq(%W[1004 1003 1002 1001])
150
+ end
137
151
 
138
- expect(rankings).to eq(%W[1004 1003 1002 1001])
152
+ it "can get ranking headers" do
153
+ expect(@rankings[:headers]).to eq({"attune-ranking"=>"test", "attune-cell"=>"test"})
154
+ end
139
155
  end
140
156
 
141
- let(:req1){ CGI::escape 'anonymous=0cddbc0-6114-11e3-949a-0800200c9a66&view=b%2Fmens-pants&entity_collection=products&entities=1001%2C%2C1002%2C%2C1003%2C%2C1004&ip=none' }
142
- let(:req2){ CGI::escape 'anonymous=0cddbc0-6114-11e3-949a-0800200c9a66&view=b%2Fmens-pants&entity_collection=products&entities=2001%2C%2C2002%2C%2C2003%2C%2C2004&ip=none' }
143
- it "can multi_get_rankings" do
144
- stubs.get("/rankings?ids=anonymous%3D0cddbc0-6114-11e3-949a-0800200c9a66%26entities%3D1001%252C%252C1002%252C%252C1003%252C%252C1004%26entity_collection%3Dproducts%26ip%3Dnone%26view%3Db%252Fmens-pants&ids=anonymous%3D0cddbc0-6114-11e3-949a-0800200c9a66%26entities%3D2001%252C%252C2002%252C%252C2003%252C%252C2004%26entity_collection%3Dproducts%26ip%3Dnone%26view%3Db%252Fmens-pants") do
145
- [200, {}, <<-JSON]
146
- {
147
- "errors": {},
148
- "results": {
149
- "anonymous=0cddbc0-6114-11e3-949a-0800200c9a66&entities=1001%2C%2C1002%2C%2C1003%2C%2C1004&entity_collection=products&ip=none&view=b%2Fmens-pants": {
150
- "ranking": [
151
- "1004",
152
- "1003",
153
- "1002",
154
- "1001"
155
- ]
157
+ describe "multi_get_rankings" do
158
+ let(:req1){ CGI::escape 'anonymous=0cddbc0-6114-11e3-949a-0800200c9a66&view=b%2Fmens-pants&entity_collection=products&entities=1001%2C%2C1002%2C%2C1003%2C%2C1004&ip=none' }
159
+ let(:req2){ CGI::escape 'anonymous=0cddbc0-6114-11e3-949a-0800200c9a66&view=b%2Fmens-pants&entity_collection=products&entities=2001%2C%2C2002%2C%2C2003%2C%2C2004&ip=none' }
160
+
161
+ before(:each) do
162
+ stubs.get("/rankings?ids=anonymous%3D0cddbc0-6114-11e3-949a-0800200c9a66%26entities%3D1001%252C%252C1002%252C%252C1003%252C%252C1004%26entity_collection%3Dproducts%26ip%3Dnone%26view%3Db%252Fmens-pants&ids=anonymous%3D0cddbc0-6114-11e3-949a-0800200c9a66%26entities%3D2001%252C%252C2002%252C%252C2003%252C%252C2004%26entity_collection%3Dproducts%26ip%3Dnone%26view%3Db%252Fmens-pants") do
163
+ [200, {"attune-ranking"=>"test", "attune-cell"=>"test"}, <<-JSON]
164
+ {
165
+ "errors": {},
166
+ "results": {
167
+ "anonymous=0cddbc0-6114-11e3-949a-0800200c9a66&entities=1001%2C%2C1002%2C%2C1003%2C%2C1004&entity_collection=products&ip=none&view=b%2Fmens-pants": {
168
+ "ranking": [
169
+ "1004",
170
+ "1003",
171
+ "1002",
172
+ "1001"
173
+ ]
174
+ },
175
+ "anonymous=0cddbc0-6114-11e3-949a-0800200c9a66&entities=2001%2C%2C2002%2C%2C2003%2C%2C2004&entity_collection=products&ip=none&view=b%2Fmens-pants": {
176
+ "ranking": [
177
+ "2004",
178
+ "2003",
179
+ "2002",
180
+ "2001"
181
+ ]
182
+ }
183
+ }
184
+ }
185
+ JSON
186
+ end
187
+ @rankings = client.multi_get_rankings([
188
+ {
189
+ id: '0cddbc0-6114-11e3-949a-0800200c9a66',
190
+ view: 'b/mens-pants',
191
+ collection: 'products',
192
+ entities: %w[1001, 1002, 1003, 1004]
156
193
  },
157
- "anonymous=0cddbc0-6114-11e3-949a-0800200c9a66&entities=2001%2C%2C2002%2C%2C2003%2C%2C2004&entity_collection=products&ip=none&view=b%2Fmens-pants": {
158
- "ranking": [
159
- "2004",
160
- "2003",
161
- "2002",
162
- "2001"
163
- ]
194
+ {
195
+ id: '0cddbc0-6114-11e3-949a-0800200c9a66',
196
+ view: 'b/mens-pants',
197
+ collection: 'products',
198
+ entities: %w[2001, 2002, 2003, 2004]
164
199
  }
165
- }
166
- }
167
- JSON
200
+ ])
201
+ stubs.verify_stubbed_calls
168
202
  end
169
- rankings = client.multi_get_rankings([
170
- {
171
- id: '0cddbc0-6114-11e3-949a-0800200c9a66',
172
- view: 'b/mens-pants',
173
- collection: 'products',
174
- entities: %w[1001, 1002, 1003, 1004]
175
- },
176
- {
177
- id: '0cddbc0-6114-11e3-949a-0800200c9a66',
178
- view: 'b/mens-pants',
179
- collection: 'products',
180
- entities: %w[2001, 2002, 2003, 2004]
181
- }
182
- ])
183
- stubs.verify_stubbed_calls
184
203
 
185
- expect(rankings).to eq [
186
- %W[1004 1003 1002 1001],
187
- %W[2004 2003 2002 2001]
188
- ]
204
+ it "can get ranked entities" do
205
+ expect(@rankings[:entities]).to eq [
206
+ %W[1004 1003 1002 1001],
207
+ %W[2004 2003 2002 2001]
208
+ ]
209
+ end
210
+
211
+ it "can get ranking headers" do
212
+ expect(@rankings[:headers]).to eq({"attune-ranking"=>"test", "attune-cell"=>"test"})
213
+ end
189
214
  end
190
215
  end
data/spec/remote_spec.rb CHANGED
@@ -35,24 +35,35 @@ describe "remote requests" do
35
35
  client.bind(id, '654321')
36
36
  end
37
37
 
38
+ let(:entities){ [202875,202876,202874,202900,202902,202898,202905,200182,200181,185940,188447,185932,190589,1238689589] }
38
39
  describe "get_rankings" do
39
- let(:entities){ [202875,202876,202874,202900,202902,202898,202905,200182,200181,185940,188447,185932,190589,1238689589] }
40
- it "can get rankings" do
40
+ before(:each) do
41
41
  id = client.create_anonymous(id: '123456', user_agent: 'Mozilla/5.0')
42
42
  client.bind(id, '654321')
43
- result = client.get_rankings(id: '123456', view: 'b/mens-pants', collection: 'products', entities: entities)
44
- result.should be_an Array
45
- result.sort.should == entities.map(&:to_s).sort
43
+ @result = client.get_rankings(id: '123456', view: 'b/mens-pants', collection: 'products', entities: entities)
44
+ end
45
+ it "can get ranked entities" do
46
+ @result[:entities].should be_an Array
47
+ @result[:entities].sort.should == entities.map(&:to_s).sort
46
48
  end
49
+ specify { expect(@result[:headers]).to be_a Hash }
50
+ specify { expect(@result[:headers]).to have_key "attune-ranking" }
51
+ specify { expect(@result[:headers]).to have_key "attune-cell" }
52
+ end
47
53
 
48
- it "can batch get rankings" do
54
+ describe "multi_get_rankings" do
55
+ before(:each) do
49
56
  id = client.create_anonymous(id: '123456', user_agent: 'Mozilla/5.0')
50
57
  client.bind(id, '654321')
51
- results = client.multi_get_rankings([id: '123456', view: 'b/mens-pants', collection: 'products', entities: entities])
52
- results.should be_an Array
53
-
54
- result, = *results
58
+ @results = client.multi_get_rankings([id: '123456', view: 'b/mens-pants', collection: 'products', entities: entities])
59
+ end
60
+ it "can batch get rankings" do
61
+ @results[:entities].should be_an Array
62
+ result, = *@results[:entities]
55
63
  result.sort.should == entities.map(&:to_s).sort
56
64
  end
65
+ specify { expect(@results[:headers]).to be_a Hash }
66
+ specify { expect(@results[:headers]).to have_key "attune-ranking" }
67
+ specify { expect(@results[:headers]).to have_key "attune-cell" }
57
68
  end
58
69
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: attune
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Hawthorn
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-21 00:00:00.000000000 Z
11
+ date: 2014-03-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday