promoted-ruby-client 0.1.16 → 0.1.20

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a2c2ac1232cfaf7a98ca948a7949a420a6ab311c4b54d92ea8098e8b830e931b
4
- data.tar.gz: 9ae8796dc993ecc11e01f1980a2200a7ee10dedb8287504a2bafcebec2f50105
3
+ metadata.gz: 340cf31fbc7680c1b9abb8df8dd1226e4a13fed103e21815afb82fb43b85f481
4
+ data.tar.gz: d5448efcb375ac090847ac6c37fcda3b57babf0dca6043d82967e8ecdb42ae52
5
5
  SHA512:
6
- metadata.gz: d3df3068c668514c3666435fc1a4b25216223258fd305ba69e4cebf333f5026ff008f868a4bd7f3a15e748bd9b00ddb6dfbb9e0c0de7c72a9ed06ad4a175ddbe
7
- data.tar.gz: 7adb59ff3806736008764d32a51176e1a064547259c8f4d7c9d800b4737e688d00b25593c07e5b2ecffc05daad1795830d17efb3f66284d6fc8f02b5045dd1f8
6
+ metadata.gz: df18a2f73308fd9771b55a8762592a4041059b5d5fe72e0de07fa9566eb8627647eef75276a401c6f9da7d03bfc7158deb94bfd6b5824d22635a22b7d11848f0
7
+ data.tar.gz: 7ed68c19270dcd13b8ed2347138aa845dd767d19bc257312e1a001f0e858879e75186142b9719b31e9c132d95fc7d48049baaf3e57b442f39f2b969cf2c835b8
@@ -0,0 +1,16 @@
1
+ name: Pull-Requests Check
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ Test:
7
+ runs-on: ubuntu-latest
8
+ steps:
9
+ - uses: actions/checkout@v2
10
+ - uses: ruby/setup-ruby@v1
11
+ with:
12
+ ruby-version: 2.5.1
13
+ bundler-cache: true
14
+
15
+ - name: Build and test with rspec
16
+ run: bundle exec rspec spec
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- promoted-ruby-client (0.1.16)
4
+ promoted-ruby-client (0.1.20)
5
5
  concurrent-ruby (~> 1)
6
6
  faraday (>= 0.9.0)
7
7
  faraday_middleware (>= 0.9.0)
data/README.md CHANGED
@@ -94,7 +94,73 @@ Field Name | Type | Optional? | Description
94
94
  ```:request_id``` | String | Yes | Generated by the SDK when needed (*do not set*)
95
95
  ```:content_id``` | String | No | Identifier for the content to be shown, must be set.
96
96
  ```:properties``` | Properties | Yes | Any additional custom properties to associate. For v1 integrations, it is fine not to fill in all the properties.
97
+ ---
98
+ ### Size
99
+ User's screen dimensions.
100
+ Field Name | Type | Optional? | Description
101
+ ---------- | ---- | --------- | -----------
102
+ ```:width``` | Integer | No | Screen width
103
+ ```:height``` | Integer | No | Screen height
104
+ ---
97
105
 
