bluekai 0.0.1 → 0.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.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/lib/bluekai/category.rb +145 -0
  4. data/lib/bluekai/client.rb +20 -321
  5. data/lib/bluekai/rule.rb +165 -0
  6. data/lib/bluekai/user_data.rb +90 -0
  7. data/lib/bluekai/version.rb +1 -1
  8. data/lib/bluekai.rb +3 -0
  9. data/spec/fixtures/signatures/0e01a80ff1ca77f4fd32b58ff48310168539a9a26e4ef527042b7bab78d4648a +1 -0
  10. data/spec/fixtures/signatures/7fe2b3662915bf82890e1fe870480885e0744b12832569c5d7017a0fc42d5527 +1 -0
  11. data/spec/fixtures/signatures/8cd7ba76199d2b34be042841a2dd69310619dcac0f3dd4f24bae6b5fb5f9e302 +1 -0
  12. data/spec/fixtures/signatures/95768bffa5416007061da13a2a0368e52a4bea3451ac2dfede43f6a6841ac402 +1 -0
  13. data/spec/fixtures/vcr_cassettes/{Bluekai_Client → Bluekai_Category}/creates_a_category.yml +10 -10
  14. data/spec/fixtures/vcr_cassettes/Bluekai_Category/lists_4_categories.yml +104 -0
  15. data/spec/fixtures/vcr_cassettes/{Bluekai_Client → Bluekai_Category}/reads_a_category_and_its_reach.yml +1616 -1610
  16. data/spec/fixtures/vcr_cassettes/{Bluekai_Client → Bluekai_Category}/updates_a_category.yml +9 -9
  17. data/spec/fixtures/vcr_cassettes/Bluekai_Client/lists_Bluekai_taxonomy_nodes.yml +28225 -27370
  18. data/spec/fixtures/vcr_cassettes/Bluekai_Client/performs_a_ping.yml +4 -4
  19. data/spec/fixtures/vcr_cassettes/{Bluekai_Client → Bluekai_Rule}/creates_a_rule.yml +11 -11
  20. data/spec/fixtures/vcr_cassettes/Bluekai_Rule/lists_10_phint_rules.yml +234 -0
  21. data/spec/fixtures/vcr_cassettes/{Bluekai_Client → Bluekai_Rule}/reads_a_rule.yml +12 -10
  22. data/spec/fixtures/vcr_cassettes/{Bluekai_Client → Bluekai_Rule}/updates_a_rule.yml +7 -7
  23. data/spec/fixtures/vcr_cassettes/Bluekai_UserData/reads_user_information_given_bkuuid.yml +44 -0
  24. data/spec/lib/bluekai/category_integration_spec.rb +56 -0
  25. data/spec/lib/bluekai/client_integration_spec.rb +1 -141
  26. data/spec/lib/bluekai/client_spec.rb +0 -3
  27. data/spec/lib/bluekai/rule_integration_spec.rb +73 -0
  28. data/spec/lib/bluekai/user_data_integration_spec.rb +12 -0
  29. data/spec/spec_helper.rb +3 -2
  30. data/spec/support/signature_mock.rb +13 -0
  31. metadata +40 -19
  32. data/spec/fixtures/vcr_cassettes/Bluekai_Client/lists_10_phint_rules.yml +0 -194
  33. data/spec/fixtures/vcr_cassettes/Bluekai_Client/lists_4_categories.yml +0 -3569
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 68f6e5115ea82ddcda1d0ad4780f27fd0b33d73e
4
- data.tar.gz: acd51bbeef54aac2ce754571fbb6fe3cd592707a
3
+ metadata.gz: 884b8ab4ddf4ef8a43bc1db28ac1debe3aef971e
4
+ data.tar.gz: bdf076635dca5a8abdba847babceba50a8ad7b35
5
5
  SHA512:
