whatsapp_sdk 0.12.1 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/codeql-analysis.yml +8 -6
  3. data/.gitignore +1 -0
  4. data/.rubocop.yml +0 -3
  5. data/CHANGELOG.md +9 -7
  6. data/Gemfile +0 -4
  7. data/Gemfile.lock +1 -20
  8. data/README.md +35 -55
  9. data/SECURITY.md +21 -0
  10. data/example.rb +23 -15
  11. data/lib/whatsapp_sdk/api/api_configuration.rb +2 -5
  12. data/lib/whatsapp_sdk/api/business_profile.rb +0 -12
  13. data/lib/whatsapp_sdk/api/client.rb +7 -43
  14. data/lib/whatsapp_sdk/api/medias.rb +8 -15
  15. data/lib/whatsapp_sdk/api/messages.rb +4 -81
  16. data/lib/whatsapp_sdk/api/phone_numbers.rb +0 -14
  17. data/lib/whatsapp_sdk/api/request.rb +0 -2
  18. data/lib/whatsapp_sdk/api/response.rb +1 -20
  19. data/lib/whatsapp_sdk/api/responses/business_profile_data_response.rb +11 -34
  20. data/lib/whatsapp_sdk/api/responses/data_response.rb +0 -9
  21. data/lib/whatsapp_sdk/api/responses/error_response.rb +1 -8
  22. data/lib/whatsapp_sdk/api/responses/generic_error_response.rb +8 -26
  23. data/lib/whatsapp_sdk/api/responses/media_data_response.rb +8 -26
  24. data/lib/whatsapp_sdk/api/responses/message_data_response.rb +4 -20
  25. data/lib/whatsapp_sdk/api/responses/message_error_response.rb +0 -1
  26. data/lib/whatsapp_sdk/api/responses/message_template_namespace_data_response.rb +3 -13
  27. data/lib/whatsapp_sdk/api/responses/phone_number_data_response.rb +19 -37
  28. data/lib/whatsapp_sdk/api/responses/phone_numbers_data_response.rb +2 -9
  29. data/lib/whatsapp_sdk/api/responses/read_message_data_response.rb +1 -6
  30. data/lib/whatsapp_sdk/api/responses/success_response.rb +1 -5
  31. data/lib/whatsapp_sdk/api/responses/template_data_response.rb +2 -7
  32. data/lib/whatsapp_sdk/api/responses/templates_data_response.rb +2 -9
  33. data/lib/whatsapp_sdk/api/templates.rb +3 -27
  34. data/lib/whatsapp_sdk/configuration.rb +2 -24
  35. data/lib/whatsapp_sdk/error.rb +0 -1
  36. data/lib/whatsapp_sdk/resource/address.rb +1 -30
  37. data/lib/whatsapp_sdk/resource/address_type.rb +3 -8
  38. data/lib/whatsapp_sdk/resource/business_profile.rb +0 -3
  39. data/lib/whatsapp_sdk/resource/button_parameter.rb +4 -20
  40. data/lib/whatsapp_sdk/resource/component.rb +12 -43
  41. data/lib/whatsapp_sdk/resource/contact.rb +1 -30
  42. data/lib/whatsapp_sdk/resource/contact_response.rb +1 -9
  43. data/lib/whatsapp_sdk/resource/currency.rb +0 -8
  44. data/lib/whatsapp_sdk/resource/date_time.rb +0 -6
  45. data/lib/whatsapp_sdk/resource/email.rb +1 -10
  46. data/lib/whatsapp_sdk/resource/errors.rb +1 -17
  47. data/lib/whatsapp_sdk/resource/interactive.rb +6 -27
  48. data/lib/whatsapp_sdk/resource/interactive_action.rb +10 -24
  49. data/lib/whatsapp_sdk/resource/interactive_action_reply_button.rb +5 -19
  50. data/lib/whatsapp_sdk/resource/interactive_action_section.rb +1 -11
  51. data/lib/whatsapp_sdk/resource/interactive_action_section_row.rb +0 -11
  52. data/lib/whatsapp_sdk/resource/interactive_body.rb +0 -10
  53. data/lib/whatsapp_sdk/resource/interactive_footer.rb +0 -10
  54. data/lib/whatsapp_sdk/resource/interactive_header.rb +25 -53
  55. data/lib/whatsapp_sdk/resource/location.rb +44 -0
  56. data/lib/whatsapp_sdk/resource/media.rb +10 -46
  57. data/lib/whatsapp_sdk/resource/media_types.rb +0 -3
  58. data/lib/whatsapp_sdk/resource/message.rb +0 -5
  59. data/lib/whatsapp_sdk/resource/name.rb +1 -28
  60. data/lib/whatsapp_sdk/resource/org.rb +1 -13
  61. data/lib/whatsapp_sdk/resource/parameter_object.rb +71 -74
  62. data/lib/whatsapp_sdk/resource/phone_number.rb +1 -13
  63. data/lib/whatsapp_sdk/resource/template.rb +23 -36
  64. data/lib/whatsapp_sdk/resource/url.rb +1 -10
  65. data/lib/whatsapp_sdk/version.rb +1 -2
  66. data/lib/whatsapp_sdk.rb +0 -4
  67. data/whatsapp_sdk.gemspec +0 -3
  68. metadata +5 -49
  69. data/sorbet/config +0 -6
  70. data/sorbet/rbi/annotations/faraday.rbi +0 -17
  71. data/sorbet/rbi/annotations/mocha.rbi +0 -34
  72. data/sorbet/rbi/annotations/rainbow.rbi +0 -269
  73. data/sorbet/rbi/gems/faraday-multipart@1.0.4.rbi +0 -270
  74. data/sorbet/rbi/gems/faraday-net_http@2.0.3.rbi +0 -182
  75. data/sorbet/rbi/gems/faraday@2.3.0.rbi +0 -2494
  76. data/sorbet/rbi/gems/method_source@1.0.0.rbi +0 -272
  77. data/sorbet/rbi/gems/minitest@5.16.1.rbi +0 -1459
  78. data/sorbet/rbi/gems/mocha@1.14.0.rbi +0 -60
  79. data/sorbet/rbi/gems/multipart-post@2.2.3.rbi +0 -239
  80. data/sorbet/rbi/gems/netrc@0.11.0.rbi +0 -150
  81. data/sorbet/rbi/gems/oj@3.13.14.rbi +0 -589
  82. data/sorbet/rbi/gems/zeitwerk@2.6.0.rbi +0 -867
  83. data/sorbet/rbi/todo.rbi +0 -8
  84. data/sorbet/shims/request.rbi +0 -10
  85. data/sorbet/tapioca/config.yml +0 -13
  86. data/sorbet/tapioca/require.rb +0 -4
