whatsapp_sdk 0.8.0 → 0.9.1

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: cf1d072bf1bc9cd834a9917a863177cc0b5b2ddfac0c29b0d4e899ee23cb9c19
4
- data.tar.gz: 25dca7a61a5d80d19fcf32fa54e07edcb911901e936c5b315e46488d87c8b900
3
+ metadata.gz: 1d6eccb61d3c648fa1c8a2a7e56512c1887b1aad9eb99f2569927f810b1754f8
4
+ data.tar.gz: 5cada724227ef568c36ec56a2a206752e170946e8890acefe504b24f821e9ab6
5
5
  SHA512:
6
- metadata.gz: 5a1204308855d7fb8945a5fda9a3939928b0ec5d6cc6e65fe95abfb303eec2f3dfa4f667f6b9cfc3c264144cdf8290eb80e7aa2ed5e60b213da398d1beded5ef
7
- data.tar.gz: 82039c3038209445ad552cca6c23755d8acf2662af4ff6c3fb63464979a42533c92d5768cd376c72252e5b4058932b71a8b9d393471aeb7ba4903a1b62358c12
6
+ metadata.gz: d9b534bc13fb8fad31fc31245417cf508537c4edd851b1d9cc6e546f50fbede19dd8bccbbe636194f49c1a40bbe721307b2dd8c1f0c4ea21cdc8ec643423d2db
7
+ data.tar.gz: 5f99f8a13ce068bd9667a719c7cdebcc87de874fb8b0cc7b06f6b0e1c857d888241ea6188ac6c9c9155a4184059effaade3c6255969a59b4a72cfa17d3c7abfc
data/.gitignore CHANGED
@@ -7,6 +7,8 @@
7
7
  /spec/reports/
8
8
  /tmp/
9
9
 
10
+ example_copy.rb
11
+
10
12
  DELETE_ME
11
13
  REMOVE.rb
12
14
 
data/.rubocop.yml CHANGED
@@ -31,6 +31,9 @@ Metrics/MethodLength:
31
31
  Metrics/BlockLength:
32
32
  Enabled: false
33
33
 
34
+ Metrics/CyclomaticComplexity:
35
+ Enabled: false
36
+
34
37
  Naming/VariableNumber:
35
38
  Enabled: false
36
39
 
data/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Unreleased
2
2
 