6
- metadata.gz: 8460428509ffdac8f0b0994f4be95fa89982e967d67d7342a5b9a796729e6672f2aa879e1b247798b65a8afabff27be2e3f757da0e4b8a97fd76127c44843b80
7
- data.tar.gz: e35bbd450af7dc97de6489f679c8fbfa6415e483d967dcb322088d49db60f757a816aa42ccf98276588d64588fc8b4226ea1a46dcc32ec59d1a7c631ee8a6b72
6
+ metadata.gz: 664d9bbe62982c47ceffaa5eca7016af38419aadbf8eba0c6266c9c72c9bc769c1239dc48932d8730365fc358b131367278435a1475756239ac8f4cafe477ecb
7
+ data.tar.gz: a181f51512a3366464432d75d51753cb5a476a66ac4ac82e17a437236c085371100d39de25432def24c9d99c7f694b66bd6abec072a1d57e6422d5ecc4fd2da6
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.2.0
1
+ 2.2.1
@@ -0,0 +1,145 @@
1
+ module Bluekai
2
+ class Category < Client
3
+ ####
4
+ #### Categories
5
+ ####
6
+ #### API definition can be found here
7
+ #### https://kb.bluekai.com/display/PD/Self-Classification+Category+API
8
+ ####
9
+
10
+ # Public: Lists self classification categories in private taxonomy
11
+ #
12
+ # name:string - Returns all self-classification categories based on the specified
13
+ # name (whole or partial). The name is case-insensitive.
14
+ #
15
+ # offset:integer - Specify the starting index from which to return
16
+ # the self-classification categories.
17
+ #
18
+ # size:integer - Specifies the maximum number of categories to be included in
19
+ # the response. This filter requires the offset filter to be specified.
20
+ #
21
+ # parent_id:integer - Returns all self-classification categories
22
+ # based on the ID of the specified parent category.
23
+ #
24
+ # sort_by:string - Enter 'name' or 'id' to sort the returned self-classification categories in
25
+ # alphabetical or numerical order (based on categoryId)
26
+ #
27
+ # sorting_order:string - Enter 'asc' or 'desc' to list the returned
28
+ # self-classification categories in ascending
29
+ # or descending order based on the category
30
+ # name or categoryId.
31
+ #
32
+ # Returns array of category hashes
33
+ def category_list(query = {})
34
+ query = { sort_by: 'name',
35
+ sorting_order: 'asc' }.merge(query)
36
+ request('GET', '/Services/WS/classificationCategories', query)[:categories]
37
+ end
38
+
39
+ # Public: returns the self-classification category
40
+ # specified by the category_id
41
+ #
42
+ # category_id:integer - MANDATORY The unique ID assigned to the
43
+ # self-classification category to be retrieved
44
+ #
45
+ # stats:string - {'True','False'} Returns the reach (estimated
46
+ # number of unique users based on 30-day
47
+ # inventory) for the self-classification category.
48
+ #
49
+ # device_type:string - reach for the self-classification category
50
+ # based on the specified device, which may either
51
+ # be 'all', 'desktop', or 'mobile'
52
+ #
53
+ # intl_code - returns the reach for the self-classification category
54
+ # based on the specified country. The default country
55
+ # is ALL. You may enter one of the following country
56
+ # codes: ALL, US, AU, CA, GB, GER, ESP, NL, MX, IT,
57
+ # FR, BR, AR, RU, NZ, JP, CL, CN.
58
+ #
59
+ # Returns: A hash of Bluekai private category data
60
+ def category_read(query)
61
+ fail 'no category_id found in hash' unless query.key?(:category_id)
62
+ category_id = query.delete(:category_id)
63
+ request('GET', "/Services/WS/classificationCategories/#{category_id}", query)
64
+ end
65
+
66
+ # Public: Creates a new self-classification category
67
+ #
68
+ # name:string - Name of the self-classification category
69
+ #
70
+ # parent_id:integer - Unique ID of the parent node for the
71
+ # self-classification category.
72
+ #
73
+ # description:string - Description of uUser attribute
74
+ # represented by this category.
75
+ #
76
+ # analytics_excluded:string - {'True','False'} Specify whether the
77
+ # self-classification category is to be excluded
78
+ # from Audience Analytics reports. This property
79
+ # is false by default.
80
+ #
81
+ # navigation_only:string - {'True','False'} Specify whether the
82
+ # self-classification category functions
83
+ # exclusively as a parent node that cannot be
84
+ # selected. This property is false by default.
85
+ #
86
+ # mutex_children:string - {'True','False'} Specify whether to limit
87
+ # the number of the category's child nodes
88
+ # that can be added to an audience segment to one.
89
+ # This property is false by default.
90
+ #
91
+ # notes:string - (Optional) Enter any notes to be associated with
92
+ # this self-classification category.
93
+ #
94
+ # Example body hash = {name: 'a new category',
95
+ # parent_id: '2342', description: 'an example category',
96
+ # analytics_excluded: 'false', navigation_only: 'false',
97
+ # mutex_children: 'false', notes: 'Just an API test' }
98
+ #
99
+ # Returns: hash of created category parameters including its category_id
100
+ def category_create(body)
101
+ request('POST', '/Services/WS/classificationCategories', {}, body)
102
+ end
103
+
104
+ # Public: Updates a given self-classification category
105
+ #
106
+ # category_id:integer - The unique ID assigned to the self-classification
107
+ # category to be updated
108
+ #
109
+ # name:string - Name of the self-classification category
110
+ #
111
+ # parent_id:integer - Unique ID of the parent node for the
112
+ # self-classification category.
113
+ #
114
+ # description:string - Description of uUser attribute
115
+ # represented by this category.
116
+ #
117
+ # analytics_excluded:string - {'True','False'} Specify whether the
118
+ # self-classification category is to be excluded
119
+ # from Audience Analytics reports. This property
120
+ # is false by default.
121
+ #
122
+ # navigation_only:string - {'True','False'} Specify whether the
123
+ # self-classification category functions
124
+ # exclusively as a parent node that cannot be
125
+ # selected. This property is false by default.
126
+ #
127
+ # mutex_children:string - {'True','False'} Specify whether to limit
128
+ # the number of the category's child nodes
129
+ # that can be added to an audience segment to one.
130
+ # This property is false by default.
131
+ #
132
+ # notes:string - (Optional) Enter any notes to be associated with
133
+ # this self-classification category.
134
+ #
135
+ # Example body hash = {category_id: 1234, name: 'a chaged category',
136
+ # parent_id: '2342', description: 'an example category',
137
+ # analytics_exclued: 'false', navigation_only: 'false',
138
+ # mutex_children: 'false', notes: 'Just an API test' }
139
+ #
140
+ # Returns: hash of updated category parameters
141
+ def category_update(category_id, body)
142
+ request('PUT', "/Services/WS/classificationCategories/#{category_id}", {}, body)
143
+ end
144
+ end
145
+ end
@@ -9,8 +9,6 @@ module Bluekai
9
9
  attr_reader :domain, :api_user_key