@@ -1,4 +1,3 @@
1
- # typed: strict
2
1
  # frozen_string_literal: true
3
2
 
4
3
  require_relative "data_response"
@@ -7,48 +6,31 @@ module WhatsappSdk
7
6
  module Api
8
7
  module Responses
9
8
  class PhoneNumberDataResponse < DataResponse
10
- sig { returns(String) }
11
- attr_accessor :id
9
+ attr_accessor :id, :verified_name, :display_phone_number, :quality_rating, :is_pin_enabled,
10
+ :is_official_business_account, :account_mode, :certificate, :code_verification_status,
11
+ :eligibility_for_api_business_global_search, :name_status, :new_name_status, :status,
12
+ :search_visibility, :messaging_limit_tier
12
13
 
13
- sig { returns(String) }
14
- attr_accessor :verified_name
15
-
16
- sig { returns(String) }
17
- attr_accessor :display_phone_number
18
-
19
- sig { returns(String) }
20
- attr_accessor :quality_rating
21
-
22
- sig { returns(T::Boolean) }
23
- attr_accessor :is_pin_enabled, :is_official_business_account
24
-
25
- sig { returns(T.nilable(String)) }
26
- attr_accessor :account_mode, :code_verification_status, :eligibility_for_api_business_global_search,
27
- :certificate, :name_status, :new_name_status, :status, :search_visibility
28
-
29
- sig { params(response: T::Hash[T.untyped, T.untyped]).void }
30
14
  def initialize(response)