106
+ ### Screen
107
+ State of the screen including scaling.
108
+ Field Name | Type | Optional? | Description
109
+ ---------- | ---- | --------- | -----------
110
+ ```:size``` | Size | Yes | Screen size
111
+ ```:scale``` | Float | Yes | Current screen scaling factor
112
+ ---
113
+
114
+ ### ClientHints
115
+ Alternative to user-agent strings. See https://raw.githubusercontent.com/snowplow/iglu-central/master/schemas/org.ietf/http_client_hints/jsonschema/1-0-0
116
+ Field Name | Type | Optional? | Description
117
+ ---------- | ---- | --------- | -----------
118
+ ```:is_mobile``` | Boolean | Yes | Mobile flag
119
+ ```:brand``` | Array of ClientBrandHint | Yes |
120
+ ```:architecture``` | String | Yes |
121
+ ```:model``` | String | Yes |
122
+ ```:platform``` | String | Yes |
123
+ ```:platform_version``` | String | Yes |
124
+ ```:ua_full_version``` | String | Yes |
125
+
126
+ ---
127
+ ### ClientBrandHint
128
+ See https://raw.githubusercontent.com/snowplow/iglu-central/master/schemas/org.ietf/http_client_hints/jsonschema/1-0-0
129
+ Field Name | Type | Optional? | Description
130
+ ---------- | ---- | --------- | -----------
131
+ ```:brand``` | String | Yes | Mobile flag
132
+ ```:version``` | String | Yes |
133
+
134
+ ---
135
+ ### Location
136
+ Information about the user's location.
137
+ Field Name | Type | Optional? | Description
138
+ ---------- | ---- | --------- | -----------
139
+ ```:latitude``` | Float | No | Location latitude
140
+ ```:longitude``` | Float | No | Location longitude
141
+ ```:accuracy_in_meters``` | Integer | Yes | Location accuracy if available
142
+ ---
143
+
144
+ ### Browser
145
+ Information about the user's browser.
146
+ Field Name | Type | Optional? | Description
147
+ ---------- | ---- | --------- | -----------
148
+ ```:user_agent``` | String | Yes | Browser user agent string
149
+ ```:viewport_size``` | Size | Yes | Size of the browser viewport
150
+ ```:client_hints``` | ClientHints | Yes | HTTP client hints structure
151
+ ---
152
+ ### Device
153
+ Information about the user's device.
154
+ Field Name | Type | Optional? | Description
155
+ ---------- | ---- | --------- | -----------
156
+ ```:device_type``` | one of (`UNKNOWN_DEVICE_TYPE`, `DESKTOP`, `MOBILE`, `TABLET`) | Yes | Type of device
157
+ ```:brand``` | String | Yes | "Apple, "google", Samsung", etc.
158
+ ```:manufacturer``` | String | Yes | "Apple", "HTC", Motorola", "HUAWEI", etc.
159
+ ```:identifier``` | String | Yes | Android: android.os.Build.MODEL; iOS: iPhoneXX,YY, etc.
160
+ ```:screen``` | Screen | Yes | Screen dimensions
161
+ ```:ip_address``` | String | Yes | Originating IP address
162
+ ```:location``` | Location | Yes | Location information
163
+ ```:browser``` | Browser | Yes | Browser information
98
164
  ---
99
165
  ### Paging
100
166
  #### TODO