10
10
 
11
11
  def initialize(opts = {})
12
- @domain = opts.fetch(:domain, ENV['BLUEKAI_DOMAIN']) ||
13
- fail(Error, 'BlueKai domain missing')
14
12
  @api_user_key = opts.fetch(:api_user_key, ENV['BLUEKAI_API_USER_KEY']) ||
15
13
  fail(Error, 'BlueKai API user key missing')
16
14
  @api_private_key = opts.fetch(:api_private_key, ENV['BLUEKAI_API_PRIVATE_KEY']) ||
@@ -46,337 +44,38 @@ module Bluekai
46
44
  request('GET', '/Services/WS/Taxonomy', query)[:nodeList]
47
45
  end
48
46
 
49
- ####
50
- #### Categories
51
- ####
52
- #### API definition can be found here
53
- #### https://kb.bluekai.com/display/PD/Self-Classification+Category+API
54
- ####
55
-
56
- # Public: Lists self classification categories in private taxonomy
57
- #
58
- # name:string - Returns all self-classification categories based on the specified
59
- # name (whole or partial). The name is case-insensitive.
60
- #
61
- # offset:integer - Specify the starting index from which to return
62
- # the self-classification categories.
63
- #
64
- # size:integer - Specifies the maximum number of categories to be included in
65
- # the response. This filter requires the offset filter to be specified.
66
- #
67
- # parent_id:integer - Returns all self-classification categories
68
- # based on the ID of the specified parent category.
69
- #
70
- # sort_by:string - Enter 'name' or 'id' to sort the returned self-classification categories in
71
- # alphabetical or numerical order (based on categoryId)
72
- #
73
- # sorting_order:string - Enter 'asc' or 'desc' to list the returned
74
- # self-classification categories in ascending
75
- # or descending order based on the category
76
- # name or categoryId.
77
- #
78
- # Returns array of category hashes
79
- def category_list(query = {})
80
- query = { sort_by: 'name',
81
- sorting_order: 'asc' }.merge(query)
82
- request('GET', '/Services/WS/classificationCategories', query)[:categories]
83
- end
84
-
85
- # Public: returns the self-classification category
86
- # specified by the category_id
87
- #
88
- # category_id:integer - MANDATORY The unique ID assigned to the
89
- # self-classification category to be retrieved
90
- #
91
- # stats:string - {'True','False'} Returns the reach (estimated
92
- # number of unique users based on 30-day
93
- # inventory) for the self-classification category.
94
- #
95
- # device_type:string - reach for the self-classification category
96
- # based on the specified device, which may either
97
- # be 'all', 'desktop', or 'mobile'
98
- #
99
- # intl_code - returns the reach for the self-classification category
100
- # based on the specified country. The default country
101
- # is ALL. You may enter one of the following country
102
- # codes: ALL, US, AU, CA, GB, GER, ESP, NL, MX, IT,
103
- # FR, BR, AR, RU, NZ, JP, CL, CN.
104
- #
105
- # Returns: A hash of Bluekai private category data
106
- def category_read(query)
107
- fail 'no category_id found in hash' unless query.key?(:category_id)
108
- category_id = query.delete(:category_id)
109
- request('GET', "/Services/WS/classificationCategories/#{category_id}", query)
110
- end
111
-
112
- # Public: Creates a new self-classification category
113
- #
114
- # name:string - Name of the self-classification category
115
- #
116
- # parent_id:integer - Unique ID of the parent node for the
117
- # self-classification category.
118
- #
119
- # description:string - Description of uUser attribute
120
- # represented by this category.
121
- #
122
- # analytics_excluded:string - {'True','False'} Specify whether the
123
- # self-classification category is to be excluded
124
- # from Audience Analytics reports. This property
125
- # is false by default.
126
- #
127
- # navigation_only:string - {'True','False'} Specify whether the
128
- # self-classification category functions
129
- # exclusively as a parent node that cannot be
130
- # selected. This property is false by default.
131
- #
132
- # mutex_children:string - {'True','False'} Specify whether to limit
133
- # the number of the category's child nodes
134
- # that can be added to an audience segment to one.
135
- # This property is false by default.
136
- #
137
- # notes:string - (Optional) Enter any notes to be associated with
138
- # this self-classification category.
139
- #
140
- # Example body hash = {name: 'a new category',
141
- # parent_id: '2342', description: 'an example category',
142
- # analytics_excluded: 'false', navigation_only: 'false',
143
- # mutex_children: 'false', notes: 'Just an API test' }
144
- #
145
- # Returns: hash of created category parameters including its category_id
146
- def category_create(body)
147
- request('POST', '/Services/WS/classificationCategories', {}, body)
148
- end
149
-
150
- # Public: Updates a given self-classification category
151
- #
152
- # category_id:integer - The unique ID assigned to the self-classification
153
- # category to be updated
154
- #
155
- # name:string - Name of the self-classification category
156
- #
157
- # parent_id:integer - Unique ID of the parent node for the
158
- # self-classification category.
159
- #
160
- # description:string - Description of uUser attribute
161
- # represented by this category.
162
- #
163
- # analytics_excluded:string - {'True','False'} Specify whether the
164
- # self-classification category is to be excluded
165
- # from Audience Analytics reports. This property
166
- # is false by default.
167
- #
168
- # navigation_only:string - {'True','False'} Specify whether the
169
- # self-classification category functions
170
- # exclusively as a parent node that cannot be
171
- # selected. This property is false by default.
172
- #
173
- # mutex_children:string - {'True','False'} Specify whether to limit
174
- # the number of the category's child nodes
175
- # that can be added to an audience segment to one.
176
- # This property is false by default.
177
- #
178
- # notes:string - (Optional) Enter any notes to be associated with
179
- # this self-classification category.
180
- #
181
- # Example body hash = {category_id: 1234, name: 'a chaged category',
182
- # parent_id: '2342', description: 'an example category',
183
- # analytics_exclued: 'false', navigation_only: 'false',
184
- # mutex_children: 'false', notes: 'Just an API test' }
185
- #
186
- # Returns: hash of updated category parameters
187
- def category_update(category_id, body)
188
- request('PUT', "/Services/WS/classificationCategories/#{category_id}", {}, body)
189
- end
190
-
191
- ####
192
- #### Classification Rules
193
- #### API definition can be found here
194
- #### https://kb.bluekai.com/display/PD/Self-Classification+Rule+API
195
- ####
196
-
197
- # Public: List the self-classification rules in your private
198
- # taxonomy
199
- #
200
- # sort_by:string - Enter 'status', 'id', 'created_at', 'updated_at',
201
- # or 'type' to sort the returned self-classification
202
- # rules by the specified option.
203
- #
204
- # sorting_order:string - Enter 'asc' or 'desc' to list the returned
205
- # self-classification rules in ascending or descending
206
- # order based on the specified sort option.
207
- #
208
- # ids:integer - Returns the self-classification rule matching the specified
209
- # rule ID, or returns all the self-classification rules matching
210
- # the specified list of rule IDs. Syntax for passing multiple rule IDs:
211
- # ruleId1&id=ruleId2 Example: 123&id=125
212
- #
213
- # type:enum - Enter 'phint' or 'url' to return only the phint or
214
- # URL-based self-classification rules.
215
- #
216
- # site_ids:string - Returns all the self-classification rules under the
217
- # specified site ID or list of site IDs. Syntax for
218
- # passing multiple site IDs: site_id_1&site_ids=site_id_2
219
- # Example: 1234&site_ids=1235
220
- #
221
- # category_ids:string - Returns all the self-classification rules used
222
- # to map the specified catgeory ID or list of category IDs.
223
- # Syntax for passing multiple category
224
- # IDs: category_id_1&category_ids=category_id_2
225
- # Example: 1234&category_ids=1235
226
- #
227
- # offset:integer - Specify the starting index from which to return the
228
- # self-classification rules.
229
- #
230
- # size:integer - Specify the maximum number of rules to be included in
231
- # the response. This filter requires the offset filter
232
- # to be specified.
233
- #
234
- # created_date_range:string - Returns all the self-classification rules
235
- # created within the specified list of dates.
236
- # Syntax: YYYY-MM-DD&created_date_range=YYYY-MM-DD
237
- # Example: 2014-01-01&created_date_range=2014-31-01
238
- #
239
- # updated_date_range:string - Returns all the self-classification rules updated
240
- # within the specified list of dates.
241
- # Syntax: YYYY-MM-DD&updated_date_range=YYYY-MM-DD
242
- # Example: 2014-01-01&updated_date_range=2014-31-01
243
- #
244
- # status:string - Enter 'Active' or 'Creating' to return the
245
- # self-classification rules based on the specified status referrer
246
- # boolean Returns all URL-based self-classification rules that
247
- # classify the site URL (False) or the referrer URL (True) in
248
- # the collected URL.
249
- #
250
- # exact:boolean - Returns all URL-based self-classification rules that classify
251
- # an exact URL (True) or a top-level URL (False) in the collected URL.
252
- # Returns: hash of Bluekai rules
253
- def rule_list(query)
254
- request('GET', '/Services/WS/classificationRules', query)[:rules]
255
- end
256
-
257
- # Public: Reads a self-classification rule
258
- #
259
- # rule_id:integer - The unique ID assigned to the
260
- # self-classification rule to be retrieved
261
- #
262
- # Returns: hash of Blukkai rule parameters
263
- def rule_read(rule_id)
264
- request('GET', "/Services/WS/classificationRules/#{rule_id}", {})
265
- end
266
-
267
- # Public: Creates a new self-classification rule
268
- #
269
- # name:string - Enter a string specifying the name of the self-classification rule.
270
- #
271
- # type:string - {'phint', 'url'} Specify the type of classification rule.
272
- #
273
- # phints:[{phint}] - If you are creating a phint-based rule,
274
- # enter a list of your phint definitions.
275
- # Each phint requires the following properties:
276
- # key - The phint key operator - The criteria
277
- # used for determining how the phint value
278
- # is applied ('is' or 'contains')
279
- # value - The full or partial phint value,
280
- # depending on the specified operator.
281
- #
282
- # urls:[string(s)] - Provide a list of your URL definitions
283
- # if you are creating for URL-based rules.
284
- #
285
- # referrer:string - {'True','False'} If you are creating a
286
- # URL-based rule, specify whether the URL to
287
- # be classified is the site URL (False) or
288
- # the referrer URL (True).
289
- #
290
- # exact:string - {'True','False'} If you are creating a
291
- # URL-based rule, specify whether the URL collected
292
- # from your site must match the URL in your
293
- # rule (True) or match a top-level URL (False) so
294
- # that you can target users visiting the child pages
295
- # without specifying them.
296
- #
297
- # partner_id:integer - Enter the unique ID assigned to your BlueKai DMP seat.
298
- #
299
- # site_ids (optional):[interger(s)] - Enter a list of containers/site IDs to which
300
- # the self-classification rule applies. If
301
- # you do not include this parameter, the
302
- # rule is applicable to ALL the
303
- # container/site IDs in your seat.
304
- #
305
- # category_ids:[integer(s)] - a list of category IDs to which
306
- # the self-classification rule applies.
307
- #
308
- # JSON example for Phint-based self-classification rule
309
- # {
310
- # "name": "Phint Example",
311
- # "type": "phint",
312
- # "phints": [
313
- # {
314
- # "key": "x",
315
- # "value": "123",
316
- # "operator": "is"
317
- # }
318
- # ],
319
- # "partner_id": 123,
320
- # "site_ids": [1234],
321
- # "category_ids": [12345]
322
- # }
323
- #
324
- # JSON example for URL-based self-classiifcation rule
325
- # {
326
- # "name": "URL Example",
327
- # "type": "url",
328
- # "urls": ["http://shop.yoursite.com"],
329
- # "referrer": false,
330
- # "exact": false,
331
- # "partner_id": 123,
332
- # "site_ids": [1234],
333
- # "category_ids": [123456]
334
- # }
335
- # Returns: hash of created self-classification rule
336
- def rule_create(body)
337
- body = { partner_id: @partner_id }.merge(body)
338
- request('POST', '/Services/WS/classificationRules', {}, body)
339
- end
340
-
341
- # Public: Update a self-classification rule
342
- #
343
- # rule_id:integer (MANDATORY) - id of classification rule to be updated
344
- #
345
- # for other parameters refer to documentation of rule_create(body)
346
- #
347
- # Returns: hash of updated self-classification rule
348
- def rule_update(rule_id, body)
349
- body = { partner_id: @partner_id }.merge(body)
350
- request('PUT', "/Services/WS/classificationRules/#{rule_id}", {}, body)
351
- end
352
-
353
47
  private