31
- @id = T.let(response["id"], String)
32
- @verified_name = T.let(response["verified_name"], String)
33
- @display_phone_number = T.let(response["display_phone_number"], String)
34
- @quality_rating = T.let(response["quality_rating"], String)
35
- @is_pin_enabled = T.let(response["is_pin_enabled"], T::Boolean)
36
- @is_official_business_account = T.let(response["is_official_business_account"], T.nilable(T::Boolean))
37
- @account_mode = T.let(response["account_mode"], T.nilable(String))
38
- @certificate = T.let(response["certificate"], T.nilable(String))
39
- @code_verification_status = T.let(response["code_verification_status"], T.nilable(String))
40
- @eligibility_for_api_business_global_search = T.let(response["eligibility_for_api_business_global_search"],
41
- T.nilable(String))
42
- @name_status = T.let(response["name_status"], T.nilable(String))
43
- @new_name_status = T.let(response["new_name_status"], T.nilable(String))
44
- @status = T.let(response["status"], T.nilable(String))
45
- @search_visibility = T.let(response["search_visibility"], T.nilable(String))
46
- @messaging_limit_tier = T.let(response["messaging_limit_tier"], T.nilable(String))
15
+ @id = response["id"]
16
+ @verified_name = response["verified_name"]
17
+ @display_phone_number = response["display_phone_number"]
18
+ @quality_rating = response["quality_rating"]
19
+ @is_pin_enabled = response["is_pin_enabled"]
20
+ @is_official_business_account = response["is_official_business_account"]
21
+ @account_mode = response["account_mode"]
22
+ @certificate = response["certificate"]
23
+ @code_verification_status = response["code_verification_status"]
24
+ @eligibility_for_api_business_global_search = response["eligibility_for_api_business_global_search"]
25
+ @name_status = response["name_status"]
26
+ @new_name_status = response["new_name_status"]
27
+ @status = response["status"]
28
+ @search_visibility = response["search_visibility"]
29
+ @messaging_limit_tier = response["messaging_limit_tier"]
47
30
 
48
31
  super(response)
49
32
  end
50
33
 
51
- sig { override.params(response: T::Hash[T.untyped, T.untyped]).returns(T.nilable(PhoneNumberDataResponse)) }
52
34
  def self.build_from_response(response:)
53
35
  return unless response["id"]
54
36
 
@@ -1,4 +1,3 @@
1
- # typed: strict
2
1
  # frozen_string_literal: true
3
2
 
4
3
  require_relative "data_response"
@@ -8,19 +7,14 @@ module WhatsappSdk
8
7
  module Api
9
8
  module Responses
10
9
  class PhoneNumbersDataResponse < DataResponse
11
- sig { returns(T::Array[PhoneNumberDataResponse]) }
12
10
  attr_reader :phone_numbers
13
11
 
14
- sig { params(response: T::Hash[T.untyped, T.untyped]).void }
15
12
  def initialize(response)
16
- @phone_numbers = T.let(
17
- response['data']&.map { |phone_number| parse_phone_number(phone_number) },
18
- T::Array[PhoneNumberDataResponse]
19
- )
13
+ @phone_numbers = response['data']&.map { |phone_number| parse_phone_number(phone_number) }
14
+
20
15
  super(response)
21
16
  end
22
17
 
23
- sig { override.params(response: T::Hash[T.untyped, T.untyped]).returns(T.nilable(PhoneNumbersDataResponse)) }
24
18
  def self.build_from_response(response:)
25
19
  return unless response["data"]
26
20
 
@@ -29,7 +23,6 @@ module WhatsappSdk
29
23
 
30
24
  private
31
25
 
32
- sig { params(phone_number: T::Hash[T.untyped, T.untyped]).returns(PhoneNumberDataResponse) }
33
26
  def parse_phone_number(phone_number)
34
27
  PhoneNumberDataResponse.new(phone_number)
35
28
  end
@@ -1,4 +1,3 @@
1
- # typed: strict
2
1
  # frozen_string_literal: true
3
2
 
4
3
  require_relative "../request"
@@ -10,21 +9,17 @@ module WhatsappSdk
10
9
  module Api
11
10
  module Responses
12
11
  class ReadMessageDataResponse < DataResponse
