zerobounceindia-sdk 0.4.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.
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: []