354
48
 
355
49
  def request(method, path, query, body = nil)
356
50
  method.upcase!
357
51
  signature = sign(method, path, query_values(query), body_sorted(body))
358
-
359
- url = "https://#{domain}#{path}?#{query_url_formatted(query)}\
360
- bkuid=#{api_user_key}&bksig=#{signature}"
361
-
362
- response = case method
363
- when 'GET'
364
- HTTParty.get(url)
365
- when 'POST'
366
- HTTParty.post(url, body: body_sorted(body), headers: json_headers)
367
- when 'PUT'
368
- HTTParty.put(url, body: body_sorted(body), headers: json_headers)
369
- else
370
- fail ArgumentError, "request method '#{method}' not supported"
371
- end.response
52
+ url = "#{domain}#{path}?#{query_url_formatted(query)}"\
53
+ "bkuid=#{api_user_key}&bksig=#{signature}"
54
+
55
+ response =
56
+ case method
57
+ when 'GET'
58
+ HTTParty.get(url)
59
+ when 'POST'
60
+ HTTParty.post(url, body: body_sorted(body), headers: json_headers)
61
+ when 'PUT'
62
+ HTTParty.put(url, body: body_sorted(body), headers: json_headers)
63
+ else
64
+ fail ArgumentError, "request method '#{method}' not supported"
65
+ end.response
66
+
372
67
  fail "HTTP Request Error: #{response.body}" if response.code != '200'
373
68
  return response.code if response.body == '' || response.body.nil?
374
69
  JSON.parse(response.body, symbolize_names: true)
375
70
  end
376
71
 
72
+ def domain
73
+ 'https://services.bluekai.com'
74
+ end
75
+
377
76
  def body_sorted(body)
378
77
  # sort hash according to keys for correct signature computation
379
- return body.sort_by { |key, _value| key.to_s }.to_h.to_json if body
78
+ body.sort_by { |key, _value| key.to_s }.to_h.to_json if body
380
79
  end
381
80
 
382
81
  def json_headers