promoted-ruby-client 0.1.16 → 0.1.20

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
  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