iterable-api-client 0.5.0 → 0.6.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.
@@ -1,3 +1,5 @@
1
+ # typed: true
2
+
1
3
  module Iterable
2
4
  ##
3
5
  #
@@ -22,6 +24,12 @@ module Iterable
22
24
  # @param conf [Iterable::Config] A config to optionally pass for requests
23
25
  #
24
26
  # @return [Iterable::Experiments]
27
+ sig do
28
+ params(
29
+ experiment_ids: T::Array[Integer],
30
+ conf: T.nilable(Iterable::Config)
31
+ ).void
32
+ end
25
33
  def initialize(experiment_ids = [], conf = nil)
26
34
  @experiment_ids = experiment_ids
27
35
  super conf
@@ -31,20 +39,25 @@ module Iterable
31
39
  #
32
40
  # Get metrics for experiments
33
41
  #
34
- # @params campaign_ids [Array] Array of campaignIds to optionally query for
42
+ # @param campaign_ids [Array] Array of campaignIds to optionally query for
35
43
  # @param start_time [Date|Time] Start of metrics to query for
36
44
  # @param end_time [Date|Time] End of metrics to query for
37
45
  #
38
46
  # @return [Iterable::Response] A response object
47
+ sig do
48
+ params(
49
+ campaign_ids: Array,
50
+ start_time: T.any(Date, Time, NilClass),
51
+ end_time: T.any(Date, Time, NilClass)
52
+ ).returns(Iterable::Response)
53
+ end
39
54
  def metrics(campaign_ids = [], start_time = nil, end_time = nil)
40
55
  params = {
41
56
  experimentId: @experiment_ids,
42
57
  campaignId: campaign_ids
43
58
  }
44
- if start_time
45
- params[:startTime] = start_time.to_date.strftime(Iterable::DATE_FORMAT)
46
- params[:endTime] = end_time.to_date.strftime(Iterable::DATE_FORMAT)
47
- end
59
+ params[:startTime] = start_time.to_date.strftime(Iterable::DATE_FORMAT) if start_time
60
+ params[:endTime] = end_time.to_date.strftime(Iterable::DATE_FORMAT) if end_time
48
61
  Iterable.request(conf, '/experiments/metrics', params).get
49
62
  end
50
63
  end
@@ -1,3 +1,5 @@
1
+ # typed: true
2
+
1
3
  module Iterable
2
4
  ##
3
5
  #
@@ -54,9 +56,19 @@ module Iterable
54
56
  # @param only_fields [Array[String]] Array of fields to only export
55
57
  # @param omit_fields [Array[String]] Array of fields to omit
56
58
  # @param data_fields [Hash] Additional device data fields
59
+ # @param campaign_id [String] The ID of the campaign
57
60
  # @param conf [Iterable::Config] A config to optionally pass for requests
58
61
  #
59
62
  # @return [Iterable::Export]
63
+ sig do
64
+ params(
65
+ data_type: String,
66
+ only_fields: T::Array[String],
67
+ omit_fields: T::Array[String],
68
+ campaign_id: T.nilable(String),
69
+ conf: T.nilable(Iterable::Config)
70
+ ).void
71
+ end
60
72
  def initialize(data_type, only_fields = [], omit_fields = [], campaign_id = nil, conf = nil) # rubocop:disable Metrics/ParameterLists
61
73
  @data_type = data_type
62
74
  @only_fields = only_fields
@@ -71,6 +83,7 @@ module Iterable
71
83
  # @example Formats are currently csv or json
72
84
  #
73
85
  # @return [Exception] Raises an exception
86
+ sig { overridable.returns(String) }
74
87
  def format
75
88
  raise '#format must be implemented in child class'
76
89
  end
@@ -83,6 +96,12 @@ module Iterable
83
96
  # @param end_time [Time] The end time of the data to export
84
97
  #
85
98
  # @return [Iterable::Response] A response object
