zerobounceindia-sdk 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/zerobounce.rb ADDED
@@ -0,0 +1,370 @@
1
+
2
+ # frozen_string_literal: true
3
+
4
+ require 'date'
5
+
6
+ require 'zerobounce/error'
7
+ require 'zerobounce/version'
8
+ require 'zerobounce/request'
9
+ require 'zerobounce/mock_request'
10
+ require 'zerobounce/configuration'
11
+
12
+ # Validate an email address with Zerobounce.net
13
+ module Zerobounce
14
+
15
+ API_ROOT_URL = 'https://api.zerobounce.in/v2'
16
+ BULK_API_ROOT_URL = 'https://bulkapi.zerobounce.in/v2'
17
+
18
+ class << self
19
+ attr_writer :configuration
20
+
21
+ @@request = ENV['TEST']=='unit' ? MockRequest : Request
22
+
23
+ # Zerobounce configuration
24
+ #
25
+ # @return [Zerobounce::Configuration]
26
+ def configuration
27
+ @configuration ||= Configuration.new
28
+ end
29
+ alias config configuration
30
+
31
+ # Configure Zerobounce inside a block.
32
+ #
33
+ # @example
34
+ # Zerobounce.configure do |config|
35
+ # config.apikey = 'api-key'
36
+ # end
37
+ #
38
+ # @yieldparam [Zerobounce::Configuration] config
39
+ def configure
40
+ yield configuration
41
+ end
42
+
43
+ # Validates the email address and gets geoip information for an IP if provided.
44
+ #
45
+ # @param [String] :email The email address to validate.
46
+ # @option [String] :ip_address IP address corresponding to the email.
47
+ #
48
+ # @return [Hash]
49
+ # {
50
+ # "address": "valid@example.com",
51
+ # "status": "valid",
52
+ # "sub_status": "",
53
+ # "free_email": false,
54
+ # "did_you_mean": null,
55
+ # "account": null,
56
+ # "domain": null,
57
+ # "domain_age_days": "9692",
58
+ # "smtp_provider": "example",
59
+ # "mx_found": "true",
60
+ # "mx_record": "mx.example.com",
61
+ # "firstname": "zero",
62
+ # "lastname": "bounce",
63
+ # "gender": "male",
64
+ # "country": null,
65
+ # "region": null,
66
+ # "city": null,
67
+ # "zipcode": null,
68
+ # "processed_at": "2023-04-18 12:09:39.074"
69
+ # }
70
+ def validate(email, ip_address=nil)
71
+ params = {email: email, ip_address: ip_address}
72
+ @@request.get('validate', params)
73
+ end
74
+
75
+ # Get the number of remaining credits on the account.
76
+ #
77
+ # @return [Integer] amount of credits left
78
+ def credits()
79
+ json = @@request.get('getcredits', {})
80
+ credits = json['Credits']
81
+ credits_i = credits.to_i
82
+ return credits_i
83
+ end
84
+
85
+ # Convenience method for checking if an email address is valid.
86
+ #
87
+ # @param [String] email
88
+ # @return [Boolean]
89
+ # def valid?(email)
90
+ # # todo:
91
+ # validate(email: email).valid?
92
+ # end
93
+
94
+ # Convenience method for checking if an email address is invalid.
95
+ #
96
+ # @param [String] email
97
+ # @return [Boolean]
98
+ # def invalid?(email)
99
+ # # todo:
100
+ # validate(email: email).invalid?
101
+ # end
102
+
103
+ # Get API usage
104
+ #
105
+ # @param [Date] start_date
106
+ # @param [Date] end_date
107
+ #
108
+ # @return [Hash]
109
+ # {
110
+ # "total": 5,
111
+ # "status_valid": 4,
112
+ # "status_invalid": 1,
113
+ # "status_catch_all": 0,
114
+ # "status_do_not_mail": 0,
115
+ # "status_spamtrap": 0,
116
+ # "status_unknown": 0,
117
+ # "sub_status_toxic": 0,
118
+ # "sub_status_disposable": 0,
119
+ # "sub_status_role_based": 0,
120
+ # "sub_status_possible_trap": 0,
121
+ # "sub_status_global_suppression": 0,
122
+ # "sub_status_timeout_exceeded": 0,
123
+ # "sub_status_mail_server_temporary_error": 0,
124
+ # "sub_status_mail_server_did_not_respond": 0,
125
+ # "sub_status_greylisted": 0,
126
+ # "sub_status_antispam_system": 0,
127
+ # "sub_status_does_not_accept_mail": 0,
128
+ # "sub_status_exception_occurred": 0,
129
+ # "sub_status_failed_syntax_check": 1,
130
+ # "sub_status_mailbox_not_found": 0,
131
+ # "sub_status_unroutable_ip_address": 0,
132
+ # "sub_status_possible_typo": 0,
133
+ # "sub_status_no_dns_entries": 0,
134
+ # "sub_status_role_based_catch_all": 0,
135
+ # "sub_status_mailbox_quota_exceeded": 0,
136
+ # "sub_status_forcible_disconnect": 0,
137
+ # "sub_status_failed_smtp_connection": 0,
138
+ # "sub_status_mx_forward": 0,
139
+ # "sub_status_alternate": 0,
140
+ # "sub_status_blocked": 0,
141
+ # "sub_status_allowed": 0,
142
+ # "start_date": "1/1/2018",
143
+ # "end_date": "12/12/2023"
144
+ # }
145
+ def api_usage(start_date, end_date)
146
+ begin
147
+ start_date_f = start_date.strftime('%Y-%m-%d')
148
+ end_date_f = end_date.strftime('%Y-%m-%d')
149
+ rescue NoMethodError => e
150
+ raise ArgumentError.new('strftime method not found for provided arguments')
151
+ end
152
+ params = {start_date: start_date_f, end_date: end_date_f}
153
+ @@request.get('getapiusage', params)
154
+ end
155
+
156
+ # Validate email batch
157
+ #
158
+ # @param [Array] :emails List of email addresses to validate.
159
+ # @option [Array] :ip_addresses Corresponding list of IP addresses.
160
+ #
161
+ # @return [Array] list of validate result for each element
162
+ # [
163
+ # {
164
+ # "address": "disposable@example.com",
165
+ # "status": "do_not_mail",
166
+ # "sub_status": "disposable",
167
+ # "free_email": false,
168
+ # "did_you_mean": null,
169
+ # "account": null,
170
+ # "domain": null,
171
+ # "domain_age_days": "9692",
172
+ # "smtp_provider": "example",
173
+ # "mx_found": "true",
174
+ # "mx_record": "mx.example.com",
175
+ # "firstname": "zero",
176
+ # "lastname": "bounce",
177
+ # "gender": "male",
178
+ # "country": null,
179
+ # "region": null,
180
+ # "city": null,
181
+ # "zipcode": null,
182
+ # "processed_at": "2023-04-18 12:27:39.529"
183
+ # },
184
+ # {
185
+ # ...
186
+ # },
187
+ # ...
188
+ # ]
189
+ def validate_batch(emails, ip_addresses=[])
190
+
191
+ raise ArgumentError.new if emails.class != Array
192
+ emails.each do |email|
193
+ raise ArgumentError if email.class != String
194
+ end
195
+
196
+ email_batch = []
197
+ emails.each_index do |i|
198
+ email_batch.push({
199
+ email_address: emails[i],
200
+ ip_address: ip_addresses[i]
201
+ })
202
+ end
203
+ params = {email_batch: email_batch}
204
+ results = @@request.bulk_post('validatebatch', params)
205
+ return results['email_batch']
206
+ end
207
+
208
+ # Validate CSV file
209
+ #
210
+ # @param [String] :filepath Path to the file to be uploaded
211
+ # @option [Int] :email_address_column Specify which column the email address is on
212
+ # @option [Int] :first_name_column Specify which column the first name is on
213
+ # @option [Int] :last_name_column Specify which column the last name is on
214
+ # @option [Int] :gender_column Specify which column the gender is on
215
+ # @option [Int] :has_header_row Specify whether the file includes a header row or not
216
+ # @option [Int] :return_url Specify a callback URL (if nil, no callback will be performed)
217
+ #
218
+ # @return [Hash]
219
+ # {
220
+ # "success": true,
221
+ # "message": "File Accepted",
222
+ # "file_name": "zerobounce-batch-validation.csv",
223
+ # "file_id": "6d44a908-7283-42a9-aa5f-9e57b16f84bd"
224
+ # }
225
+ def validate_file_send(
226
+ filepath,
227
+ email_address_column: 1,
228
+ first_name_column: 2,
229
+ last_name_column: 3,
230
+ gender_column: 4,
231
+ has_header_row: true,
232
+ return_url: nil
233
+ )
234
+ params = {
235
+ email_address_column: email_address_column,
236
+ first_name_column: first_name_column,
237
+ last_name_column: last_name_column,
238
+ gender_column: gender_column,
239
+ has_header_row: has_header_row,
240
+ }
241
+ params[:return_url] = return_url if return_url
242
+ @@request.bulk_post('sendfile', params, 'multipart/form-data', filepath)
243
+ end
244
+
245
+ # Get validate file status
246
+ #
247
+ # @param [String] :file_id Id of the file.
248
+ #
249
+ # @return [Hash]
250
+ # {
251
+ # "success": true,
252
+ # "file_id": "6d44a908-7283-42a9-aa5f-9e57b16f84bd",
253
+ # "file_name": "zerobounce-batch-validation.csv",
254
+ # "upload_date": "2023-04-18T14:40:08Z",
255
+ # "file_status": "Complete",
256
+ # "complete_percentage": "100%",
257
+ # "error_reason": null,
258
+ # "return_url": null
259
+ # }
260
+ def validate_file_check(file_id)
261
+ # todo:
262
+ params = {file_id: file_id}
263
+ @@request.bulk_get('filestatus', params)
264
+ end
265
+
266
+ # Get validate results file
267
+ #
268
+ # @param [String] :file_id Id of the file.
269
+ #
270
+ # @return [String/File?]
271
+ def validate_file_get(file_id)
272
+ # todo:
273
+ params = {file_id: file_id}
274
+ @@request.bulk_get('getfile', params)
275
+ end
276
+
277
+ # Delete validate file
278
+ #
279
+ # @param file_id Id of the file.
280
+ #
281
+ # @return [Hash]
282
+ # {
283
+ # "success": true,
284
+ # "message": "File Deleted",
285
+ # "file_name": "zerobounce-batch-validation.csv",
286
+ # "file_id": "6d44a908-7283-42a9-aa5f-9e57b16f84bd"
287
+ # }
288
+ def validate_file_delete(file_id)
289
+ # todo:
290
+ params = {file_id: file_id}
291
+ @@request.bulk_get('deletefile', params)
292
+ end
293
+
294
+ # Score CSV file
295
+ #
296
+ # @param [String] :filepath Path to the file to be uploaded
297
+ # @option [Int] :email_address_column Specify which column the email address is on
298
+ # @option [Int] :has_header_row Specify whether the file includes a header row or not
299
+ # @option [Int] :return_url Specify a callback URL (if nil, no callback will be performed)
300
+ #
301
+ # @return [Hash]
302
+ # {
303
+ # "success": true,
304
+ # "message": "File Accepted",
305
+ # "file_name": "zerobounce-ai-scoring.csv",
306
+ # "file_id": "6d44a908-7283-42a9-aa5f-9e57b16f84bd"
307
+ # }
308
+ def scoring_file_send(
309
+ filepath,
310
+ email_address_column: 1,
311
+ has_header_row: true,
312
+ return_url: nil
313
+ )
314
+ params = {
315
+ email_address_column: email_address_column,
316
+ has_header_row: has_header_row,
317
+ }
318
+ params[:return_url] = return_url if return_url
319
+ @@request.bulk_post('scoring/sendfile', params, 'multipart/form-data', filepath)
320
+ end
321
+
322
+ # Get validate results file
323
+ #
324
+ # @param [String] :file_id Id of the file.
325
+ #
326
+ # @return [String/File?]
327
+ def scoring_file_get(file_id)
328
+ # todo:
329
+ params = {file_id: file_id}
330
+ @@request.bulk_get('scoring/getfile', params)
331
+ end
332
+
333
+ # Get validate file status
334
+ #
335
+ # @param [String] :file_id Id of the file.
336
+ #
337
+ # @return [Hash]
338
+ # {
339
+ # "success": true,
340
+ # "file_id": "d391b463-cb56-4fb3-a9c0-9817653ff725",
341
+ # "file_name": "zerobounce-ai-scoring.csv",
342
+ # "upload_date": "2023-04-18T15:13:56Z",
343
+ # "file_status": "Complete",
344
+ # "complete_percentage": "100% Complete.",
345
+ # "return_url": null
346
+ # }
347
+ def scoring_file_check(file_id)
348
+ params = {file_id: file_id}
349
+ @@request.bulk_get('scoring/filestatus', params)
350
+ end
351
+
352
+ # Delete validate file
353
+ #
354
+ # @param file_id Id of the file.
355
+ #
356
+ # @return [Hash]
357
+ # {
358
+ # "success": true,
359
+ # "message": "File Deleted",
360
+ # "file_name": "zerobounce-ai-scoring.csv",
361
+ # "file_id": "6d44a908-7283-42a9-aa5f-9e57b16f84bd"
362
+ # }
363
+ def scoring_file_delete(file_id)
364
+ # todo:
365
+ params = {file_id: file_id}
366
+ @@request.bulk_get('scoring/deletefile', params)
367
+ end
368
+
369
+ end
370
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'zerobounce/version'
6
+
7
+ Gem::Specification.new do |spec| # rubocop:disable Metrics/BlockLength
8
+ spec.name = 'zerobounceindia-sdk'
9
+ spec.version = Zerobounce::VERSION
10
+ spec.authors = ['Zero Bounce India']
11
+ spec.email = ['integrations@zerobounce.net']
12
+
13
+ spec.summary = 'A Ruby client for Zerobounce.in.'
14
+ spec.description = 'A Ruby client for Zerobounce.in.'
15
+ spec.homepage = 'https://zerobounce.in'
16
+ spec.license = 'MIT'
17
+
18
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
19
+ f.match(%r{^(test|spec|features)/})
20
+ end
21
+ spec.bindir = 'exe'
22
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
+ spec.require_paths = ['lib']
24
+
25
+ spec.metadata['yard.run'] = 'yri' # use "yard" to build full HTML docs.
26
+
27
+ spec.required_ruby_version = '>= 2.5'
28
+
29
+ spec.add_dependency 'rest-client', '~>2.1'
30
+
31
+ spec.add_development_dependency 'bundler', '~> 2.4.6'
32
+ spec.add_development_dependency 'pry', '~> 0.14.1'
33
+ spec.add_development_dependency 'rake', '~> 13.0'
34
+ spec.add_development_dependency 'rspec', '~> 3.0'
35
+ spec.add_development_dependency 'rspec_junit_formatter', '~> 0.4.1'
36
+ spec.add_development_dependency 'rubocop', '~> 1.15'
37
+ spec.add_development_dependency 'rubocop-performance', '~> 1.11', '>= 1.11.3'
38
+ spec.add_development_dependency 'rubocop-rake', '~> 0.5.1'
39
+ spec.add_development_dependency 'rubocop-rspec', '~> 2.3'
40
+ spec.add_development_dependency 'simplecov', '~> 0.21.2'
41
+ spec.add_development_dependency 'yard', '~> 0.9.26'
42
+ spec.add_development_dependency 'webmock', '~> 3.18'
43
+ spec.add_development_dependency 'vcr', '~> 6.1.0'
44
+ end
metadata ADDED
@@ -0,0 +1,276 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: zerobounceindia-sdk
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.0
5
+ platform: ruby
6
+ authors:
7
+ - Zero Bounce India
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2023-05-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rest-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 2.4.6
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 2.4.6
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.14.1
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.14.1
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '13.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '13.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec_junit_formatter
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.4.1
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.4.1
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.15'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.15'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop-performance
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.11'
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: 1.11.3
121
+ type: :development
122
+ prerelease: false
123
+ version_requirements: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - "~>"
126
+ - !ruby/object:Gem::Version
127
+ version: '1.11'
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: 1.11.3
131
+ - !ruby/object:Gem::Dependency
132
+ name: rubocop-rake
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: 0.5.1
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: 0.5.1
145
+ - !ruby/object:Gem::Dependency
146
+ name: rubocop-rspec
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '2.3'
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: '2.3'
159
+ - !ruby/object:Gem::Dependency
160
+ name: simplecov
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: 0.21.2
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: 0.21.2
173
+ - !ruby/object:Gem::Dependency
174
+ name: yard
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: 0.9.26
180
+ type: :development
181
+ prerelease: false
182
+ version_requirements: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - "~>"
185
+ - !ruby/object:Gem::Version
186
+ version: 0.9.26
187
+ - !ruby/object:Gem::Dependency
188
+ name: webmock
189
+ requirement: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - "~>"
192
+ - !ruby/object:Gem::Version
193
+ version: '3.18'
194
+ type: :development
195
+ prerelease: false
196
+ version_requirements: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - "~>"
199
+ - !ruby/object:Gem::Version
200
+ version: '3.18'
201
+ - !ruby/object:Gem::Dependency
202
+ name: vcr
203
+ requirement: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - "~>"
206
+ - !ruby/object:Gem::Version
207
+ version: 6.1.0
208
+ type: :development
209
+ prerelease: false
210
+ version_requirements: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - "~>"
213
+ - !ruby/object:Gem::Version
214
+ version: 6.1.0
215
+ description: A Ruby client for Zerobounce.in.
216
+ email:
217
+ - integrations@zerobounce.net
218
+ executables: []
219
+ extensions: []
220
+ extra_rdoc_files: []
221
+ files:
222
+ - ".env.sample"
223
+ - ".gitignore"
224
+ - ".rspec"
225
+ - ".ruby-version"
226
+ - CHANGELOG.md
227
+ - CODE_OF_CONDUCT.md
228
+ - CONTRIBUTING.md
229
+ - Gemfile
230
+ - Gemfile.lock
231
+ - LICENSE
232
+ - LICENSE.txt
233
+ - README.md
234
+ - Rakefile
235
+ - bin/bundle
236
+ - bin/console
237
+ - bin/setup
238
+ - data/zerobounce-ai-scoring.csv
239
+ - data/zerobounce-batch-validation.csv
240
+ - files/scoring.csv
241
+ - files/validation.csv
242
+ - files/zerobounce-ai-scoring.csv
243
+ - files/zerobounce-batch-validation.csv
244
+ - lib/zerobounce.rb
245
+ - lib/zerobounce/base_request.rb
246
+ - lib/zerobounce/configuration.rb
247
+ - lib/zerobounce/error.rb
248
+ - lib/zerobounce/mock_request.rb
249
+ - lib/zerobounce/request.rb
250
+ - lib/zerobounce/version.rb
251
+ - zerobounce.gemspec
252
+ homepage: https://zerobounce.in
253
+ licenses:
254
+ - MIT
255
+ metadata:
256
+ yard.run: yri
257
+ post_install_message:
258
+ rdoc_options: []
259
+ require_paths:
260
+ - lib
261
+ required_ruby_version: !ruby/object:Gem::Requirement
262
+ requirements:
263
+ - - ">="
264
+ - !ruby/object:Gem::Version
265
+ version: '2.5'
266
+ required_rubygems_version: !ruby/object:Gem::Requirement
267
+ requirements:
268
+ - - ">="
269
+ - !ruby/object:Gem::Version
270
+ version: '0'
271
+ requirements: []
272
+ rubygems_version: 3.4.6
273
+ signing_key:
274
+ specification_version: 4
275
+ summary: A Ruby client for Zerobounce.in.
276
+ test_files: []