13
- extend T::Sig
14
- sig { params(response: T::Hash[T.untyped, T.untyped]).void }
15
12
  def initialize(response:)
16
- @success = T.let(response["success"], T::Boolean)
13
+ @success = response["success"]
17
14
  super(response)
18
15
  end
19
16
 
20
- sig { override.params(response: T::Hash[T.untyped, T.untyped]).returns(T.nilable(ReadMessageDataResponse)) }
21
17
  def self.build_from_response(response:)
22
18
  return if response["error"]
23
19
 
24
20
  new(response: response)
25
21
  end
26
22
 
27
- sig { returns(T::Boolean) }
28
23
  def success?
29
24
  @success
30
25
  end
@@ -1,4 +1,3 @@
1
- # typed: strict
2
1
  # frozen_string_literal: true
3
2
 
4
3
  require_relative "data_response"
@@ -7,20 +6,17 @@ module WhatsappSdk
7
6
  module Api
8
7
  module Responses
9
8
  class SuccessResponse < DataResponse
10
- sig { params(response: T::Hash[T.untyped, T.untyped]).void }
11
9
  def initialize(response:)
12
- @success = T.let(response["success"], T::Boolean)
10
+ @success = response["success"]
13
11
  super(response)
14
12
  end
15
13
 
16
- sig { override.params(response: T::Hash[T.untyped, T.untyped]).returns(T.nilable(SuccessResponse)) }
17
14
  def self.build_from_response(response:)
18
15
  return unless response["success"]
19
16
 
20
17
  new(response: response)
21
18
  end
22
19
 
23
- sig { returns(T::Boolean) }
24
20
  def success?
25
21
  @success
26
22
  end
@@ -1,4 +1,3 @@
1
- # typed: strict
2
1
  # frozen_string_literal: true
3
2
 
4
3
  require_relative "data_response"
@@ -8,17 +7,14 @@ module WhatsappSdk
8
7
  module Api
9
8
  module Responses
10
9
  class TemplateDataResponse < DataResponse
11
- sig { returns(::WhatsappSdk::Resource::Template) }
12
10
  attr_reader :template
13
11
 
14
- sig { params(response: T::Hash[T.untyped, T.untyped]).void }
15
12
  def initialize(response:)
16
13
  @template = parse_template(response)
17
14
 
18
15
  super(response)
19
16
  end
20
17
 
21
- sig { override.params(response: T::Hash[T.untyped, T.untyped]).returns(T.nilable(TemplateDataResponse)) }
22
18
  def self.build_from_response(response:)
23
19
  return unless response["id"]
24
20
 
@@ -27,10 +23,9 @@ module WhatsappSdk
27
23
 
28
24
  private
29
25
 
30
- sig { params(template_json: T::Hash[T.untyped, T.untyped]).returns(::WhatsappSdk::Resource::Template) }
31
26
  def parse_template(template_json)
32
- status = ::WhatsappSdk::Resource::Template::Status.try_deserialize(template_json["status"])
33
- category = ::WhatsappSdk::Resource::Template::Category.try_deserialize(template_json["category"])
27
+ status = template_json["status"]
28
+ category = template_json["category"]
34
29
  id = template_json["id"]
35
30
  language = template_json["language"]
36
31
  name = template_json["name"]
@@ -1,4 +1,3 @@
1
- # typed: strict
2
1
  # frozen_string_literal: true
3
2
 
4
3
  require_relative "data_response"
@@ -8,19 +7,14 @@ module WhatsappSdk
8
7
  module Api
9
8
  module Responses
10
9
  class TemplatesDataResponse < DataResponse
11
- sig { returns(T::Array[TemplateDataResponse]) }
12
10
  attr_reader :templates
13
11
 
14
- sig { params(response: T::Hash[T.untyped, T.untyped]).void }
15
12
  def initialize(response)
16
- @templates = T.let(
17
- response['data']&.map { |template| parse_templates(template) },
18
- T::Array[TemplateDataResponse]
19
- )
13
+ @templates = response['data']&.map { |template| parse_templates(template) }
14
+
20
15
  super(response)
21
16
  end
22
17
 