99
+ sig do
100
+ params(
101
+ start_time: Time,
102
+ end_time: Time
103
+ ).returns(Iterable::Response)
104
+ end
86
105
  def export(start_time, end_time)
87
106
  params = {
88
107
  startDateTime: start_time.strftime(Iterable::Export::DATE_FORMAT),
@@ -98,32 +117,42 @@ module Iterable
98
117
  # @param range [Iterable::Export::RANGES] A valid range to export data for
99
118
  #
100
119
  # @return [Iterable::Response] A response object
120
+ sig do
121
+ params(
122
+ range: String
123
+ ).returns(Iterable::Response)
124
+ end
101
125
  def export_range(range = Iterable::Export::TODAY)
102
126
  params = { range: range }
103
127
  Iterable.request(conf, base_path, request_params(params)).get
104
128
  end
105
129
 
130
+ sig { returns(String) }
106
131
  protected def base_path
107
132
  "/export/data.#{format}"
108
133
  end
109
134
 
135
+ sig { params(params: Hash).returns(Hash) }
110
136
  protected def request_params(params = {})
111
137
  default_params.merge params
112
138
  end
113
139
 
140
+ sig { returns(T::Boolean) }
114
141
  protected def only_fields?
115
- @only_fields&.length.to_i.positive?
142
+ only_fields.length.to_i.positive?
116
143
  end
117
144
 
145
+ sig { returns(T::Boolean) }
118
146
  protected def omit_fields?
119
- @omit_fields&.length.to_i.positive?
147
+ omit_fields.length.to_i.positive?
120
148
  end
121
149
 
150
+ sig { returns(Hash) }
122
151
  protected def default_params
123
- params = { dataTypeName: @data_type }
124
- params[:onlyFields] = @only_fields if only_fields?
125
- params[:omitFields] = @omit_fields.join(',') if omit_fields?
126
- params[:campaignId] = @campaign_id if @campaign_id
152
+ params = { dataTypeName: data_type }
153
+ params[:onlyFields] = only_fields if only_fields?
154
+ params[:omitFields] = omit_fields.join(',') if omit_fields?
155
+ params[:campaignId] = campaign_id if campaign_id
127
156
  params
128
157
  end
129
158
  end
@@ -1,3 +1,5 @@
1
+ # typed: true
2
+
1
3
  module Iterable
2
4
  ##
3
5
  #
@@ -20,6 +22,13 @@ module Iterable
20
22
  # @param attrs [Hash] Hash of query attributes like platform, SDKVersion, etc.
21
23
  #
22
24
  # @return [Iterable::Response] A response object
25
+ sig do
26
+ params(
27
+ email: String,
28
+ count: Integer,
29
+ attrs: T.any(Integer, String)
30
+ ).returns(Iterable::Response)
31
+ end
23
32
  def messages_for_email(email, count: 1, **attrs)
24
33
  attrs[:email] = email
25
34
  attrs[:count] = count
@@ -30,11 +39,18 @@ module Iterable
30
39
  #
31
40
  # Get in-app messages for a user by user_id
32
41
  #
33
- # @param email [String] *required* Email of user who received the message to view. Required if no user_id present.
42
+ # @param user_id [String] *required* ID of user who received the message to view.
34
43
  # @param count [Integer] Number of messages to return, defaults to 1
35
44
  # @param attrs [Hash] Hash of query attributes like platform, SDKVersion, etc.
36
45
  #
37
46
  # @return [Iterable::Response] A response object
47
+ sig do
48
+ params(
49
+ user_id: T.any(String, Integer),
50
+ count: Integer,
51
+ attrs: T.any(Integer, String)
52
+ ).returns(Iterable::Response)
53
+ end
38
54
  def messages_for_user_id(user_id, count: 1, **attrs)
39
55
  attrs[:userId] = user_id
40
56
  attrs[:count] = count
@@ -46,12 +62,18 @@ module Iterable
46
62
  # Send an In-App notification to a specific user. User Email or ID along
47
63
  # with campaign ID must be provided
48
64
  #
49
- # @param email [String] (optional) User email used to identify user
50
65
  # @param campaign_id [Integer] Campaign ID
51
66
  # @param attrs [Hash] Additional data to update or add
67
+ # @param email [String] (optional) User email used to identify user
52
68
  #
53
69
  # @return [Iterable::Response] A response object
54
- #
70
+ sig do
71
+ params(
72
+ campaign_id: T.any(String, Integer),
73
+ attrs: T::Hash[T.any(Symbol, String), T.any(Integer, String)],
74
+ email: T.nilable(String)
75
+ ).returns(Iterable::Response)
76
+ end
55
77
  def target(campaign_id:, attrs: {}, email: nil)
56
78
  attrs['recipientEmail'] = email if email
57
79
  attrs['campaignId'] = campaign_id
@@ -64,20 +86,27 @@ module Iterable
64
86
  # Must include either an email address AND campaignId, or
65
87
  # just a scheduledMessageId provided in the attrs
66
88
  #
67
- # @param email [String] User email to cancel push
68
- # @param campaignId [Integer] campaignID used to cancel push
89
+ # @param campaign_id [Integer] campaignID used to cancel push
69
90
  # @param attrs [Hash] Additional data to update or add
91
+ # @param email [String] User email to cancel push
70
92
  #
71
93
  # @return [Iterable::Response] A response object
72
94
  #
73
95
  # @note An email or UserId is required
96
+ sig do
97
+ params(
98
+ campaign_id: T.nilable(T.any(String, Integer)),
99
+ attrs: T::Hash[T.any(Symbol, String), T.any(Integer, String)],
100
+ email: T.nilable(String)
101
+ ).returns(Iterable::Response)
102
+ end
74
103
  def cancel(campaign_id: nil, attrs: {}, email: nil)
75
104
  attrs['email'] = email if email
76
105
  attrs['campaignId'] = campaign_id if campaign_id
77
106
  Iterable.request(conf, '/push/cancel').post(attrs)
78
107
  end
79
108
 
80
- private def messages(**attrs)
109
+ private def messages(attrs = {})
81
110
  Iterable.request(conf, '/inApp/getMessages', attrs).get
82
111
  end
83
112
  end
@@ -1,3 +1,5 @@
1
+ # typed: true
2
+
1
3
  module Iterable
2
4
  ##
3
5
  #
@@ -16,6 +18,7 @@ module Iterable
16
18
  # Format to use for exporting
17
19
  #
18
20
  # @return [String] Format of export
21
+ sig { override.returns(String) }
19
22
  def format
20
23
  'json'
21
24
  end
@@ -1,3 +1,5 @@
1
+ # typed: true
2
+
1
3
  module Iterable
2
4
  ##
3
5
  #
@@ -17,6 +19,7 @@ module Iterable
17
19
  # Get all lists
18
20
  #
19
21
  # @return [Iterable::Response] A response object
22
+ sig { returns(Iterable::Response) }
20
23
  def all
21
24
  Iterable.request(conf, '/lists').get
22
25
  end
@@ -28,6 +31,7 @@ module Iterable
28
31
  # @param name [String] The name of the list to create
29
32
  #
30
33
  # @return [Iterable::Response] A response object
34
+ sig { params(name: String).returns(Iterable::Response) }
31
35
  def create(name)
32
36
  Iterable.request(conf, '/lists').post(name: name)
33
37
  end
@@ -36,9 +40,10 @@ module Iterable
36
40
  #
37
41
  # Delete an existing list given a list id
38
42
  #
39
- # @param name [String|Integer] The id of the list to delete
43
+ # @param list_id [String|Integer] The id of the list to delete
40
44
  #
41
45
  # @return [Iterable::Response] A response object
46
+ sig { params(list_id: T.any(String, Integer)).returns(Iterable::Response) }
42
47
  def delete(list_id)
43
48
  Iterable.request(conf, "/lists/#{list_id}").delete
44
49
  end
@@ -50,6 +55,7 @@ module Iterable
50
55
  # @param list_id [String|Integer] The id of the list
51
56
  #
52
57
  # @return [Iterable::Response] A response object
58
+ sig { params(list_id: T.any(String, Integer)).returns(Iterable::Response) }
53
59
  def users(list_id)
54
60
  Iterable.request(conf, '/lists/getUsers', listId: list_id).get
55
61
  end
@@ -59,9 +65,19 @@ module Iterable
59
65
  # Subscribe users to a list
60
66
  #
61
67
  # @param list_id [String|Integer] The id of the list
62
- # @param subscribes [Array[Hash]] An array of hashes of user emails and data fields
68
+ # @param subscribers [Array[Hash]] An array of hashes of user emails and data fields
63
69
  #
64
70
  # @return [Iterable::Response] A response object
71
+ sig do
72
+ params(
73
+ list_id: T.any(String, Integer),
74
+ subscribers: T::Array[
75
+ T::Hash[
76
+ T.any(Symbol, String), T.any(Symbol, String)
77
+ ]
78
+ ]
79
+ ).returns(Iterable::Response)
80
+ end
65
81
  def subscribe(list_id, subscribers = [])
66
82
  attrs = {
67
83
  listId: list_id,
@@ -75,9 +91,19 @@ module Iterable
75
91
  # Subscribe users to a list
76
92
  #
77
93
  # @param list_id [String|Integer] The id of the list
78
- # @param subscribes [Array[Hash]] An array of hashes with an email
94
+ # @param subscribers [Array[Hash]] An array of hashes with an email
79
95
  #
80
96
  # @return [Iterable::Response] A response object
97
+ sig do
98
+ params(
99
+ list_id: T.any(String, Integer),
100
+ subscribers: T::Array[
101
+ T::Hash[
102
+ T.any(Symbol, String), T.any(Symbol, String)
103
+ ]
104
+ ]
105
+ ).returns(Iterable::Response)
106
+ end
81
107
  def unsubscribe(list_id, subscribers = [])
82
108
  attrs = {
83
109
  listId: list_id,
@@ -1,3 +1,5 @@
1
+ # typed: true
2
+
1
3
  module Iterable
2
4
  ##
3
5
  #
@@ -24,6 +26,7 @@ module Iterable
24
26
  # Get all message_types
25
27
  #
26
28
  # @return [Iterable::Response] A response object
29
+ sig { returns(Iterable::Response) }
27
30
  def all
28
31
  Iterable.request(conf, '/messageTypes').get
29
32
  end
@@ -1,3 +1,5 @@
1
+ # typed: true
2
+
1
3
  module Iterable
2
4
  ##
3
5
  #
@@ -17,6 +19,7 @@ module Iterable
17
19
  # Get metadata
18
20
  #
19
21
  # @return [Iterable::Response] A response object
22
+ sig { returns(Iterable::Response) }
20
23
  def get
21
24
  Iterable.request(conf, '/metadata').get
22
25
  end
@@ -1,3 +1,5 @@
1
+ # typed: true
2
+
1
3
  module Iterable
2
4
  ##
3
5
  #
@@ -22,6 +24,12 @@ module Iterable
22
24
  # @param conf [Iterable::Config] A config to optionally pass for requests
23
25
  #
24
26
  # @return [Iterable::MetadataTable]
27
+ sig do
28
+ params(
29
+ name: String,
30
+ conf: T.nilable(Iterable::Config)
31
+ ).void
32
+ end
25
33
  def initialize(name, conf = nil)
26
34
  @name = name
27
35
  super conf
@@ -31,9 +39,10 @@ module Iterable
31
39
  #
32
40
  # Get metadata table keys
33
41
  #
34
- # @params next_marker [String] next result set id if more hits exist
42
+ # @param next_marker [String] next result set id if more hits exist
35
43
  #
36
44
  # @return [Iterable::Response] A response object
45
+ sig { params(next_marker: T.nilable(String)).returns(Iterable::Response) }
37
46
  def list_keys(next_marker = nil)
38
47
  params = {}
39
48
  params['nextMarker'] = next_marker if next_marker
@@ -45,6 +54,7 @@ module Iterable
45
54
  # Delete metadata table
46
55
  #
47
56
  # @return [Iterable::Response] A response object
57
+ sig { returns(Iterable::Response) }
48
58
  def delete
49
59
  Iterable.request(conf, base_path).delete
50
60
  end
@@ -57,6 +67,15 @@ module Iterable
57
67
  # @param value [Hash] Value of metadata key as a hash of key/value data
58
68
  #
59
69
  # @return [Iterable::Response] A response object
70
+ sig do
71
+ params(
72
+ key: String,
73
+ value: T::Hash[
74
+ T.any(Symbol, String),
75
+ T.any(T::Boolean, String, Float, Integer)
76
+ ]
77
+ ).returns(Iterable::Response)
78
+ end
60
79
  def add(key, value = {})
61
80
  Iterable.request(conf, base_path(key)).put(value: value)
62
81
  end
@@ -68,6 +87,7 @@ module Iterable
68
87
  # @param key [String] Key of metadata to get
69
88
  #
70
89
  # @return [Iterable::Response] A response object
90
+ sig { params(key: String).returns(Iterable::Response) }
71
91
  def get(key)
72
92
  Iterable.request(conf, base_path(key)).get
73
93
  end
@@ -79,6 +99,7 @@ module Iterable
79
99
  # @param key [String] Key of metadata to delete
80
100
  #
81
101
  # @return [Iterable::Response] A response object
102
+ sig { params(key: String).returns(Iterable::Response) }
82
103
  def remove(key)
83
104
  Iterable.request(conf, base_path(key)).delete
84
105
  end
data/lib/iterable/push.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # typed: true
2
+
1
3
  module Iterable
2
4
  ##
3
5
  #
@@ -13,11 +15,21 @@ module Iterable
13
15
  #
14
16
  # Send a push notification to a specific user
15
17
  #
16
- # @param email [String] (optional) User email used to identify user
17
18
  # @param campaign_id [Integer] Campaign ID
19
+ # @param email [String] (optional) User email used to identify user
18
20
  # @param attrs [Hash] Additional data to update or add
19
21
  #
20
22
  # @return [Iterable::Response] A response object
23
+ sig do
24
+ params(
25
+ campaign_id: T.any(String, Integer),
26
+ email: T.nilable(String),
27
+ attrs: T::Hash[
28
+ T.any(Symbol, String),
29
+ T.any(T::Boolean, String, Integer, Float)
30
+ ]
31
+ ).returns(Iterable::Response)
32
+ end
21
33
  def target(campaign_id:, email: nil, attrs: {})
22
34
  attrs['recipientEmail'] = email if email
23
35
  attrs['campaignId'] = campaign_id
@@ -31,12 +43,22 @@ module Iterable
31
43
  # just a scheduledMessageId provided in the attrs
32
44
  #
33
45
  # @param email [String] User email to cancel push
34
- # @param campaignId [Integer] campaignID used to cancel push
46
+ # @param campaign_id [Integer] campaignID used to cancel push
35
47
  # @param attrs [Hash] Additional data to update or add
36
48
  #
37
49
  # @return [Iterable::Response] A response object
38
50
  #
39
51
  # @note An email or UserId is required
52
+ sig do
53
+ params(
54
+ email: T.nilable(String),
55
+ campaign_id: T.nilable(T.any(String, Integer)),
56
+ attrs: T::Hash[
57
+ T.any(Symbol, String),
58
+ T.any(T::Boolean, String, Integer, Float)
59
+ ]
60
+ ).returns(Iterable::Response)
61
+ end
40
62
  def cancel(email: nil, campaign_id: nil, attrs: {})
41
63
  attrs['email'] = email if email
42
64
  attrs['campaignId'] = campaign_id if campaign_id
@@ -1,3 +1,5 @@
1
+ # typed: true
2
+
1
3
  module Iterable
2
4
  ##
3
5
  #
@@ -20,6 +22,15 @@ module Iterable
20
22
  # @param params [Hash] Additional params to use such as locale
21
23
  #
22
24
  # @return [Iterable::Response] A response object
25
+ sig do
26
+ params(
27
+ template_id: T.any(String, Integer),
28
+ params: T::Hash[
29
+ T.any(Symbol, String),
30
+ T.any(T::Boolean, String, Integer, Float)
31
+ ]
32
+ ).returns(Iterable::Response)
33
+ end
23
34
  def get(template_id, params = {})
24
35
  params['templateId'] = template_id
25
36
  Iterable.request(conf, '/templates/push/get', params).get
@@ -46,6 +57,15 @@ module Iterable
46
57
  # @param attrs [Hash] Update attributes
47
58
  #
48
59
  # @return [Iterable::Response] A response object
60
+ sig do
61
+ params(
62
+ client_template_id: T.any(String, Integer),
63
+ attrs: T::Hash[
64
+ T.any(Symbol, String),
65
+ T.any(T::Boolean, String, Integer, Float)
66
+ ]
67
+ ).returns(Iterable::Response)
68
+ end
49
69
  def upsert(client_template_id, attrs = {})
50
70
  attrs['clientTemplateId'] = client_template_id
51
71
  Iterable.request(conf, '/templates/push/upsert').post(attrs)
@@ -1,9 +1,13 @@
1
+ # typed: false
2
+
1
3
  require 'openssl'
2
4
  require 'uri'
3
5
 
4
6
  module Iterable
5
7
  # @!visibility private
6
8
  class Request
9
+ extend T::Sig
10
+
7
11
  DEFAULT_OPTIONS = {
8
12
  use_ssl: true,
9
13
  verify_ssl: true,
@@ -15,6 +19,13 @@ module Iterable
15
19
  'content-type' => 'application/json'
16
20
  }.freeze
17
21
 
22
+ sig do
23
+ params(
24
+ config: Iterable::Config,
25
+ path: String,
26
+ params: Hash
27
+ ).void
28
+ end
18
29
  def initialize(config, path, params = {})
19
30
  @config = config
20
31
  @uri = build_uri(path, params)
@@ -22,22 +33,27 @@ module Iterable
22
33
  setup_http(@net)
23
34
  end
24
35
 
36
+ sig { params(headers: Hash).returns(Iterable::Response) }
25
37
  def get(headers = {})
26
38
  execute :get, {}, headers
27
39
  end
28
40
 
41
+ sig { params(body: Hash, headers: Hash).returns(Iterable::Response) }
29
42
  def post(body = {}, headers = {})
30
43
  execute :post, body, headers
31
44
  end
32
45
 
46
+ sig { params(body: Hash, headers: Hash).returns(Iterable::Response) }
33
47
  def put(body = {}, headers = {})
34
48
  execute :put, body, headers
35
49
  end
36
50
 
51
+ sig { params(body: Hash, headers: Hash).returns(Iterable::Response) }
37
52
  def patch(body = {}, headers = {})
38
53
  execute :patch, body, headers
39
54
  end
40
55
 
56
+ sig { params(body: Hash, headers: Hash).returns(Iterable::Response) }
41
57
  def delete(body = {}, headers = {})
42
58
  execute :delete, body, headers
43
59
  end
@@ -48,6 +64,13 @@ module Iterable
48
64
  transmit http
49
65
  end
50
66
 
67
+ sig do
68
+ params(
69
+ verb: Symbol,
70
+ body: Hash,
71
+ headers: Hash
72
+ ).returns(Net::HTTPRequest)
73
+ end
51
74
  private def connection(verb, body = {}, headers = {})
52
75
  conn_headers = DEFAULT_HEADERS.dup.merge(headers)
53
76
  conn_headers['Api-Key'] = @config.token if @config.token
@@ -56,6 +79,11 @@ module Iterable
56
79
  req
57
80
  end
58
81
 
82
+ sig do
83
+ params(
84
+ http: T.any(Net::HTTP, Net::HTTP::Post, Net::HTTP::Get, Net::HTTP::Put, Net::HTTP::Patch, Net::HTTP::Delete)
85
+ ).void
86
+ end
59
87
  private def setup_http(http)
60
88
  DEFAULT_OPTIONS.dup.each do |option, value|
61
89
  setter = "#{option.to_sym}="
@@ -74,6 +102,7 @@ module Iterable
74
102
  Net::HTTP.new(@uri.hostname, @uri.port, nil, nil, nil, nil)
75
103
  end
76
104
 
105
+ sig { params(req: Net::HTTPRequest).returns(Iterable::Response) }
77
106
  private def transmit(req)
78
107
  response = nil
79
108
  @net.start do |http|
@@ -82,6 +111,7 @@ module Iterable
82
111
  handle_response response
83
112
  end
84
113
 
114
+ sig { params(response: Net::HTTPResponse).returns(Iterable::Response) }
85
115
  private def handle_response(response)
86
116
  redirected = response.is_a?(Net::HTTPRedirection) || response.code == '303'
87
117
  if redirected && response['location']
@@ -91,6 +121,7 @@ module Iterable
91
121
  end
92
122
  end
93
123
 
124
+ sig { params(response: Net::HTTPResponse).returns(URI) }
94
125
  private def uri_for_redirect(response)
95
126
  uri = @config.uri
96
127
  redirect_uri = URI(response['location'])
@@ -1,3 +1,5 @@
1
+ # typed: true
2
+
1
3
  require 'forwardable'
2
4
 
3
5
  module Iterable
@@ -6,12 +8,18 @@ module Iterable
6
8
  # Response class is used to get access to raw HTTP request info
7
9
  class Response
8
10
  extend Forwardable
11
+ extend T::Sig
9
12
 
10
- def_delegators :@resp, :code, :message, :uri
13
+ def_delegators :@resp, :code, :message, :uri, :[]
11
14
 
12
15
  attr_reader :body
13
16
 
14
17
  # @!visibility private
18
+ sig do
19
+ params(
20
+ resp: Net::HTTPResponse
21
+ ).void
22
+ end
15
23
  def initialize(resp)
16
24
  @resp = resp
17
25
  @body = parsed_body
@@ -19,8 +27,9 @@ module Iterable
19
27
 
20
28
  ##
21
29
  #
22
- # Convenience method to determine if request was successfull or not
30
+ # Convenience method to determine if request was successful or not
23
31
  # @return [Boolean]
32
+ sig { returns(T::Boolean) }
24
33
  def success?
25
34
  case @resp.code.to_i
26
35
  when (200..299) then true
@@ -34,9 +43,14 @@ module Iterable
34
43
  # if unable to parse.
35
44
  #
36
45
  # @return [Hash,Array,String] A parsed JSON object or the original response body
46
+ sig do
47
+ returns(
48
+ T.nilable(T.any(Hash, Array, String))
49
+ )
50
+ end
37
51
  private def parsed_body
38
52
  response_body = @resp.body
39
- MultiJson.load response_body
53
+ MultiJson.load(response_body)
40
54
  rescue MultiJson::ParseError
41
55
  response_body
42
56
  end