@@ -108,6 +174,7 @@ Field Name | Type | Optional? | Description
108
174
  ```:use_case``` | String | Yes | One of the use case values, i.e. 'FEED' (see [constants.rb](https://github.com/promotedai/promoted-ruby-client/blob/main/lib/promoted/ruby/client/constants.rb)).
109
175
  ```:properties``` | Properties | Yes | Any additional custom properties to associate.
110
176
  ```:paging``` | Paging | Yes | Paging parameters (see TODO)
177
+ ```:device``` | Device | Yes | Device information (as available)
111
178
  ---
112
179
  ### MetricsRequest
113
180
  Input to ```prepare_for_logging```
@@ -142,6 +209,8 @@ Field Name | Type | Optional? | Description
142
209
  ---------- | ---- | --------- | -----------
143
210
  ```:insertion``` | [] of Insertion | No | The insertions, which are from Delivery API (when ```deliver``` was called, i.e. we weren't either only-log or part of an experiment) or the input insertions (when the other conditions don't hold).
144
211
  ```:log_request``` | LogRequest | Yes | A message suitable for logging to Metrics API via ```send_log_request```. If the call to ```deliver``` was made (i.e. the request was not part of the CONTROL arm of an experiment or marked to only log), ```:log_request``` will not be set, as you can assume logging was performed on the server-side by Promoted.
212
+ ```:client_request_id``` | String | Yes | Client-generated request id sent to Delivery API and may be useful for logging and debugging.
213
+ ```:execution_server``` | one of 'API' or 'SDK' | Yes | Indicates if response insertions on a delivery request came from the API or the SDK.
145
214
  ---
146
215
 
147
216
  ### PromotedClient
@@ -219,12 +288,13 @@ metrics_request = {
219
288
  }
220
289
 
221
290
  # OPTIONAL: You can pass a custom function to "compact" insertions before metrics logging.
222
- # Note that the PromotedClient has a class method helper, copy_and_remove_properties, that does just this.
223
- to_compact_metrics_insertion_func = Proc.new do |insertion|
224
- insertion.delete(:properties)
225
- insertion
291
+ # Note that the PromotedClient has a class method helper, remove_all_properties, that does
292
+ # an implementation of this, returning nil to remove ALL properties.
293
+ to_compact_metrics_properties_func = Proc.new do |properties|
294
+ properties[:struct].delete(:active)
295
+ properties
226
296
  end
227
- # metrics_request[:to_compact_metrics_insertion_func] = to_compact_metrics_insertion
297
+ # metrics_request[:to_compact_metrics_properties_func] = to_compact_metrics_properties_func
228
298
 
229
299
  # Create a client
230
300
  client = Promoted::Ruby::Client::PromotedClient.new
data/dev.md CHANGED
@@ -4,5 +4,5 @@
4
4
  2. Get credentials for deployment from 1password.
5
5
  3. Modify `promoted-ruby-client.gemspec`'s push block.
6
6
  4. Run `gem build promoted-ruby-client.gemspec` to generate `gem`.
7
- 5. Run (using new output) `gem push promoted-ruby-client-0.1.16.gem`
7
+ 5. Run (using new output) `gem push promoted-ruby-client-0.1.20.gem`
8
8
  6. Update README with new version.
@@ -30,18 +30,16 @@ module Promoted
30
30
  end
31
31
 
32
32
  ##
33
- # A common compact method implementation.
34
- def self.copy_and_remove_properties
35
- Proc.new do |insertion|
36
- insertion = Hash[insertion]
37
- insertion.delete(:properties)
38
- insertion
33
+ # A common compact properties method implementation.
34
+ def self.remove_all_properties
35
+ Proc.new do |properties|
36
+ nil
39
37
  end
40
38
  end
41
39
 
42
40
  ##
43
41
  # Create and configure a new Promoted client.
44
- def initialize (params={})
42
+ def initialize(params={})
45
43
  @perform_checks = true
46
44
  if params[:perform_checks] != nil
47
45
  @perform_checks = params[:perform_checks]
@@ -115,7 +113,7 @@ module Promoted
115
113
  ##
116
114
  # Make a delivery request. If @perform_checks is set, input validation will occur and possibly raise errors.
117
115
  def deliver args, headers={}
118
- args = Promoted::Ruby::Client::Util.translate_args(args)
116
+ args = Promoted::Ruby::Client::Util.translate_hash(args)
119
117
 
120
118
  # Respect the enabled state
121
119
  if !@enabled
@@ -177,7 +175,7 @@ module Promoted
177
175
 
178
176
  insertions_from_delivery = (response != nil && !deliver_err);
179
177
  response_insertions = delivery_request_builder.fill_details_from_response(
180
- response ? response[:insertion] : [])
178
+ response && response[:insertion] || [])
181
179
  end
182
180
  end
183
181
 
@@ -212,7 +210,9 @@ module Promoted
212
210
 
213
211
  client_response = {
214
212
  insertion: response_insertions,
215
- log_request: log_req
213
+ log_request: log_req,
214
+ execution_server: insertions_from_delivery ? Promoted::Ruby::Client::EXECUTION_SERVER['API'] : Promoted::Ruby::Client::EXECUTION_SERVER['SDK'],
215
+ client_request_id: delivery_request_builder.client_request_id
216
216
  }
217
217
  return client_response
218
218
  end
@@ -221,7 +221,7 @@ module Promoted
221
221
  # Generate a log request for a subsequent call to send_log_request
222
222
  # or for logging via alternative means.
223
223
  def prepare_for_logging args, headers={}
224
- args = Promoted::Ruby::Client::Util.translate_args(args)
224
+ args = Promoted::Ruby::Client::Util.translate_hash(args)
225
225
 
226
226
  if !@enabled
227
227
  return {
@@ -318,7 +318,7 @@ module Promoted
318
318
 
319
319
  ellapsed_time = Time.now - start_time
320
320
  @logger.debug("Sync send_request completed in #{ellapsed_time.to_f * 1000} ms") if @logger
321
- end
321
+ end
322
322
 
323
323
  return resp
324
324
  end
@@ -334,9 +334,17 @@ module Promoted
334
334
  delivery_request_builder = RequestBuilder.new
335
335
  delivery_request_builder.set_request_params args
336
336
 
337
- delivery_request_params = delivery_request_builder.delivery_request_params(should_compact: false)
337
+ delivery_request_params = delivery_request_builder.delivery_request_params
338
338
  delivery_request_params[:client_info][:traffic_type] = Promoted::Ruby::Client::TRAFFIC_TYPE['SHADOW']
339
339
 
340
+ begin
341
+ @pager.validate_paging(delivery_request_builder.full_insertion, delivery_request_builder.request[:paging])
342
+ rescue InvalidPagingError => err
343
+ # Invalid input, log and skip.
344
+ @logger.warn("Shadow traffic call failed with invalid paging #{err}") if @logger
345
+ return
346
+ end
347
+
340
348
  # Call Delivery API and log/ignore errors.
341
349
  start_time = Time.now
342
350
  response = nil
@@ -349,7 +357,7 @@ module Promoted
349
357
 
350
358
  if !@async_shadow_traffic
351
359
  ellapsed_time = Time.now - start_time
352
- insertions = response ? response[:insertion] : []
360
+ insertions = response && response[:insertion] || []
353
361
  @logger.info("Shadow traffic call completed in #{ellapsed_time.to_f * 1000} ms with #{insertions.length} insertions") if @logger
354
362
  end
355
363
  end
@@ -32,6 +32,13 @@ module Promoted
32
32
  CLIENT_TYPE = {'UNKNOWN_REQUEST_CLIENT' => 'UNKNOWN_REQUEST_CLIENT',
33
33
  'PLATFORM_SERVER' => 'PLATFORM_SERVER',
34
34
  'PLATFORM_CLIENT' => 'PLATFORM_CLIENT'}
35
+
36
+ EXECUTION_SERVER = {'API' => 'API', 'SDK' => 'SDK'}
37
+
38
+ DEVICE_TYPE = {'UNKNOWN_DEVICE_TYPE' => 'UNKNOWN_DEVICE_TYPE',
39
+ 'DESKTOP' => 'DESKTOP',
40
+ 'MOBILE' => 'MOBILE',
41
+ 'TABLET' => 'TABLET'}
35
42
  end
36
43
  end
37
44
  end
@@ -1,5 +1,6 @@
1
1
  require 'faraday'
2
2
  require 'faraday_middleware'
3
+ require 'promoted/ruby/client/util'
3
4
 
4
5
  module Promoted
5
6
  module Ruby
@@ -28,7 +29,7 @@ module Promoted
28
29
 
29
30
  norm_headers = response.headers.transform_keys(&:downcase)
30
31
  if norm_headers["content-type"] != nil && norm_headers["content-type"].start_with?("application/json")
31
- JSON.parse(response.body, :symbolize_names => true)
32
+ Promoted::Ruby::Client::Util.translate_hash(JSON.parse(response.body))
32
33
  else
33
34
  response.body
34
35
  end
@@ -11,13 +11,13 @@ module Promoted
11
11
  end
12
12
 
13
13
  class Pager
14
- def validate_paging (insertions, paging)
14
+ def validate_paging(insertions, paging)
15
15
  if paging && paging[:offset] && paging[:offset] >= insertions.length
16
16
  raise InvalidPagingError.new("Invalid page offset (insertion size #{insertions.length}, offset #{paging[:offset]})", [])
17
17
  end
18
18
  end
19
19
 
20
- def apply_paging (insertions, insertion_page_type, paging = nil)
20
+ def apply_paging(insertions, insertion_page_type, paging = nil)
21
21
  begin
22
22
  validate_paging(insertions, paging)
23
23
  rescue InvalidPagingError => err
@@ -47,7 +47,7 @@ module Promoted
47
47
  size = insertions.length
48
48
  end
49
49
 
50
- final_insertion_size = [size, insertions.length].min
50
+ final_insertion_size = [size, insertions.length - index].min
51
51
  insertion_page = Array.new(final_insertion_size)
52
52
  0.upto(final_insertion_size - 1) {|i|
53
53
  insertion = insertions[index]
@@ -63,5 +63,5 @@ module Promoted
63
63
  end
64
64
  end
65
65
  end
66
- end
66
+ end
67
67
  end
@@ -2,9 +2,9 @@ module Promoted
2
2
  module Ruby
3
3
  module Client
4
4
  class RequestBuilder
5
- attr_reader :session_id, :only_log, :experiment, :client_info,
6
- :view_id, :insertion, :to_compact_delivery_insertion_func,
7
- :request_id, :full_insertion, :use_case, :request, :to_compact_metrics_insertion_func
5
+ attr_reader :session_id, :only_log, :experiment, :client_info, :device,
6
+ :view_id, :insertion, :to_compact_delivery_properties_func,
7
+ :request_id, :full_insertion, :use_case, :request, :to_compact_metrics_properties_func
8
8
 
9
9
  attr_accessor :timing, :user_info, :platform_id
10
10
 
@@ -24,13 +24,14 @@ module Promoted
24
24
  @session_id = request[:session_id]
25
25
  @platform_id = request[:platform_id]
26
26
  @client_info = request[:client_info] || {}
27
+ @device = request[:device] || {}
27
28
  @view_id = request[:view_id]
28
29
  @use_case = Promoted::Ruby::Client::USE_CASES[request[:use_case]] || Promoted::Ruby::Client::USE_CASES['UNKNOWN_USE_CASE']
29
30
  @full_insertion = args[:full_insertion]
30
31
  @user_info = request[:user_info] || { :user_id => nil, :log_user_id => nil}
31
32
  @timing = request[:timing] || { :client_log_timestamp => Time.now.to_i }
32
- @to_compact_metrics_insertion_func = args[:to_compact_metrics_insertion_func]
33
- @to_compact_delivery_insertion_func = args[:to_compact_delivery_insertion_func]
33
+ @to_compact_metrics_properties_func = args[:to_compact_metrics_properties_func]
34
+ @to_compact_delivery_properties_func = args[:to_compact_delivery_properties_func]
34
35
 
35
36
  # If the user didn't create a client request id, we do it for them.
36
37
  request[:client_request_id] = request[:client_request_id] || @id_generator.newID
@@ -52,11 +53,12 @@ module Promoted
52
53
  end
53
54
 
54
55
  # Only used in delivery
55
- def delivery_request_params(should_compact: true)
56
+ def delivery_request_params
56
57
  params = {
57
58
  user_info: user_info,
58
59
  timing: timing,
59
60
  client_info: @client_info.merge({ :client_type => Promoted::Ruby::Client::CLIENT_TYPE['PLATFORM_SERVER'] }),
61
+ device: @device,
60
62
  platform_id: @platform_id,
61
63
  view_id: @view_id,
62
64
  session_id: @session_id,
@@ -64,9 +66,9 @@ module Promoted
64
66
  search_query: request[:search_query],
65
67
  properties: request[:properties],
66
68
  paging: request[:paging],
67
- client_request_id: request[:client_request_id]
69
+ client_request_id: client_request_id
68
70
  }
69
- params[:insertion] = should_compact ? compact_delivery_insertions : full_insertion
71
+ params[:insertion] = insertions_with_compact_props(@to_compact_delivery_properties_func)
70
72
 
71
73
  params.clean!
72
74
  end
@@ -76,11 +78,14 @@ module Promoted
76
78
  # to the responses.
77
79
  def fill_details_from_response response_insertions
78
80
  if !response_insertions then
79
- response_insertions = full_insertion
81
+ response_insertions = []
80
82
  end
81
83
 
82
84
  props = @full_insertion.each_with_object({}) do |insertion, hash|
83
- hash[insertion[:content_id]] = insertion[:properties]
85
+ if insertion.has_key?(:properties)
86
+ # Don't add nil properties to response insertions.
87
+ hash[insertion[:content_id]] = insertion[:properties]
88
+ end
84
89
  end
85
90
 
86
91
  filled_in_copy = []
@@ -99,7 +104,8 @@ module Promoted
99
104
  params = {
100
105
  user_info: user_info,
101
106
  timing: timing,
102
- client_info: @client_info
107
+ client_info: @client_info,
108
+ device: @device
103
109
  }
104
110
 
105
111
  if @experiment
@@ -113,18 +119,38 @@ module Promoted
113
119
  end
114
120
 
115
121
  if include_insertions
116
- params[:insertion] = compact_metrics_insertions if include_insertions
122
+ params[:insertion] = compact_metrics_properties if include_insertions
117
123
  add_missing_ids_on_insertions! request, params[:insertion]
118
124
  end
119
125
 
120
126
  params.clean!
121
127
  end
122
128
 
123
- def compact_delivery_insertions
124
- if !@to_compact_delivery_insertion_func
129
+ def compact_one_insertion(insertion, compact_func)
130
+ return insertion if (!compact_func || !insertion[:properties])
131
+
132
+ # Only need a copy if there are properties to compact.
133
+ compact_insertion = insertion.dup
134
+
135
+ # Let the custom function work with a deep copy of the properties.
136
+ # There's really no way to work with a shallow copy and still be able
137
+ # to restore the correct insertion properties after a call to delivery.
138
+ new_props = Marshal.load(Marshal.dump(insertion[:properties]))
139
+ compact_insertion[:properties] = compact_func.call(new_props)
140
+ compact_insertion.clean!
141
+ return compact_insertion
142
+ end
143
+
144
+ def insertions_with_compact_props(compact_func)
145
+ if !compact_func
146
+ # Nothing to do, avoid copying the whole array.
125
147
  full_insertion
126
148
  else
127
- full_insertion.map {|insertion| @to_compact_delivery_insertion_func.call(insertion) }
149
+ compact_insertions = Array.new(full_insertion.length)
150
+ full_insertion.each_with_index {|insertion, index|
151
+ compact_insertions[index] = compact_one_insertion(insertion, compact_func)
152
+ }
153
+ compact_insertions
128
154
  end
129
155
  end
130
156
 
@@ -135,7 +161,7 @@ module Promoted
135
161
  end
136
162
 
137
163
  # TODO: This looks overly complicated.
138
- def compact_metrics_insertions
164
+ def compact_metrics_properties
139
165
  @insertion = [] # insertion should be set according to the compact insertion
140
166
  paging = request[:paging] || {}
141
167
  size = paging[:size] ? paging[:size].to_i : 0
@@ -155,12 +181,16 @@ module Promoted
155
181
  insertion_obj[:insertion_id] = @id_generator.newID
156
182
  insertion_obj[:request_id] = request_id
157
183
  insertion_obj[:position] = offset + index
158
- insertion_obj = @to_compact_metrics_insertion_func.call(insertion_obj) if @to_compact_metrics_insertion_func
184
+ insertion_obj = compact_one_insertion(insertion_obj, @to_compact_metrics_properties_func)
159
185
  @insertion << insertion_obj.clean!
160
186
  end
161
187
  @insertion
162
188
  end
163
189
 
190
+ def client_request_id
191
+ request[:client_request_id]
192
+ end
193
+
164
194
  private
165
195
 
166
196
  def add_missing_ids_on_insertions! request, insertions
@@ -2,16 +2,39 @@ module Promoted
2
2
  module Ruby
3
3
  module Client
4
4
  module Util
5
- def self.translate_args(args)
5
+ def self.translate_array(arr)
6
+ sym_arr = Array.new(arr.length)
7
+ arr.each_with_index do |v, i|
8
+ new_v = v
9
+ case v
10
+ when Hash
11
+ new_v = translate_hash(v)
12
+ when Array
13
+ new_v = translate_array(v)
14
+ end
15
+ sym_arr[i] = new_v
16
+ end
17
+ sym_arr
18
+ end
19
+
20
+ def self.translate_hash(args)
6
21
  sym_hash = {}
7
22
  args.each do |k, v|
8
- sym_hash[k.to_s.to_underscore.to_sym] = v.is_a?(Hash) ? translate_args(v) : v
23
+ new_key = k.to_s.to_underscore.to_sym
24
+ case v
25
+ when Hash
26
+ sym_hash[new_key] = translate_hash(v)
27
+ when Array
28
+ sym_hash[new_key] = translate_array(v)
29
+ else
30
+ sym_hash[new_key] = v
31
+ end
9
32
  end
10
33
  sym_hash
11
34
  rescue => e
12
35
  raise 'Unable to parse args. Please pass correct arguments. Must be JSON'
13
36
  end
14
- end
37
+ end
15
38
  end
16
39
  end
17
40
  end
@@ -1,7 +1,7 @@
1
1
  module Promoted
2
2
  module Ruby
3
3
  module Client
4
- VERSION = "0.1.16"
4
+ VERSION = "0.1.20"
5
5
  end
6
6
  end
7
7
  end
@@ -14,6 +14,7 @@ Gem::Specification.new do |spec|
14
14
  spec.homepage = 'https://github.com/promotedai/promoted-ruby-client'
15
15
  spec.license = 'MIT'
16
16
 
17
+ spec.metadata["allowed_push_host"] = "https://rubygems.org/"
17
18
  spec.metadata["homepage_uri"] = spec.homepage
18
19
  spec.metadata["source_code_uri"] = "https://github.com/promotedai/promoted-ruby-client"
19
20
  spec.metadata["changelog_uri"] = "https://github.com/promotedai/promoted-ruby-client/blob/master/CHANGELOG.md"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: promoted-ruby-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.16
4
+ version: 0.1.20
5
5
  platform: ruby
6
6
  authors:
7
7
  - scottmcmaster
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-07-28 00:00:00.000000000 Z
11
+ date: 2021-08-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -123,6 +123,7 @@ extensions: []
123
123
  extra_rdoc_files:
124
124
  - README.md
125
125
  files:
126
+ - ".github/workflows/push-pull-requests_check.yml"
126
127
  - ".gitignore"
127
128
  - Gemfile
128
129
  - Gemfile.lock
@@ -149,6 +150,7 @@ homepage: https://github.com/promotedai/promoted-ruby-client
149
150
  licenses:
150
151
  - MIT
151
152
  metadata:
153
+ allowed_push_host: https://rubygems.org/
152
154
  homepage_uri: https://github.com/promotedai/promoted-ruby-client
153
155
  source_code_uri: https://github.com/promotedai/promoted-ruby-client
154
156
  changelog_uri: https://github.com/promotedai/promoted-ruby-client/blob/master/CHANGELOG.md