23
- sig { override.params(response: T::Hash[T.untyped, T.untyped]).returns(T.nilable(TemplatesDataResponse)) }
24
18
  def self.build_from_response(response:)
25
19
  return unless response["data"]
26
20
 
@@ -29,7 +23,6 @@ module WhatsappSdk
29
23
 
30
24
  private
31
25
 
32
- sig { params(template: T::Hash[T.untyped, T.untyped]).returns(TemplateDataResponse) }
33
26
  def parse_templates(template)
34
27
  TemplateDataResponse.new(response: template)
35
28
  end
@@ -1,4 +1,3 @@
1
- # typed: strict
2
1
  # frozen_string_literal: true
3
2
 
4
3
  require_relative "request"
@@ -13,15 +12,11 @@ require_relative "../resource/languages"
13
12
  module WhatsappSdk
14
13
  module Api
15
14
  class Templates < Request
16
- DEFAULT_HEADERS = T.let({ 'Content-Type' => 'application/json' }.freeze, Hash)
15
+ DEFAULT_HEADERS = { 'Content-Type' => 'application/json' }.freeze
17
16
 
18
17
  class InvalidCategoryError < StandardError
19
- extend T::Sig
20
-
21
- sig { returns(String) }
22
18
  attr_reader :category
23
19
 
24
- sig { params(category: String).void }
25
20
  def initialize(category:)
26
21
  @category = category
27
22
 
@@ -42,20 +37,10 @@ module WhatsappSdk
42
37
  # Set to true to allow us to assign a category based on the template guidelines and the template's contents.
43
38
  # This can prevent your template from being rejected for miscategorization.
44
39
  # @return [Response] Response object.
45
- sig do
46
- params(
47
- business_id: Integer,
48
- name: String,
49
- category: String,
50
- language: String,
51
- components_json: T.nilable(T::Array[T::Hash[T.untyped, T.untyped]]),
52
- allow_category_change: T.nilable(T::Boolean)
53
- ).returns(Response)
54
- end
55
40
  def create(
56
41
  business_id:, name:, category:, language:, components_json: nil, allow_category_change: nil
57
42
  )
58
- unless WhatsappSdk::Resource::Template::Category.try_deserialize(category)
43
+ unless WhatsappSdk::Resource::Template::Category.valid?(category)
59
44
  raise InvalidCategoryError.new(category: category)
60
45
  end
61
46
 
@@ -90,7 +75,6 @@ module WhatsappSdk
90
75
  # @param business_id [Integer] The business ID.
91
76
  # @param limit [Integer] Optional. Number of templates to return in a single page.
92
77
  # @return [Response] Response object.
93
- sig { params(business_id: Integer, limit: T.nilable(Integer)).returns(Response) }
94
78
  def templates(business_id:, limit: 100)
95
79
  params = {}
96
80
  params["limit"] = limit if limit
@@ -113,7 +97,6 @@ module WhatsappSdk
113
97
  #
114
98
  # @param business_id [Integer] The business ID.
115
99
  # @return [Response] Response object.
116
- sig { params(business_id: Integer).returns(Response) }
117
100
  def get_message_template_namespace(business_id:)
