whatsapp_sdk 0.0.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +8 -2
- data/CHANGELOG.md +18 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +6 -1
- data/README.md +80 -70
- data/example.rb +200 -0
- data/lib/version.rb +1 -1
- data/lib/whatsapp_sdk/api/client.rb +28 -8
- data/lib/whatsapp_sdk/api/medias.rb +101 -0
- data/lib/whatsapp_sdk/api/messages.rb +169 -22
- data/lib/whatsapp_sdk/api/phone_numbers.rb +16 -4
- data/lib/whatsapp_sdk/api/request.rb +8 -2
- data/lib/whatsapp_sdk/api/response.rb +7 -10
- data/lib/whatsapp_sdk/api/responses/error_response.rb +10 -19
- data/lib/whatsapp_sdk/api/responses/media_data_response.rb +29 -0
- data/lib/whatsapp_sdk/api/responses/message_error_response.rb +30 -0
- data/lib/whatsapp_sdk/api/responses/read_message_data_response.rb +27 -0
- data/lib/whatsapp_sdk/api/responses/success_response.rb +26 -0
- data/lib/whatsapp_sdk/resource/button_parameter.rb +65 -0
- data/lib/whatsapp_sdk/resource/component.rb +85 -0
- data/lib/whatsapp_sdk/resource/currency.rb +36 -0
- data/lib/whatsapp_sdk/resource/date_time.rb +22 -0
- data/lib/whatsapp_sdk/resource/media.rb +86 -0
- data/lib/whatsapp_sdk/resource/parameter_object.rb +134 -0
- data/lib/whatsapp_sdk.rb +12 -1
- data/tmp/whatsapp.png +0 -0
- data/whatsapp_sdk.gemspec +3 -1
- metadata +30 -2
@@ -0,0 +1,85 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module WhatsappSdk
|
4
|
+
module Resource
|
5
|
+
class Component
|
6
|
+
class InvalidField < StandardError
|
7
|
+
attr_reader :field, :message
|
8
|
+
|
9
|
+
def initialize(field, message)
|
10
|
+
@field = field
|
11
|
+
@message = message
|
12
|
+
super(message)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
module Type
|
17
|
+
HEADER = 'header'
|
18
|
+
BODY = 'body'
|
19
|
+
BUTTON = 'button'
|
20
|
+
end
|
21
|
+
|
22
|
+
module Subtype
|
23
|
+
QUICK_REPLY = "quick_reply"
|
24
|
+
URL = "url"
|
25
|
+
end
|
26
|
+
|
27
|
+
# Returns the Component type.
|
28
|
+
#
|
29
|
+
# @returns type [String]. Supported Options are header, body and button.
|
30
|
+
attr_accessor :type
|
31
|
+
|
32
|
+
# Returns the parameters of the component. For button type, it's required.
|
33
|
+
#
|
34
|
+
# @returns parameter [Array<ButtonParameter, ParameterObject>] .
|
35
|
+
attr_accessor :parameters
|
36
|
+
|
37
|
+
# Returns the Type of button to create. Required when type=button. Not used for the other types.
|
38
|
+
# Supported Options
|
39
|
+
# quick_reply: Refers to a previously created quick reply button
|
40
|
+
# that allows for the customer to return a predefined message.
|
41
|
+
# url: Refers to a previously created button that allows the customer to visit the URL generated by
|
42
|
+
# appending the text parameter to the predefined prefix URL in the template.
|
43
|
+
#
|
44
|
+
# @returns subtype [String]. Valid options are quick_reply and url.
|
45
|
+
attr_accessor :sub_type
|
46
|
+
|
47
|
+
# Required when type=button. Not used for the other types.
|
48
|
+
# Position index of the button. You can have up to 3 buttons using index values of 0 to 2.
|
49
|
+
#
|
50
|
+
# @returns index [Integer].
|
51
|
+
attr_accessor :index
|
52
|
+
|
53
|
+
def add_parameter(parameter)
|
54
|
+
@parameters << parameter
|
55
|
+
end
|
56
|
+
|
57
|
+
def initialize(type:, parameters: [], sub_type: nil, index: nil)
|
58
|
+
@parameters = parameters
|
59
|
+
@type = type
|
60
|
+
@sub_type = sub_type
|
61
|
+
@index = index.nil? && type == Type::BUTTON ? 0 : index
|
62
|
+
validate_fields
|
63
|
+
end
|
64
|
+
|
65
|
+
def to_json(*_args)
|
66
|
+
json = {
|
67
|
+
type: type,
|
68
|
+
parameters: parameters.map(&:to_json)
|
69
|
+
}
|
70
|
+
json[:sub_type] = sub_type if sub_type
|
71
|
+
json[:index] = index if index
|
72
|
+
json
|
73
|
+
end
|
74
|
+
|
75
|
+
private
|
76
|
+
|
77
|
+
def validate_fields
|
78
|
+
return if type == Type::BUTTON
|
79
|
+
raise InvalidField.new(:sub_type, 'sub_type is not required when type is not button') if sub_type
|
80
|
+
|
81
|
+
raise InvalidField.new(:index, 'index is not required when type is not button') if index
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module WhatsappSdk
|
4
|
+
module Resource
|
5
|
+
class Currency
|
6
|
+
# Returns default text if localization fails.
|
7
|
+
#
|
8
|
+
# @returns fallback_value [String].
|
9
|
+
attr_accessor :fallback_value
|
10
|
+
|
11
|
+
# Currency code as defined in ISO 4217.
|
12
|
+
#
|
13
|
+
# @returns code [String].
|
14
|
+
attr_accessor :code
|
15
|
+
|
16
|
+
# Amount multiplied by 1000.
|
17
|
+
#
|
18
|
+
# @returns code [Float].
|
19
|
+
attr_accessor :amount
|
20
|
+
|
21
|
+
def initialize(fallback_value:, code:, amount:)
|
22
|
+
@fallback_value = fallback_value
|
23
|
+
@code = code
|
24
|
+
@amount = amount
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_json(*_args)
|
28
|
+
{
|
29
|
+
fallback_value: fallback_value,
|
30
|
+
code: code,
|
31
|
+
amount_1000: amount
|
32
|
+
}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module WhatsappSdk
|
4
|
+
module Resource
|
5
|
+
class DateTime
|
6
|
+
# Returns default text if localization fails.
|
7
|
+
#
|
8
|
+
# @returns fallback_value [String].
|
9
|
+
attr_accessor :fallback_value
|
10
|
+
|
11
|
+
def initialize(fallback_value:)
|
12
|
+
@fallback_value = fallback_value
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_json(*_args)
|
16
|
+
{
|
17
|
+
fallback_value: fallback_value
|
18
|
+
}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module WhatsappSdk
|
4
|
+
module Resource
|
5
|
+
class Media
|
6
|
+
class InvalidMedia < StandardError
|
7
|
+
attr_reader :field, :message
|
8
|
+
|
9
|
+
def initialize(field, message)
|
10
|
+
@field = field
|
11
|
+
@message = message
|
12
|
+
super(message)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# Returns media id.
|
17
|
+
#
|
18
|
+
# @returns id [String].
|
19
|
+
attr_accessor :id
|
20
|
+
|
21
|
+
module Type
|
22
|
+
AUDIO = 'audio'
|
23
|
+
DOCUMENT = 'document'
|
24
|
+
IMAGE = 'image'
|
25
|
+
VIDEO = 'video'
|
26
|
+
STICKER = 'sticker'
|
27
|
+
|
28
|
+
VALID_TYPES = [AUDIO, DOCUMENT, IMAGE, VIDEO, STICKER].freeze
|
29
|
+
end
|
30
|
+
|
31
|
+
# @returns type [String]. Valid options ar audio, document, image, video and sticker.
|
32
|
+
attr_accessor :type
|
33
|
+
|
34
|
+
# The protocol and URL of the media to be sent. Use only with HTTP/HTTPS URLs.
|
35
|
+
# Do not use this field when the message type is set to text.
|
36
|
+
#
|
37
|
+
# @returns link [String].
|
38
|
+
attr_accessor :link
|
39
|
+
|
40
|
+
# Describes the specified document or image media.
|
41
|
+
#
|
42
|
+
# @returns caption [String].
|
43
|
+
attr_accessor :caption
|
44
|
+
|
45
|
+
# Describes the filename for the specific document. Use only with document media.
|
46
|
+
#
|
47
|
+
# @returns filename [String].
|
48
|
+
attr_accessor :filename
|
49
|
+
|
50
|
+
def initialize(type:, id: nil, link: nil, caption: nil, filename: nil)
|
51
|
+
@type = type
|
52
|
+
@id = id
|
53
|
+
@link = link
|
54
|
+
@caption = caption
|
55
|
+
@filename = filename
|
56
|
+
validate_media
|
57
|
+
end
|
58
|
+
|
59
|
+
def to_json(*_args)
|
60
|
+
json = {}
|
61
|
+
json[:id] = id unless id.nil?
|
62
|
+
json[:link] = link unless link.nil?
|
63
|
+
json[:caption] = caption unless caption.nil?
|
64
|
+
json[:filename] = filename unless filename.nil?
|
65
|
+
json
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def validate_media
|
71
|
+
unless Type::VALID_TYPES.include?(type)
|
72
|
+
raise InvalidMedia.new(:type, "invalid type. type should be audio, document, image, video or sticker")
|
73
|
+
end
|
74
|
+
if filename && (type != Type::DOCUMENT)
|
75
|
+
raise InvalidMedia.new(:filename, "filename can only be used with document")
|
76
|
+
end
|
77
|
+
|
78
|
+
if caption && !(type == Type::DOCUMENT || type == Type::IMAGE)
|
79
|
+
raise InvalidMedia.new(:caption, "caption can only be used with document or image")
|
80
|
+
end
|
81
|
+
|
82
|
+
true
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module WhatsappSdk
|
4
|
+
module Resource
|
5
|
+
class ParameterObject
|
6
|
+
class InvalidType < StandardError
|
7
|
+
attr_accessor :message
|
8
|
+
|
9
|
+
def initialize(type)
|
10
|
+
@message = "invalid type #{type}. type should be text, currency, date_time, image, document or video"
|
11
|
+
super
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class MissingValue < StandardError
|
16
|
+
attr_reader :field, :message
|
17
|
+
|
18
|
+
def initialize(field, message)
|
19
|
+
@field = field
|
20
|
+
@message = message
|
21
|
+
super(message)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Returns the parameter type.
|
26
|
+
#
|
27
|
+
# @returns type [String] Valid options are text, currency, date_time, image, document, video.
|
28
|
+
attr_accessor :type
|
29
|
+
|
30
|
+
module Type
|
31
|
+
TEXT = "text"
|
32
|
+
CURRENCY = "currency"
|
33
|
+
DATE_TIME = "date_time"
|
34
|
+
IMAGE = "image"
|
35
|
+
DOCUMENT = "document"
|
36
|
+
VIDEO = "video"
|
37
|
+
|
38
|
+
VALID_TYPES = [TEXT, CURRENCY, DATE_TIME, IMAGE, DOCUMENT, VIDEO].freeze
|
39
|
+
end
|
40
|
+
|
41
|
+
# Returns Text string if the parameter object type is text.
|
42
|
+
# For the header component, the character limit is 60 characters.
|
43
|
+
# For the body component, the character limit is 1024 characters.
|
44
|
+
#
|
45
|
+
# @returns text [String]
|
46
|
+
attr_accessor :text
|
47
|
+
|
48
|
+
# Returns Currency if the parameter object type is currency.
|
49
|
+
#
|
50
|
+
# @returns currency [Currency]
|
51
|
+
attr_accessor :currency
|
52
|
+
|
53
|
+
# Returns date_time if the parameter object type is date_time.
|
54
|
+
#
|
55
|
+
# @returns date_time [DateTime]
|
56
|
+
attr_accessor :date_time
|
57
|
+
|
58
|
+
# Returns image if the parameter object type is image.
|
59
|
+
#
|
60
|
+
# @returns image [Media]
|
61
|
+
attr_accessor :image
|
62
|
+
|
63
|
+
# Returns document if the parameter object type is document.
|
64
|
+
#
|
65
|
+
# @returns document [Media]
|
66
|
+
attr_accessor :document
|
67
|
+
|
68
|
+
# Returns video if the parameter object type is video.
|
69
|
+
#
|
70
|
+
# @returns video [Media]
|
71
|
+
attr_accessor :video
|
72
|
+
|
73
|
+
def initialize(type:, text: nil, currency: nil, date_time: nil, image: nil, document: nil, video: nil)
|
74
|
+
@type = type
|
75
|
+
@text = text
|
76
|
+
@currency = currency
|
77
|
+
@date_time = date_time
|
78
|
+
@image = image
|
79
|
+
@document = document
|
80
|
+
@video = video
|
81
|
+
validate
|
82
|
+
end
|
83
|
+
|
84
|
+
def to_json(*_args)
|
85
|
+
json = { type: type }
|
86
|
+
json[type.to_sym] = case type
|
87
|
+
when "text"
|
88
|
+
text
|
89
|
+
when "currency"
|
90
|
+
currency.to_json
|
91
|
+
when "date_time"
|
92
|
+
date_time.to_json
|
93
|
+
when "image"
|
94
|
+
image.to_json
|
95
|
+
when "document"
|
96
|
+
document.to_json
|
97
|
+
when "video"
|
98
|
+
video.to_json
|
99
|
+
else
|
100
|
+
raise "Invalid type: #{type}"
|
101
|
+
end
|
102
|
+
|
103
|
+
json
|
104
|
+
end
|
105
|
+
|
106
|
+
private
|
107
|
+
|
108
|
+
def validate
|
109
|
+
validate_attributes
|
110
|
+
validate_type
|
111
|
+
end
|
112
|
+
|
113
|
+
def validate_type
|
114
|
+
return if Type::VALID_TYPES.include?(type)
|
115
|
+
|
116
|
+
raise InvalidType, type
|
117
|
+
end
|
118
|
+
|
119
|
+
def validate_attributes
|
120
|
+
[
|
121
|
+
[:text, text],
|
122
|
+
[:currency, currency],
|
123
|
+
[:date_time, date_time],
|
124
|
+
[:image, image],
|
125
|
+
[:document, document],
|
126
|
+
[:video, video]
|
127
|
+
].each do |type_sym, value|
|
128
|
+
next unless type == type_sym
|
129
|
+
raise MissingValue.new(type, "#{type} is required when the type is #{type}") if value.nil?
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
data/lib/whatsapp_sdk.rb
CHANGED
@@ -3,22 +3,33 @@
|
|
3
3
|
# APIs
|
4
4
|
require_relative "whatsapp_sdk/api/phone_numbers"
|
5
5
|
require_relative "whatsapp_sdk/api/messages"
|
6
|
+
require_relative "whatsapp_sdk/api/medias"
|
6
7
|
require_relative "whatsapp_sdk/api/client"
|
7
8
|
|
8
9
|
# APIs responses
|
9
10
|
require_relative "whatsapp_sdk/api/responses/message_data_response"
|
10
11
|
require_relative "whatsapp_sdk/api/responses/phone_number_data_response"
|
11
12
|
require_relative "whatsapp_sdk/api/responses/phone_numbers_data_response"
|
12
|
-
require_relative "whatsapp_sdk/api/responses/
|
13
|
+
require_relative "whatsapp_sdk/api/responses/message_error_response"
|
13
14
|
require_relative "whatsapp_sdk/api/responses/data_response"
|
15
|
+
require_relative "whatsapp_sdk/api/responses/read_message_data_response"
|
16
|
+
require_relative "whatsapp_sdk/api/responses/media_data_response"
|
17
|
+
require_relative "whatsapp_sdk/api/responses/success_response"
|
18
|
+
require_relative "whatsapp_sdk/api/responses/error_response"
|
14
19
|
|
15
20
|
# Resources
|
16
21
|
require_relative "whatsapp_sdk/resource/address"
|
22
|
+
require_relative "whatsapp_sdk/resource/button_parameter"
|
23
|
+
require_relative "whatsapp_sdk/resource/component"
|
17
24
|
require_relative "whatsapp_sdk/resource/contact_response"
|
18
25
|
require_relative "whatsapp_sdk/resource/contact"
|
26
|
+
require_relative "whatsapp_sdk/resource/currency"
|
27
|
+
require_relative "whatsapp_sdk/resource/date_time"
|
19
28
|
require_relative "whatsapp_sdk/resource/email"
|
29
|
+
require_relative "whatsapp_sdk/resource/media"
|
20
30
|
require_relative "whatsapp_sdk/resource/message"
|
21
31
|
require_relative "whatsapp_sdk/resource/name"
|
22
32
|
require_relative "whatsapp_sdk/resource/org"
|
33
|
+
require_relative "whatsapp_sdk/resource/parameter_object"
|
23
34
|
require_relative "whatsapp_sdk/resource/phone_number"
|
24
35
|
require_relative "whatsapp_sdk/resource/url"
|
data/tmp/whatsapp.png
ADDED
Binary file
|
data/whatsapp_sdk.gemspec
CHANGED
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.metadata["changelog_uri"] = "https://github.com/ignacio-chiazzo/whatsapp_sdk/blob/main/CHANGELOG.md"
|
25
25
|
else
|
26
26
|
raise "RubyGems 2.0 or newer is required to protect against " \
|
27
|
-
|
27
|
+
"public gem pushes."
|
28
28
|
end
|
29
29
|
|
30
30
|
# Specify which files should be added to the gem when it is released.
|
@@ -41,5 +41,7 @@ Gem::Specification.new do |spec|
|
|
41
41
|
spec.add_development_dependency "rake", "~> 10.0"
|
42
42
|
|
43
43
|
spec.add_dependency("faraday", "~> 2.3.0")
|
44
|
+
spec.add_dependency("faraday-multipart", "~> 1.0.4")
|
44
45
|
spec.add_dependency("oj", "~> 3.13.13")
|
46
|
+
spec.metadata['rubygems_mfa_required'] = 'true'
|
45
47
|
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.0
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ignacio-chiazzo
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-06-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 2.3.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: faraday-multipart
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 1.0.4
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.0.4
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: oj
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -102,28 +116,41 @@ files:
|
|
102
116
|
- Rakefile
|
103
117
|
- bin/console
|
104
118
|
- bin/setup
|
119
|
+
- example.rb
|
105
120
|
- lib/version.rb
|
106
121
|
- lib/whatsapp_sdk.rb
|
107
122
|
- lib/whatsapp_sdk/api/client.rb
|
123
|
+
- lib/whatsapp_sdk/api/medias.rb
|
108
124
|
- lib/whatsapp_sdk/api/messages.rb
|
109
125
|
- lib/whatsapp_sdk/api/phone_numbers.rb
|
110
126
|
- lib/whatsapp_sdk/api/request.rb
|
111
127
|
- lib/whatsapp_sdk/api/response.rb
|
112
128
|
- lib/whatsapp_sdk/api/responses/data_response.rb
|
113
129
|
- lib/whatsapp_sdk/api/responses/error_response.rb
|
130
|
+
- lib/whatsapp_sdk/api/responses/media_data_response.rb
|
114
131
|
- lib/whatsapp_sdk/api/responses/message_data_response.rb
|
132
|
+
- lib/whatsapp_sdk/api/responses/message_error_response.rb
|
115
133
|
- lib/whatsapp_sdk/api/responses/phone_number_data_response.rb
|
116
134
|
- lib/whatsapp_sdk/api/responses/phone_numbers_data_response.rb
|
135
|
+
- lib/whatsapp_sdk/api/responses/read_message_data_response.rb
|
136
|
+
- lib/whatsapp_sdk/api/responses/success_response.rb
|
117
137
|
- lib/whatsapp_sdk/error.rb
|
118
138
|
- lib/whatsapp_sdk/resource/address.rb
|
139
|
+
- lib/whatsapp_sdk/resource/button_parameter.rb
|
140
|
+
- lib/whatsapp_sdk/resource/component.rb
|
119
141
|
- lib/whatsapp_sdk/resource/contact.rb
|
120
142
|
- lib/whatsapp_sdk/resource/contact_response.rb
|
143
|
+
- lib/whatsapp_sdk/resource/currency.rb
|
144
|
+
- lib/whatsapp_sdk/resource/date_time.rb
|
121
145
|
- lib/whatsapp_sdk/resource/email.rb
|
146
|
+
- lib/whatsapp_sdk/resource/media.rb
|
122
147
|
- lib/whatsapp_sdk/resource/message.rb
|
123
148
|
- lib/whatsapp_sdk/resource/name.rb
|
124
149
|
- lib/whatsapp_sdk/resource/org.rb
|
150
|
+
- lib/whatsapp_sdk/resource/parameter_object.rb
|
125
151
|
- lib/whatsapp_sdk/resource/phone_number.rb
|
126
152
|
- lib/whatsapp_sdk/resource/url.rb
|
153
|
+
- tmp/whatsapp.png
|
127
154
|
- whatsapp_sdk.gemspec
|
128
155
|
homepage: https://github.com/ignacio-chiazzo/whatsapp_sdk
|
129
156
|
licenses:
|
@@ -132,6 +159,7 @@ metadata:
|
|
132
159
|
homepage_uri: https://github.com/ignacio-chiazzo/whatsapp_sdk
|
133
160
|
source_code_uri: https://github.com/ignacio-chiazzo/whatsapp_sdk
|
134
161
|
changelog_uri: https://github.com/ignacio-chiazzo/whatsapp_sdk/blob/main/CHANGELOG.md
|
162
|
+
rubygems_mfa_required: 'true'
|
135
163
|
post_install_message:
|
136
164
|
rdoc_options: []
|
137
165
|
require_paths:
|