3
+ # v 0.9.1
4
+ - Invalidate unsupported and invalid media types @ignacio-chiazzo [#89](https://github.com/ignacio-chiazzo/ruby_whatsapp_sdk/pull/89)
5
+
6
+ # v 0.9.0
7
+ - Use binary mode to download files @ignacio-chiazzo [#88](https://github.com/ignacio-chiazzo/ruby_whatsapp_sdk/pull/87)
8
+ - Added support for downloading media by specifying the type @ignacio-chiazzo [#87](https://github.com/ignacio-chiazzo/ruby_whatsapp_sdk/pull/87)
9
+
3
10
  # v 0.8.0
4
11
  - Added Send interactive message @alienware [#82](https://github.com/ignacio-chiazzo/ruby_whatsapp_sdk/pull/82)
5
12
  - Support JRuby @ignacio-chiazzo [#83](https://github.com/ignacio-chiazzo/ruby_whatsapp_sdk/pull/83)
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- whatsapp_sdk (0.8.0)
4
+ whatsapp_sdk (0.9.1)
5
5
  faraday (~> 2.3.0)
6
6
  faraday-multipart (~> 1.0.4)
7
7
  sorbet-runtime (~> 0.5.1)
data/README.md CHANGED
@@ -183,7 +183,7 @@ media = medias_api.media(media_id: MEDIA_ID)
183
183
 
184
184
  Download media
185
185
  ```ruby
186
- medias_api.download(url: MEDIA_URL, file_path: 'tmp/downloaded_whatsapp.png')
186
+ medias_api.download(url: MEDIA_URL, file_path: 'tmp/downloaded_whatsapp.png', media_type: "image/png")
187
187
  ```
188
188
 
189
189
  Delete a media
data/example.rb CHANGED
@@ -22,11 +22,11 @@ require "pry-nav"
22
22
 
23
23
  ################# UPDATE CONSTANTS #################
24
24
 
25
- ACCESS_TOKEN = "EAAZAvvr0DZBs0BAIOsVV2FogD1qQhIyIrK9vfM7mmfdTlhbRqFZAZBnS2ciXPD35wb8d69siULaU5cqX9HonDNnZA9YLAbrCLUys1qt1E3n4d69v9RTZCoA8bkz9TZCV2PWzRR9DvBmwUOltCOrZBN0vGQxULlhsJE1mTeUrXlpVfFZCY5sWXCKxe04uyd7dzyK0hMgvkCR97OXi9AI3qJFYo"
26
- SENDER_ID = 111591145018464
27
- RECIPIENT_NUMBER = 13437772910
28
- BUSINESS_ID = 102261539298487
29
- IMAGE_LINK = "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"
25
+ ACCESS_TOKEN = "<TODO replace>"
26
+ SENDER_ID = "<TODO replace>"
27
+ RECIPIENT_NUMBER = "<TODO replace>"
28
+ BUSINESS_ID = "<TODO replace>"
29
+ IMAGE_LINK = "<TODO replace>"
30
30
 
31
31
  if ACCESS_TOKEN == "<TODO replace>"
32
32
  puts "\n\n**** Please update the ACCESS_TOKEN constant in this file. ****\n\n"
@@ -52,7 +52,6 @@ medias_api = WhatsappSdk::Api::Medias.new
52
52
  messages_api = WhatsappSdk::Api::Messages.new
53
53
  phone_numbers_api = WhatsappSdk::Api::PhoneNumbers.new
54
54
  business_profile_api = WhatsappSdk::Api::BusinessProfile.new
55
-
56
55
  ############################## Business API ##############################
57
56
  business_profile = business_profile_api.details(SENDER_ID)
58
57
  business_profile_api.update(phone_number_id: SENDER_ID, params: { about: "A very cool business" } )
@@ -63,23 +62,39 @@ registered_numbers = phone_numbers_api.registered_numbers(BUSINESS_ID)
63
62
 
64
63
  ############################## Media API ##############################
65
64
 
66
- # upload a media
65
+ ##### Image #####
66
+ # upload a Image
67
67
  uploaded_media = medias_api.upload(sender_id: SENDER_ID, file_path: "tmp/whatsapp.png", type: "image/png")
68
68
  media_id = uploaded_media.data&.id
69
69
  puts "Uploaded media id: #{media_id}"
70
70
 
71
- # get a media
71
+ # get a media Image
72
72
  media = medias_api.media(media_id: media_id).data
73
73
  puts "Media info: #{media.raw_data_response}"
74
74
 
75
- # download media
76
- download_image = medias_api.download(url: media&.url, file_path: 'tmp/downloaded_whatsapp.png')
75
+ # download media Image
76
+ download_image = medias_api.download(url: media.url, file_path: 'tmp/downloaded_image.png', media_type: "image/png")
77
77
  puts "Downloaded: #{download_image.data.success?}"
78
78
 
79
79
  # delete a media
80
80
  deleted_media = medias_api.delete(media_id: media&.id)
81
81
  puts "Deleted: #{deleted_media.data.success?}"
82
82
 
83
+ #### Audio ####
84
+ # upload an audio
85
+ uploaded_media = medias_api.upload(sender_id: SENDER_ID, file_path: "tmp/downloaded_audio.ogg", type: "audio/ogg")
86
+ media_id = uploaded_media.data&.id
87
+ puts "Uploaded media id: #{media_id}"
88
+
89
+ # get a media audio
90
+ media = medias_api.media(media_id: media_id).data
91
+ puts "Media info: #{media.raw_data_response}"
92
+
93
+ # get a media audio
94
+ audio_link = media.url
95
+ download_image = medias_api.download(url: audio_link, file_path: 'tmp/downloaded_audio2.ogg', media_type: "audio/ogg")
96
+ puts "Downloaded: #{download_image.data.success?}"
97
+
83
98
  ############################## Messages API ##############################
84
99
 
85
100
  ######### SEND A TEXT MESSAGE
@@ -35,18 +35,22 @@ module WhatsappSdk
35
35
  JSON.parse(response.body)
36
36
  end
37
37
 
38
- sig { params(url: String, path_to_file_name: T.nilable(String)).returns(Net::HTTPResponse) }
39
- def download_file(url, path_to_file_name = nil)
38
+ sig do
39
+ params(url: String, content_type_header: String, file_path: T.nilable(String))
40
+ .returns(Net::HTTPResponse)
41
+ end
42
+ def download_file(url:, content_type_header:, file_path: nil)
40
43
  uri = URI.parse(url)
41
44
  request = Net::HTTP::Get.new(uri)
42
45
  request["Authorization"] = "Bearer #{@access_token}"
46
+ request.content_type = content_type_header
43
47
  req_options = { use_ssl: uri.scheme == "https" }
44
48
 
45
49
  response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
46
50
  http.request(request)
47
51
  end
48
52
 
49
- File.write(path_to_file_name, response.body) if response.code == "200" && path_to_file_name
53
+ File.write(file_path, response.body, mode: 'wb') if response.code == "200" && file_path
50
54
 
51
55
  response
52
56
  end
@@ -6,8 +6,9 @@ require "faraday/multipart"
6
6
 
7
7
  require_relative "request"
8
8
  require_relative "response"
9
- require_relative '../../../lib/whatsapp_sdk/api/responses/media_data_response'
10
- require_relative '../../../lib/whatsapp_sdk/api/responses/success_response'
9
+ require_relative 'responses/media_data_response'
10
+ require_relative 'responses/success_response'
11
+ require_relative '../resource/media_types'
11
12
 
12
13
  module WhatsappSdk
13
14
  module Api
@@ -19,9 +20,26 @@ module WhatsappSdk
19
20
  attr_reader :file_path
20
21
 
21
22
  sig { params(file_path: String).void }
22
- def initialize(file_path)
23
+ def initialize(file_path:)
23
24
  @file_path = file_path
24
- super("Couldn't find file_path: #{file_path}")
25
+
26
+ message = "Couldn't find file_path: #{file_path}"
27
+ super(message)
28
+ end
29
+ end
30
+
31
+ class InvalidMediaTypeError < StandardError
32
+ extend T::Sig
33
+
34
+ sig { returns(String) }
35
+ attr_reader :media_type
36
+
37
+ sig { params(media_type: String).void }
38
+ def initialize(media_type:)
39
+ @media_type = media_type
40
+ message = "Invalid Media Type #{media_type}. See the supported types in the official documentation " \
41
+ "https://developers.facebook.com/docs/whatsapp/cloud-api/reference/media#supported-media-types."
42
+ super(message)
25
43
  end
26
44
  end
27
45
 
@@ -46,11 +64,16 @@ module WhatsappSdk
46
64
  #
47
65
  # @param url URL.
48
66
  # @param file_path [String] The file_path to download the media e.g. "tmp/downloaded_image.png".
67
+ # @param media_type [String] The media type e.g. "audio/mp4". See the supported types in the official
68
+ # documentation https://developers.facebook.com/docs/whatsapp/cloud-api/reference/media#supported-media-types.
49
69
  # @return [WhatsappSdk::Api::Response] Response object.
50
- sig { params(url: String, file_path: String).returns(WhatsappSdk::Api::Response) }
51
- def download(url:, file_path:)
52
- response = download_file(url, file_path)
70
+ sig { params(url: String, file_path: String, media_type: String).returns(WhatsappSdk::Api::Response) }
71
+ def download(url:, file_path:, media_type:)
72
+ raise InvalidMediaTypeError.new(media_type: media_type) unless valid_media_type?(media_type)
53
73
 
74
+ content_type_header = map_media_type_to_content_type_header(media_type)
75
+
76
+ response = download_file(url: url, file_path: file_path, content_type_header: content_type_header)
54
77
  response = if response.code.to_i == 200
55
78
  { "success" => true }
56
79
  else
@@ -73,7 +96,7 @@ module WhatsappSdk
73
96
  # @return [WhatsappSdk::Api::Response] Response object.
74
97
  sig { params(sender_id: Integer, file_path: String, type: String).returns(WhatsappSdk::Api::Response) }
75
98
  def upload(sender_id:, file_path:, type:)
76
- raise FileNotFoundError, file_path unless File.file?(file_path)
99
+ raise FileNotFoundError.new(file_path: file_path) unless File.file?(file_path)
77
100
 
78
101
  params = {
79
102
  messaging_product: "whatsapp",
@@ -105,6 +128,20 @@ module WhatsappSdk
105
128
  data_class_type: WhatsappSdk::Api::Responses::SuccessResponse
106
129
  )
107
130
  end
131
+
132
+ private
133
+
134
+ def map_media_type_to_content_type_header(media_type)
135
+ # Media type maps 1:1 to the content-type header.
136
+ # The list of supported types are in MediaTypes::SUPPORTED_TYPES.
137
+ # It uses the media type defined by IANA https://www.iana.org/assignments/media-types
138
+
139
+ media_type
140
+ end
141
+
142
+ def valid_media_type?(media_type)
143
+ WhatsappSdk::Resource::MediaTypes::SUPPORTED_MEDIA_TYPES.include?(media_type)
144
+ end
108
145
  end
109
146
  end
110
147
  end
@@ -412,8 +412,8 @@ module WhatsappSdk
412
412
  )
413
413
  end
414
414
 
415
- alias :send_interactive_reply_buttons :send_interactive_message
416
- alias :send_interactive_list_messages :send_interactive_message
415
+ alias send_interactive_reply_buttons send_interactive_message
416
+ alias send_interactive_list_messages send_interactive_message
417
417
 
418
418
  # Mark a message as read.
419
419
  #
@@ -10,8 +10,8 @@ module WhatsappSdk
10
10
  @client = client
11
11
  end
12
12
 
13
- def download_file(url, path_to_file_name = nil)
14
- @client.download_file(url, path_to_file_name)
13
+ def download_file(url:, content_type_header:, file_path: nil)
14
+ @client.download_file(url: url, content_type_header: content_type_header, file_path: file_path)
15
15
  end
16
16
 
17
17
  def send_request(endpoint: nil, full_url: nil, http_method: "post", params: {}, headers: {})
@@ -61,7 +61,7 @@ module WhatsappSdk
61
61
  sig do
62
62
  params(
63
63
  type: Type, buttons: T::Array[InteractiveActionReplyButton],
64
- button: String, sections: T::Array[InteractiveActionSection],
64
+ button: String, sections: T::Array[InteractiveActionSection]
65
65
  ).void
66
66
  end
67
67
  def initialize(type:, buttons: [], button: "", sections: [])
@@ -93,40 +93,48 @@ module WhatsappSdk
93
93
  def validate_fields
94
94
  case type.serialize
95
95
  when "list_message"
96
- button_length = button.length
97
- sections_count = sections.length
98
- unless button_length > 0
99
- raise WhatsappSdk::Resource::Error::InvalidInteractiveActionButton,
100
- "Invalid button in action. Button label is required."
101
- end
102
-
103
- unless button_length <= LIST_BUTTON_TITLE_MAXIMUM
104
- raise WhatsappSdk::Resource::Error::InvalidInteractiveActionButton,
105
- "Invalid length #{button_length} for button. Maximum length: " \
106
- "#{LIST_BUTTON_TITLE_MAXIMUM} characters."
107
- end
108
-
109
- unless (LIST_SECTIONS_MINIMUM..LIST_SECTIONS_MAXIMUM).cover?(sections_count)
110
- raise WhatsappSdk::Resource::Error::InvalidInteractiveActionSection,
111
- "Invalid length #{sections_count} for sections in action. It should be between " \
112
- "#{LIST_SECTIONS_MINIMUM} and #{LIST_SECTIONS_MAXIMUM}."
113
- end
114
-
115
- sections.each { |section| section.validate }
96
+ validate_list_message
116
97
  when "reply_button"
117
- buttons_count = buttons.length
118
- unless (REPLY_BUTTONS_MINIMUM..REPLY_BUTTONS_MAXIMUM).cover?(buttons_count)
119
- raise WhatsappSdk::Resource::Error::InvalidInteractiveActionReplyButton,
120
- "Invalid length #{buttons_count} for buttons in action. It should be between " \
121
- "#{REPLY_BUTTONS_MINIMUM} and #{REPLY_BUTTONS_MAXIMUM}."
122
- end
98
+ validate_reply_button
99
+ end
100
+ end
101
+
102
+ def validate_list_message
103
+ button_length = button.length
104
+ sections_count = sections.length
105
+ unless button_length.positive?
106
+ raise WhatsappSdk::Resource::Error::InvalidInteractiveActionButton,
107
+ "Invalid button in action. Button label is required."
108
+ end
123
109
 
124
- button_ids = buttons.map(&:id)
125
- return if button_ids.length.eql?(button_ids.uniq.length)
110
+ unless button_length <= LIST_BUTTON_TITLE_MAXIMUM
111
+ raise WhatsappSdk::Resource::Error::InvalidInteractiveActionButton,
112
+ "Invalid length #{button_length} for button. Maximum length: " \
113
+ "#{LIST_BUTTON_TITLE_MAXIMUM} characters."
114
+ end
126
115
 
116
+ unless (LIST_SECTIONS_MINIMUM..LIST_SECTIONS_MAXIMUM).cover?(sections_count)
117
+ raise WhatsappSdk::Resource::Error::InvalidInteractiveActionSection,
118
+ "Invalid length #{sections_count} for sections in action. It should be between " \
119
+ "#{LIST_SECTIONS_MINIMUM} and #{LIST_SECTIONS_MAXIMUM}."
120
+ end
121
+
122
+ sections.each(&:validate)
123
+ end
124
+
125
+ def validate_reply_button
126
+ buttons_count = buttons.length
127
+ unless (REPLY_BUTTONS_MINIMUM..REPLY_BUTTONS_MAXIMUM).cover?(buttons_count)
127
128
  raise WhatsappSdk::Resource::Error::InvalidInteractiveActionReplyButton,
128
- "Duplicate ids #{button_ids} for buttons in action. They should be unique."
129
+ "Invalid length #{buttons_count} for buttons in action. It should be between " \
130
+ "#{REPLY_BUTTONS_MINIMUM} and #{REPLY_BUTTONS_MAXIMUM}."
129
131
  end
132
+
133
+ button_ids = buttons.map(&:id)
134
+ return if button_ids.length.eql?(button_ids.uniq.length)
135
+
136
+ raise WhatsappSdk::Resource::Error::InvalidInteractiveActionReplyButton,
137
+ "Duplicate ids #{button_ids} for buttons in action. They should be unique."
130
138
  end
131
139
  end
132
140
  end
@@ -34,12 +34,10 @@ module WhatsappSdk
34
34
  end
35
35
 
36
36
  def to_json
37
- json = {
37
+ {
38
38
  title: title,
39
- rows: rows.map(&:to_json),
39
+ rows: rows.map(&:to_json)
40
40
  }
41
-
42
- json
43
41
  end
44
42
 
45
43
  sig { params(skip_rows: T.nilable(T::Boolean)).void }
@@ -72,4 +70,3 @@ module WhatsappSdk
72
70
  end
73
71
  end
74
72
  end
75
-
@@ -29,7 +29,7 @@ module WhatsappSdk
29
29
  ACTION_SECTION_DESCRIPTION_MAXIMUM = 72
30
30
  ACTION_SECTION_ID_MAXIMUM = 256
31
31
 
32
- sig { params(title: String, id: String, description: T::nilable(String)).void }
32
+ sig { params(title: String, id: String, description: T.nilable(String)).void }
33
33
  def initialize(title:, id:, description: "")
34
34
  @title = title
35
35
  @id = id
@@ -42,7 +42,7 @@ module WhatsappSdk
42
42
  id: id,
43
43
  title: title
44
44
  }
45
- json[:description] = description if description.length > 0
45
+ json[:description] = description if description.length.positive?
46
46
 
47
47
  json
48
48
  end
@@ -61,9 +61,9 @@ module WhatsappSdk
61
61
  title_length = title.length
62
62
  return if title_length <= ACTION_SECTION_TITLE_MAXIMUM
63
63
 
64
- raise WhatsappSdk::Resource::Error::InvalidInteractiveActionSectionRow.new(
65
- "Invalid length #{title_length} for title in section row. Maximum length: #{ACTION_SECTION_TITLE_MAXIMUM} characters.",
66
- )
64
+ raise WhatsappSdk::Resource::Error::InvalidInteractiveActionSectionRow,
65
+ "Invalid length #{title_length} for title in section row. "\
66
+ "Maximum length: #{ACTION_SECTION_TITLE_MAXIMUM} characters."
67
67
  end
68
68
 
69
69
  sig { void }
@@ -74,9 +74,9 @@ module WhatsappSdk
74
74
  id_length = id.length
75
75
  return if id_length <= ACTION_SECTION_ID_MAXIMUM
76
76
 
77
- raise WhatsappSdk::Resource::Error::InvalidInteractiveActionSectionRow.new(
78
- "Invalid length #{id_length} for id in section row. Maximum length: #{ACTION_SECTION_ID_MAXIMUM} characters.",
79
- )
77
+ raise WhatsappSdk::Resource::Error::InvalidInteractiveActionSectionRow,
78
+ "Invalid length #{id_length} for id in section row. Maximum length: "\
79
+ "#{ACTION_SECTION_ID_MAXIMUM} characters."
80
80
  end
81
81
 
82
82
  sig { void }
@@ -84,11 +84,10 @@ module WhatsappSdk
84
84
  description_length = description.length
85
85
  return if description_length <= ACTION_SECTION_DESCRIPTION_MAXIMUM
86
86
 
87
- raise WhatsappSdk::Resource::Error::InvalidInteractiveActionSectionRow.new(
88
- "Invalid length #{description_length} for description in section row. Maximum length: #{ACTION_SECTION_DESCRIPTION_MAXIMUM} characters.",
89
- )
87
+ raise WhatsappSdk::Resource::Error::InvalidInteractiveActionSectionRow,
88
+ "Invalid length #{description_length} for description in section " \
89
+ "row. Maximum length: #{ACTION_SECTION_DESCRIPTION_MAXIMUM} characters."
90
90
  end
91
91
  end
92
92
  end
93
93
  end
94
-
@@ -0,0 +1,30 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module WhatsappSdk
5
+ module Resource
6
+ class MediaTypes
7
+ extend T::Sig
8
+
9
+ # The media types supported by Whatsapp. The list contains all the types defined in the Whatsapp API
10
+ # documentation: https://developers.facebook.com/docs/whatsapp/cloud-api/reference/media#supported-media-types
11
+ #
12
+ # The media type is used as a content-type header when downloading the file with MediasApi#download_file.
13
+ # The content-type header matches with the media type using Internet Assigned Numbers Authority (IANA).
14
+ # Media type list defined by IANA https://www.iana.org/assignments/media-types/media-types.xhtml
15
+ #
16
+
17
+ AUDIO_TYPES = %w[audio/aac audio/mp4 audio/mpeg audio/amr audio/ogg].freeze
18
+ DOCUMENT_TYPES = %w[
19
+ text/plain application/pdf application/vnd.ms-powerpoint application/msword application/vnd.ms-excel
20
+ application/vnd.openxmlformats-officedocument.wordprocessingml.document
21
+ application/vnd.openxmlformats-officedocument.presentationml.presentation
22
+ application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
23
+ ].freeze
24
+ IMAGE_TYPES = %w[image/jpeg image/png].freeze
25
+ VIDEO_TYPES = %w[video/mp4 video/3gp].freeze
26
+
27
+ SUPPORTED_MEDIA_TYPES = [AUDIO_TYPES + DOCUMENT_TYPES + IMAGE_TYPES + VIDEO_TYPES].flatten.freeze
28
+ end
29
+ end
30
+ end
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module WhatsappSdk
5
- VERSION = "0.8.0"
5
+ VERSION = "0.9.1"
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: whatsapp_sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - ignacio-chiazzo
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-03-17 00:00:00.000000000 Z
11
+ date: 2023-04-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -191,6 +191,7 @@ files:
191
191
  - lib/whatsapp_sdk/resource/interactive_footer.rb
192
192
  - lib/whatsapp_sdk/resource/interactive_header.rb
193
193
  - lib/whatsapp_sdk/resource/media.rb
194
+ - lib/whatsapp_sdk/resource/media_types.rb
194
195
  - lib/whatsapp_sdk/resource/message.rb
195
196
  - lib/whatsapp_sdk/resource/name.rb
196
197
  - lib/whatsapp_sdk/resource/org.rb