118
101
  response = send_request(
119
102
  endpoint: business_id.to_s,
@@ -139,7 +122,7 @@ module WhatsappSdk
139
122
  # @param components_json [Json] Components that make up the template..
140
123
  # return [Response] Response object.
141
124
  def update(template_id:, category: nil, components_json: nil)
142
- if category && !WhatsappSdk::Resource::Template::Category.try_deserialize(category)
125
+ if category && !WhatsappSdk::Resource::Template::Category.valid?(category)
143
126
  raise InvalidCategoryError.new(category: category)
144
127
  end
145
128
 
@@ -173,13 +156,6 @@ module WhatsappSdk
173
156
  # @param hsm_id [String] Optional. The template's id.
174
157
  #
175
158
  # @return [Response] Response object.
176
- sig do
177
- params(
178
- business_id: Integer,
179
- name: String,
180
- hsm_id: T.nilable(String)
181
- ).returns(Response)
182
- end
183
159
  def delete(business_id:, name:, hsm_id: nil)
184
160
  params = { name: name }
185
161
  params[:hsm_id] = hsm_id if hsm_id
@@ -1,4 +1,3 @@
1
- # typed: strict
2
1
  # frozen_string_literal: true
3
2
 
4
3
  module WhatsappSdk
@@ -10,31 +9,11 @@ module WhatsappSdk
10
9
  #
11
10
  # The gem have access to the client through WhatsappSdk.configuration.client
12
11
  class Configuration
13
- extend T::Sig
14
-
15
- logger_or_subclass_or_nil = T.nilable(T.any(Logger, T.class_of(Logger)))
16
-
17
- sig { returns(String) }
18
- attr_accessor :access_token
19
-
20
- sig { returns(String) }
21
- attr_accessor :api_version
12
+ attr_accessor :access_token, :api_version
22
13
 
23
14
  # loggers like ActiveSupport::Logger (Rails.logger) is a subclass of Logger
24
- sig { returns(logger_or_subclass_or_nil) }
25
- attr_accessor :logger
15
+ attr_accessor :logger, :logger_options
26
16
 
27
- sig { returns(Hash) }
28
- attr_accessor :logger_options
29
-
30
- sig do
31
- params(
32
- access_token: String,
33
- api_version: String,
34
- logger: logger_or_subclass_or_nil,
35
- logger_options: Hash
36
- ).void
37
- end
38
17
  def initialize(
39
18
  access_token = "",
40
19
  api_version = Api::ApiConfiguration::DEFAULT_API_VERSION,
@@ -47,7 +26,6 @@ module WhatsappSdk
47
26
  @logger_options = logger_options
48
27
  end
49
28
 
50
- sig { returns(Api::Client) }
51
29
  def client
52
30
  Api::Client.new(access_token, api_version, logger, logger_options)
53
31
  end
@@ -1,4 +1,3 @@
1
- # typed: strict
2
1
  # frozen_string_literal: true
3
2
 
4
3
  module WhatsappSdk
@@ -1,38 +1,10 @@
1
- # typed: strict
2
1
  # frozen_string_literal: true
3
2
 
4
3
  module WhatsappSdk
5
4
  module Resource
6
5
  class Address
7
- extend T::Sig
6
+ attr_accessor :street, :city, :state, :zip, :country, :country_code, :type
8
7
 
9
- sig { returns(String) }
10
- attr_accessor :street
11
-
12
- sig { returns(String) }
13
- attr_accessor :city
14
-
15
- sig { returns(String) }
16
- attr_accessor :state
17
-
18
- sig { returns(String) }
19
- attr_accessor :zip
20
-
21
- sig { returns(String) }
22
- attr_accessor :country
23
-
24
- sig { returns(String) }
25
- attr_accessor :country_code
26
-
27
- sig { returns(AddressType) }
28
- attr_accessor :type
29
-
30
- sig do
31
- params(
32
- street: String, city: String, state: String, zip: String,
33
- country: String, country_code: String, type: AddressType
34
- ).void
35
- end
36
8
  def initialize(street:, city:, state:, zip:, country:, country_code:, type: AddressType::Home)
37
9
  @street = street
38
10
  @city = city
@@ -43,7 +15,6 @@ module WhatsappSdk
43
15
  @type = type
44
16
  end
45
17
 
46
- sig { returns(T::Hash[T.untyped, T.untyped]) }
47
18
  def to_h
48
19
  {
49
20
  street: @street,
@@ -1,15 +1,10 @@
1
- # typed: strict
2
1
  # frozen_string_literal: true
3
2
 
4
3
  module WhatsappSdk
5
4
  module Resource
6
- class AddressType < T::Enum
7
- extend T::Sig
8
-
9
- enums do
10
- Home = new("Home")
11
- Work = new("Work")
12
- end
5
+ module AddressType
6
+ HOME = "Home"
7
+ WORK = "Work"
13
8
  end
14
9
  end
15
10
  end
@@ -1,11 +1,8 @@
1
- # typed: strict
2
1
  # frozen_string_literal: true
3
2
 
4
3
  module WhatsappSdk
5
4
  module Resource
6
5
  class BusinessProfile
7
- extend T::Sig
8
-
9
6
  VERTICAL_VALUES = %w[
10
7
  UNDEFINED OTHER AUTO BEAUTY APPAREL EDU ENTERTAIN EVENT_PLAN FINANCE GROCERY
11
8
  GOVT HOTEL HEALTH NONPROFIT PROF_SERVICES RETAIL TRAVEL RESTAURANT NOT_A_BIZ
@@ -1,24 +1,16 @@
1
- # typed: strict
2
1
  # frozen_string_literal: true
3
2
 
4
3
  module WhatsappSdk
5
4
  module Resource
6
5
  class ButtonParameter
7
- extend T::Sig
8
-
9
6
  # Returns the button parameter type.
10
7
  #
11
8
  # @returns type [String] Valid options are payload and text.
12
- sig { returns(Type) }
13
9
  attr_accessor :type
14
10
 
15
- class Type < T::Enum
16
- extend T::Sig
17
-
18
- enums do
19
- Text = new("text")
20
- Payload = new("payload")
21
- end
11
+ module Type
12
+ TEXT = "text"
13
+ PAYLOAD = "payload"
22
14
  end
23
15
 
24
16
  # Required for quick_reply buttons.
@@ -26,31 +18,23 @@ module WhatsappSdk
26
18
  # in addition to the display text on the button.
27
19
  #
28
20
  # @returns payload [String]
29
- sig { returns(T.nilable(String)) }
30
21
  attr_accessor :payload
31
22
 
32
23
  # Required for URL buttons.
33
24
  # Developer-provided suffix that is appended to the predefined prefix URL in the template.
34
25
  #
35
26
  # @returns text [String]
36
- sig { returns(T.nilable(String)) }
37
27
  attr_accessor :text
38
28
 
39
- sig do
40
- params(
41
- type: Type, payload: T.nilable(String), text: T.nilable(String)
42
- ).void
43
- end
44
29
  def initialize(type:, payload: nil, text: nil)
45
30
  @type = type
46
31
  @payload = payload
47
32
  @text = text
48
33
  end
49
34
 
50
- sig { returns(T::Hash[T.untyped, T.untyped]) }
51
35
  def to_json
52
36
  json = {
53
- type: type.serialize
37
+ type: type
54
38
  }
55
39
  json[:payload] = payload if payload
56
40
  json[:text] = text if text
@@ -1,21 +1,11 @@
1
- # typed: strict
2
1
  # frozen_string_literal: true
3
2
 
4
3
  module WhatsappSdk
5
4
  module Resource
6
5
  class Component
7
- extend T::Sig
8
-
9
6
  class InvalidField < StandardError
10
- extend T::Sig
11
-
12
- sig { returns(Symbol) }
13
- attr_reader :field
7
+ attr_reader :field, :message
14
8
 
15
- sig { returns(String) }
16
- attr_reader :message
17
-
18
- sig { params(field: Symbol, message: String).void }
19
9
  def initialize(field, message)
20
10
  @field = field
21
11
  @message = message
@@ -23,35 +13,25 @@ module WhatsappSdk
23
13
  end
24
14
  end
25
15
 
26
- class Type < T::Enum
27
- extend T::Sig
28
-
29
- enums do
30
- Header = new("header")
31
- Body = new("body")
32
- Button = new("button")
33
- end
16
+ module Type
17
+ HEADER = "header"
18
+ BODY = "body"
19
+ BUTTON = "button"
34
20
  end
35
21
 
36
- class Subtype < T::Enum
37
- extend T::Sig
38
-
39
- enums do
40
- QuickReply = new("quick_reply")
41
- Url = new("url")
42
- end
22
+ module Subtype
23
+ QUICK_REPLY = "quick_reply"
24
+ URL = "url"
43
25
  end
44
26
 
45
27
  # Returns the Component type.
46
28
  #
47
29
  # @returns type [String]. Supported Options are header, body and button.
48
- sig { returns(Type) }
49
30
  attr_accessor :type
50
31
 
51
32
  # Returns the parameters of the component. For button type, it's required.
52
33
  #
53
34
  # @returns parameter [Array<ButtonParameter, ParameterObject>] .
54
- sig { returns(T::Array[T.any(ButtonParameter, ParameterObject)]) }
55
35
  attr_accessor :parameters
56
36
 
57
37
  # Returns the Type of button to create. Required when type=button. Not used for the other types.
@@ -62,51 +42,40 @@ module WhatsappSdk
62
42
  # appending the text parameter to the predefined prefix URL in the template.
63
43
  #
64
44
  # @returns subtype [String]. Valid options are quick_reply and url.
65
- sig { returns(T.nilable(Component::Subtype)) }
66
45
  attr_accessor :sub_type
67
46
 
68
47
  # Required when type=button. Not used for the other types.
69
48
  # Position index of the button. You can have up to 3 buttons using index values of 0 to 2.
70
49
  #
71
50
  # @returns index [Integer].
72
- sig { returns(T.nilable(Integer)) }
73
51
  attr_accessor :index
74
52
 
75
- sig { params(parameter: T.any(ButtonParameter, ParameterObject)).void }
76
53
  def add_parameter(parameter)
77
54
  @parameters << parameter
78
55
  end
79
56
 
80
- sig do
81
- params(
82
- type: Type, parameters: T::Array[T.any(ButtonParameter, ParameterObject)],
83
- sub_type: T.nilable(Component::Subtype), index: T.nilable(Integer)
84
- ).void
85
- end
86
57
  def initialize(type:, parameters: [], sub_type: nil, index: nil)
87
58
  @parameters = parameters
88
59
  @type = type
89
60
  @sub_type = sub_type
90
- @index = index.nil? && type == Type::Button ? 0 : index
61
+ @index = index.nil? && type == Type::BUTTON ? 0 : index
91
62
  validate_fields
92
63
  end
93
64
 
94
- sig { returns(T::Hash[T.untyped, T.untyped]) }
95
65
  def to_json
96
66
  json = {
97
- type: type.serialize,
67
+ type: type,
98
68
  parameters: parameters.map(&:to_json)
99
69
  }
100
- json[:sub_type] = sub_type&.serialize if sub_type
70
+ json[:sub_type] = sub_type if sub_type
101
71
  json[:index] = index if index
102
72
  json
103
73
  end
104
74
 
105
75
  private
106
76
 
107
- sig { void }
108
77
  def validate_fields
109
- return if type == Type::Button
78
+ return if type == Type::BUTTON
110
79
 
111
80
  raise InvalidField.new(:sub_type, 'sub_type is not required when type is not button') if sub_type
112
81
 
@@ -1,38 +1,10 @@
1
- # typed: strict
2
1
  # frozen_string_literal: true
3
2
 
4
3
  module WhatsappSdk
5
4
  module Resource
6
5
  class Contact
7
- extend T::Sig
6
+ attr_accessor :addresses, :birthday, :emails, :name, :org, :phones, :urls
8
7
 
9
- sig { returns(T::Array[Address]) }
10
- attr_accessor :addresses
11
-
12
- sig { returns(String) }
13
- attr_accessor :birthday
14
-
15
- sig { returns(T::Array[Email]) }
16
- attr_accessor :emails
17
-
18
- sig { returns(Name) }
19
- attr_accessor :name
20
-
21
- sig { returns(Org) }
22
- attr_accessor :org
23
-
24
- sig { returns(T::Array[PhoneNumber]) }
25
- attr_accessor :phones
26
-
27
- sig { returns(T::Array[Url]) }
28
- attr_accessor :urls
29
-
30
- sig do
31
- params(
32
- addresses: T::Array[Address], birthday: String, emails: T::Array[Email],
33
- name: Name, org: Org, phones: T::Array[PhoneNumber], urls: T::Array[Url]
34
- ).void
35
- end
36
8
  def initialize(addresses:, birthday:, emails:, name:, org:, phones:, urls:)
37
9
  @addresses = addresses
38
10
  @birthday = birthday
@@ -43,7 +15,6 @@ module WhatsappSdk
43
15
  @urls = urls
44
16
  end
45
17
 
46
- sig { returns(T::Hash[T.untyped, T.untyped]) }
47
18
  def to_h
48
19
  {
49
20
  addresses: addresses.map(&:to_h),