ree_lib 1.0.49 → 1.0.50

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +4 -3
  3. data/lib/ree_lib/Packages.schema.json +4 -0
  4. data/lib/ree_lib/packages/ree_actions/spec/ree_actions/dsl_spec.rb +17 -10
  5. data/lib/ree_lib/packages/ree_dao/Package.schema.json +10 -0
  6. data/lib/ree_lib/packages/ree_dao/package/ree_dao/aggregate_dsl.rb +26 -0
  7. data/lib/ree_lib/packages/ree_dao/package/ree_dao/association.rb +311 -0
  8. data/lib/ree_lib/packages/ree_dao/package/ree_dao/associations.rb +148 -0
  9. data/lib/ree_lib/packages/ree_dao/package/ree_dao/beans/dao_cache.rb +40 -19
  10. data/lib/ree_lib/packages/ree_dao/package/ree_dao/contract/dao_dataset_contract.rb +15 -0
  11. data/lib/ree_lib/packages/ree_dao/package/ree_dao/contract/entity_contract.rb +15 -0
  12. data/lib/ree_lib/packages/ree_dao/package/ree_dao/dataset_extensions.rb +4 -0
  13. data/lib/ree_lib/packages/ree_dao/package/ree_dao/dsl.rb +1 -1
  14. data/lib/ree_lib/packages/ree_dao/package/ree_dao/functions/build_pg_connection.rb +1 -0
  15. data/lib/ree_lib/packages/ree_dao/package/ree_dao/functions/build_sqlite_connection.rb +1 -0
  16. data/lib/ree_lib/packages/ree_dao/package/ree_dao/functions/drop_cache.rb +1 -1
  17. data/lib/ree_lib/packages/ree_dao/package/ree_dao/functions/init_cache.rb +1 -1
  18. data/lib/ree_lib/packages/ree_dao/package/ree_dao/functions/load_agg.rb +63 -0
  19. data/lib/ree_lib/packages/ree_dao/package/ree_dao/thread_parents.rb +40 -0
  20. data/lib/ree_lib/packages/ree_dao/package/ree_dao.rb +9 -0
  21. data/lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/build_pg_connection.schema.json +1 -1
  22. data/lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/build_sqlite_connection.schema.json +1 -1
  23. data/lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/load_agg.schema.json +43 -0
  24. data/lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/load_agg/load_agg_benchmark_spec.rb +414 -0
  25. data/lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/load_agg/load_agg_spec.rb +605 -0
  26. data/lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/load_agg/ree_dao_load_agg_test.rb +524 -0
  27. data/lib/ree_lib/packages/ree_logger/package/ree_logger/multi_logger.rb +19 -10
  28. data/lib/ree_lib/packages/ree_logger/spec/ree_logger/multi_logger_spec.rb +10 -0
  29. data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/mapper_factory_proxy.rb +6 -3
  30. data/lib/ree_lib/packages/ree_std/.gitignore +0 -0
  31. data/lib/ree_lib/packages/ree_std/.rspec +2 -0
  32. data/lib/ree_lib/packages/ree_std/Package.schema.json +24 -0
  33. data/lib/ree_lib/packages/ree_std/bin/console +5 -0
  34. data/lib/ree_lib/packages/ree_std/package/ree_std/functions/retry_on_fail.rb +46 -0
  35. data/lib/ree_lib/packages/ree_std/package/ree_std/retry.rb +67 -0
  36. data/lib/ree_lib/packages/ree_std/package/ree_std.rb +6 -0
  37. data/lib/ree_lib/packages/ree_std/schemas/ree_std/functions/retry_on_fail.schema.json +38 -0
  38. data/lib/ree_lib/packages/ree_std/spec/package_schema_spec.rb +14 -0
  39. data/lib/ree_lib/packages/ree_std/spec/ree_std/functions/retry_on_fail_spec.rb +97 -0
  40. data/lib/ree_lib/packages/ree_std/spec/spec_helper.rb +3 -0
  41. data/lib/ree_lib/packages/ree_swagger/package/ree_swagger/functions/build_request_body_schema.rb +5 -0
  42. data/lib/ree_lib/packages/ree_swagger/package/ree_swagger/functions/build_serializer_schema.rb +5 -0
  43. data/lib/ree_lib/packages/ree_swagger/spec/functions/build_endpoint_schema_spec.rb +4 -2
  44. data/lib/ree_lib/packages/ree_swagger/spec/functions/build_request_body_spec.rb +4 -2
  45. data/lib/ree_lib/version.rb +1 -1
  46. metadata +38 -2
@@ -0,0 +1,524 @@
1
+ Ree.enable_irb_mode
2
+
3
+ module ReeDaoLoadAggTest
4
+ include Ree::PackageDSL
5
+
6
+ package do
7
+ depends_on :ree_dao
8
+ depends_on :ree_array
9
+ depends_on :ree_string
10
+ depends_on :ree_hash
11
+ end
12
+ end
13
+
14
+ class ReeDaoLoadAggTest::Db
15
+ include Ree::BeanDSL
16
+
17
+ DB_CONFIG = {
18
+ host: "localhost",
19
+ user: "postgres",
20
+ database: "postgres",
21
+ password: "password",
22
+ adapter: "postgres",
23
+ max_connections: 100
24
+ }.freeze
25
+
26
+ bean :db do
27
+ singleton
28
+ factory :build
29
+
30
+ link :build_pg_connection, from: :ree_dao
31
+ end
32
+
33
+ def build
34
+ build_pg_connection(DB_CONFIG)
35
+ end
36
+ end
37
+
38
+ class ReeDaoLoadAggTest::Organization
39
+ include ReeDto::EntityDSL
40
+
41
+ properties(
42
+ id: Nilor[Integer],
43
+ name: String
44
+ )
45
+
46
+ def set_users(users)
47
+ @users = users
48
+ end
49
+
50
+ def users
51
+ @users ||= []
52
+ end
53
+
54
+ attr_accessor :name
55
+ end
56
+
57
+
58
+ class ReeDaoLoadAggTest::User
59
+ include ReeDto::EntityDSL
60
+
61
+ properties(
62
+ id: Nilor[Integer],
63
+ name: String,
64
+ age: Integer,
65
+ organization_id: Integer
66
+ )
67
+
68
+ def set_organization(org)
69
+ @organization = org
70
+ end
71
+
72
+ def organization
73
+ @organization
74
+ end
75
+
76
+ def set_passport(passport)
77
+ @passport = passport
78
+ end
79
+
80
+ def passport
81
+ @passport
82
+ end
83
+
84
+ [
85
+ :organization,
86
+ :passport,
87
+ :books,
88
+ :movies,
89
+ :videogames,
90
+ :hobbies,
91
+ :vinyls,
92
+ :pets,
93
+ :skills,
94
+ :dreams,
95
+ :custom_field
96
+ ].each do |attr|
97
+ define_method("set_#{attr}") do |*args|
98
+ instance_variable_set("@#{attr}", *args)
99
+ end
100
+
101
+ define_method("#{attr}") do
102
+ instance_variable_get("@#{attr}")
103
+ end
104
+ end
105
+
106
+ attr_accessor :name, :age, :organization_id
107
+ end
108
+
109
+
110
+ class ReeDaoLoadAggTest::UserPassport
111
+ include ReeDto::EntityDSL
112
+
113
+ properties(
114
+ id: Nilor[Integer],
115
+ user_id: Integer,
116
+ info: Nilor[String]
117
+ )
118
+
119
+ attr_accessor :info, :user_id
120
+ end
121
+
122
+ class ReeDaoLoadAggTest::Movie
123
+ include ReeDto::EntityDSL
124
+
125
+ properties(
126
+ id: Nilor[Integer],
127
+ user_id: Integer,
128
+ title: Nilor[String]
129
+ )
130
+ end
131
+
132
+ class ReeDaoLoadAggTest::Videogame
133
+ include ReeDto::EntityDSL
134
+
135
+ properties(
136
+ id: Nilor[Integer],
137
+ user_id: Integer,
138
+ title: Nilor[String]
139
+ )
140
+ end
141
+
142
+ class ReeDaoLoadAggTest::Hobby
143
+ include ReeDto::EntityDSL
144
+
145
+ properties(
146
+ id: Nilor[Integer],
147
+ user_id: Integer,
148
+ title: Nilor[String]
149
+ )
150
+ end
151
+
152
+ class ReeDaoLoadAggTest::Vinyl
153
+ include ReeDto::EntityDSL
154
+
155
+ properties(
156
+ id: Nilor[Integer],
157
+ user_id: Integer,
158
+ title: Nilor[String]
159
+ )
160
+ end
161
+
162
+ class ReeDaoLoadAggTest::Pet
163
+ include ReeDto::EntityDSL
164
+
165
+ properties(
166
+ id: Nilor[Integer],
167
+ user_id: Integer,
168
+ name: Nilor[String]
169
+ )
170
+ end
171
+
172
+ class ReeDaoLoadAggTest::Skill
173
+ include ReeDto::EntityDSL
174
+
175
+ properties(
176
+ id: Nilor[Integer],
177
+ user_id: Integer,
178
+ title: Nilor[String]
179
+ )
180
+ end
181
+
182
+ class ReeDaoLoadAggTest::Dream
183
+ include ReeDto::EntityDSL
184
+
185
+ properties(
186
+ id: Nilor[Integer],
187
+ user_id: Integer,
188
+ description: Nilor[String]
189
+ )
190
+ end
191
+
192
+ class ReeDaoLoadAggTest::Book
193
+ include ReeDto::EntityDSL
194
+
195
+ properties(
196
+ id: Nilor[Integer],
197
+ user_id: Integer,
198
+ title: Nilor[String]
199
+ )
200
+
201
+ def set_chapters(chapters)
202
+ @chapters = chapters; nil
203
+ end
204
+
205
+ def chapters
206
+ @chapters
207
+ end
208
+
209
+ def set_author(author)
210
+ @author = author
211
+ end
212
+
213
+ def author
214
+ @author
215
+ end
216
+
217
+ def set_reviews(reviews)
218
+ @reviews = reviews; nil
219
+ end
220
+
221
+ def reviews
222
+ @reviews
223
+ end
224
+
225
+ attr_accessor :title, :user_id
226
+ end
227
+
228
+ class ReeDaoLoadAggTest::Chapter
229
+ include ReeDto::EntityDSL
230
+
231
+ properties(
232
+ id: Nilor[Integer],
233
+ book_id: Integer,
234
+ title: Nilor[String]
235
+ )
236
+
237
+ attr_accessor :title, :book_id
238
+ end
239
+
240
+ class ReeDaoLoadAggTest::Author
241
+ include ReeDto::EntityDSL
242
+
243
+ properties(
244
+ id: Nilor[Integer],
245
+ book_id: Integer,
246
+ name: Nilor[String]
247
+ )
248
+
249
+ attr_accessor :name, :book_id
250
+ end
251
+
252
+ class ReeDaoLoadAggTest::Review
253
+ include ReeDto::EntityDSL
254
+
255
+ properties(
256
+ id: Nilor[Integer],
257
+ book_id: Integer,
258
+ rating: Nilor[Integer]
259
+ )
260
+
261
+ def set_review_author(review_author)
262
+ @review_author = review_author
263
+ end
264
+
265
+ def review_author
266
+ @review_author
267
+ end
268
+
269
+ attr_accessor :rating, :book_id
270
+ end
271
+
272
+ class ReeDaoLoadAggTest::ReviewAuthor
273
+ include ReeDto::EntityDSL
274
+
275
+ properties(
276
+ id: Nilor[Integer],
277
+ review_id: Integer,
278
+ name: String
279
+ )
280
+ end
281
+
282
+ class ReeDaoLoadAggTest::Users
283
+ include ReeDao::DSL
284
+
285
+ dao :users do
286
+ link :db
287
+ end
288
+
289
+ table :users
290
+
291
+ schema ReeDaoLoadAggTest::User do
292
+ integer :id, null: true
293
+ integer :organization_id
294
+ string :name
295
+ integer :age
296
+ end
297
+
298
+ filter :by_name, -> (name) { where(name: name) }
299
+ end
300
+
301
+ class ReeDaoLoadAggTest::Organizations
302
+ include ReeDao::DSL
303
+
304
+ dao :organizations do
305
+ link :db
306
+ end
307
+
308
+ table :organizations
309
+
310
+ schema ReeDaoLoadAggTest::Organization do
311
+ integer :id, null: true
312
+ string :name
313
+ end
314
+
315
+ filter :by_name, -> (name) { where(name: name) }
316
+ end
317
+
318
+ class ReeDaoLoadAggTest::UserPassports
319
+ include ReeDao::DSL
320
+
321
+ dao :user_passports do
322
+ link :db
323
+ end
324
+
325
+ table :user_passports
326
+
327
+ schema ReeDaoLoadAggTest::UserPassport do
328
+ integer :id, null: true
329
+ integer :user_id
330
+ string :info
331
+ end
332
+ end
333
+
334
+ class ReeDaoLoadAggTest::Movies
335
+ include ReeDao::DSL
336
+
337
+ dao :movies do
338
+ link :db
339
+ end
340
+
341
+ table :movies
342
+
343
+ schema ReeDaoLoadAggTest::Movie do
344
+ integer :id, null: true
345
+ integer :user_id
346
+ string :title
347
+ end
348
+ end
349
+
350
+ class ReeDaoLoadAggTest::Videogames
351
+ include ReeDao::DSL
352
+
353
+ dao :videogames do
354
+ link :db
355
+ end
356
+
357
+ table :videogames
358
+
359
+ schema ReeDaoLoadAggTest::Videogame do
360
+ integer :id, null: true
361
+ integer :user_id
362
+ string :title
363
+ end
364
+ end
365
+
366
+ class ReeDaoLoadAggTest::Hobbies
367
+ include ReeDao::DSL
368
+
369
+ dao :hobbies do
370
+ link :db
371
+ end
372
+
373
+ table :hobbies
374
+
375
+ schema ReeDaoLoadAggTest::Hobby do
376
+ integer :id, null: true
377
+ integer :user_id
378
+ string :title
379
+ end
380
+ end
381
+
382
+ class ReeDaoLoadAggTest::Vinyls
383
+ include ReeDao::DSL
384
+
385
+ dao :vinyls do
386
+ link :db
387
+ end
388
+
389
+ table :vinyls
390
+
391
+ schema ReeDaoLoadAggTest::Vinyl do
392
+ integer :id, null: true
393
+ integer :user_id
394
+ string :title
395
+ end
396
+ end
397
+
398
+ class ReeDaoLoadAggTest::Pets
399
+ include ReeDao::DSL
400
+
401
+ dao :pets do
402
+ link :db
403
+ end
404
+
405
+ table :pets
406
+
407
+ schema ReeDaoLoadAggTest::Pet do
408
+ integer :id, null: true
409
+ integer :user_id
410
+ string :name
411
+ end
412
+ end
413
+
414
+ class ReeDaoLoadAggTest::Skills
415
+ include ReeDao::DSL
416
+
417
+ dao :skills do
418
+ link :db
419
+ end
420
+
421
+ table :skills
422
+
423
+ schema ReeDaoLoadAggTest::Skill do
424
+ integer :id, null: true
425
+ integer :user_id
426
+ string :title
427
+ end
428
+ end
429
+
430
+ class ReeDaoLoadAggTest::Dreams
431
+ include ReeDao::DSL
432
+
433
+ dao :dreams do
434
+ link :db
435
+ end
436
+
437
+ table :dreams
438
+
439
+ schema ReeDaoLoadAggTest::Dream do
440
+ integer :id, null: true
441
+ integer :user_id
442
+ string :description
443
+ end
444
+ end
445
+
446
+ class ReeDaoLoadAggTest::Books
447
+ include ReeDao::DSL
448
+
449
+ dao :books do
450
+ link :db
451
+ end
452
+
453
+ table :books
454
+
455
+ schema ReeDaoLoadAggTest::Book do
456
+ integer :id, null: true
457
+ integer :user_id
458
+ string :title
459
+ end
460
+ end
461
+
462
+ class ReeDaoLoadAggTest::Chapters
463
+ include ReeDao::DSL
464
+
465
+ dao :chapters do
466
+ link :db
467
+ end
468
+
469
+ table :chapters
470
+
471
+ schema ReeDaoLoadAggTest::Chapter do
472
+ integer :id, null: true
473
+ integer :book_id
474
+ string :title
475
+ end
476
+ end
477
+
478
+ class ReeDaoLoadAggTest::Authors
479
+ include ReeDao::DSL
480
+
481
+ dao :authors do
482
+ link :db
483
+ end
484
+
485
+ table :authors
486
+
487
+ schema ReeDaoLoadAggTest::Author do
488
+ integer :id, null: true
489
+ integer :book_id
490
+ string :name
491
+ end
492
+ end
493
+
494
+ class ReeDaoLoadAggTest::Reviews
495
+ include ReeDao::DSL
496
+
497
+ dao :reviews do
498
+ link :db
499
+ end
500
+
501
+ table :reviews
502
+
503
+ schema ReeDaoLoadAggTest::Review do
504
+ integer :id, null: true
505
+ integer :book_id
506
+ integer :rating
507
+ end
508
+ end
509
+
510
+ class ReeDaoLoadAggTest::ReviewAuthors
511
+ include ReeDao::DSL
512
+
513
+ dao :review_authors do
514
+ link :db
515
+ end
516
+
517
+ table :review_authors
518
+
519
+ schema ReeDaoLoadAggTest::ReviewAuthor do
520
+ integer :id, null: true
521
+ integer :review_id
522
+ string :name
523
+ end
524
+ end
@@ -60,7 +60,7 @@ class ReeLogger::MultiLogger < Logger
60
60
  contract(Nilor[String], Hash, Nilor[Exception], Bool, Nilor[String], Optblock => nil)
61
61
  def debug(message = nil, parameters = {}, exception = nil, log_args = false, progname = nil, &block)
62
62
  if block_given?
63
- log(:debug, yield, parameters, nil, log_args)
63
+ log_block(:debug, parameters, log_args, yield)
64
64
  else
65
65
  msg = get_message(message)
66
66
  log(:debug, msg, parameters, nil, log_args)
@@ -68,9 +68,9 @@ class ReeLogger::MultiLogger < Logger
68
68
  end
69
69
 
70
70
  contract(Nilor[String], Hash, Nilor[Exception], Bool, Nilor[String], Optblock => nil)
71
- def info(message = nil, parameters = {}, exception = nil, log_args = false, progname = nil, &block)
71
+ def info(message = nil, parameters = {}, exception = nil, log_args = false, progname = nil, &block)
72
72
  if block_given?
73
- log(:info, yield, parameters, nil, log_args)
73
+ log_block(:info, parameters, log_args, yield)
74
74
  else
75
75
  msg = get_message(message)
76
76
  log(:info, msg, parameters, nil)
@@ -78,9 +78,9 @@ class ReeLogger::MultiLogger < Logger
78
78
  end
79
79
 
80
80
  contract(Nilor[String], Hash, Nilor[Exception], Bool, Nilor[String], Optblock => nil)
81
- def warn(message = nil, parameters = {}, exception = nil, log_args = false, progname = nil, &block)
81
+ def warn(message = nil, parameters = {}, exception = nil, log_args = false, progname = nil, &block)
82
82
  if block_given?
83
- log(:warn, yield, parameters, nil, log_args)
83
+ log_block(:warn, parameters, log_args, yield)
84
84
  else
85
85
  msg = get_message(message)
86
86
  log(:warn, msg, parameters, nil)
@@ -90,7 +90,7 @@ class ReeLogger::MultiLogger < Logger
90
90
  contract(Nilor[String], Hash, Nilor[Exception], Bool, Nilor[String], Optblock => nil)
91
91
  def error(message = nil, parameters = {}, exception = nil, log_args = true, progname = nil, &block)
92
92
  if block_given?
93
- log(:error, yield, parameters, exception, log_args)
93
+ log_block(:error, parameters, log_args, yield)
94
94
  else
95
95
  msg = get_message(message)
96
96
  log(:error, msg, parameters, exception, log_args)
@@ -98,25 +98,34 @@ class ReeLogger::MultiLogger < Logger
98
98
  end
99
99
 
100
100
  contract(Nilor[String], Hash, Nilor[Exception], Bool, Nilor[String], Optblock => nil)
101
- def fatal(message = nil, parameters = {}, exception = nil, log_args = true, progname = nil, &block)
101
+ def fatal(message = nil, parameters = {}, exception = nil, log_args = true, progname = nil, &block)
102
102
  if block_given?
103
- log(:error, yield, parameters, exception, log_args)
103
+ log_block(:fatal, parameters, log_args, yield)
104
104
  else
105
105
  msg = get_message(message)
106
- log(:error, msg, parameters, exception, log_args)
106
+ log(:fatal, msg, parameters, exception, log_args)
107
107
  end
108
108
  end
109
109
 
110
110
  contract(Nilor[String], Hash, Nilor[Exception], Bool, Nilor[String], Optblock => nil)
111
111
  def unknown(message = nil, parameters = {}, exception = nil, log_args = true, progname = nil, &block)
112
112
  if block_given?
113
- log(:unknown, yield, parameters, exception, log_args)
113
+ log_block(:unknown, parameters, log_args, yield)
114
114
  else
115
115
  msg = get_message(message)
116
116
  log(:unknown, msg, parameters, exception, log_args)
117
117
  end
118
118
  end
119
119
 
120
+ contract(Symbol, Hash, Bool, Or[Hash, String] => nil)
121
+ def log_block(error, parameters, log_args, block_parameters)
122
+ if block_parameters.is_a?(Hash)
123
+ log(error, "", block_parameters.merge(parameters), nil, log_args)
124
+ else
125
+ log(error, block_parameters, parameters, nil, log_args)
126
+ end
127
+ end
128
+
120
129
  contract(Symbol, String, Hash, Nilor[Exception], Bool => nil)
121
130
  def log(level, message, parameters = {}, exception = nil, log_args = false)
122
131
  if @rate_limiter
@@ -142,4 +142,14 @@ RSpec.describe ReeLogger::MultiLogger do
142
142
  end
143
143
  }.to_not output.to_stdout
144
144
  }
145
+
146
+ it {
147
+ expect {
148
+ logger_with_appenders.info("some info message", { email: 'some@email.com }'}) do
149
+ {
150
+ name: "John"
151
+ }
152
+ end
153
+ }.to output(/John/).to_stdout
154
+ }
145
155
  end
@@ -33,9 +33,12 @@ class ReeMapper::MapperFactoryProxy
33
33
  return self unless blk
34
34
 
35
35
  mapper = ReeMapper::Mapper.build(strategies)
36
-
37
- mapper_factory.register_mapper(register_as, mapper) if register_as
38
-
36
+
37
+ if register_as
38
+ mapper_factory.register_mapper(register_as, mapper)
39
+ mapper = mapper_factory.types.fetch(register_as).last
40
+ end
41
+
39
42
  mapper_factory.new(mapper).instance_exec(&blk)
40
43
  mapper.prepare_dto
41
44
 
File without changes
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
@@ -0,0 +1,24 @@
1
+ {
2
+ "schema_type": "package",
3
+ "schema_version": "1.1",
4
+ "name": "ree_std",
5
+ "entry_path": "packages/ree_std/package/ree_std.rb",
6
+ "tags": [
7
+ "ree_std"
8
+ ],
9
+ "depends_on": [
10
+
11
+ ],
12
+ "env_vars": [
13
+
14
+ ],
15
+ "objects": [
16
+ {
17
+ "name": "retry_on_fail",
18
+ "schema": "packages/ree_std/schemas/ree_std/functions/retry_on_fail.schema.json",
19
+ "tags": [
20
+ "fn"
21
+ ]
22
+ }
23
+ ]
24
+ }
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ require "bundler/setup"
3
+ require "ree"
4
+
5
+ Ree.init(__dir__, irb: true)
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ReeStd::RetryOnFail
4
+ include Ree::FnDSL
5
+
6
+ fn :retry_on_fail do
7
+ link "ree_std/retry", -> { Retry }
8
+ end
9
+
10
+ doc(<<~DOC)
11
+ ## **Ruby Function: retry_on_fail**
12
+
13
+ This function allows you to execute a provided block of code and automatically retry it in case a specific exception occurs.
14
+
15
+ rubyCopy code
16
+
17
+ `x = 0 retry_on_fail(max: 2, retry_block: ->(attempt, e) { x += 1 } ) { 1 / x }`
18
+
19
+ ## **Parameters**
20
+
21
+ * **max** (Integer, required): Specifies the maximum number of retry attempts.
22
+ * **interval** (Integer, optional, default: 1): Sets the base delay between retry attempts in seconds.
23
+ * **max_interval** (Integer, optional, default: Float::INFINITY): Defines the upper limit for the delay between retry attempts.
24
+ * **backoff_factor** (Integer, optional, default: 1): Determines the increasing factor for the delay based on the attempt number.
25
+ * **exceptions** (StandardError[], optional, default: [StandardError]): Specifies a list of exceptions that should trigger a retry.
26
+ * **retry_block** (Proc, optional, default: **Proc.new {|attempt_number, exception|}**): Allows you to provide a custom block of code to be executed after a failed attempt.
27
+ * **retry_if** (Proc, optional, default: **Proc.new { |exception| true }**): Provides an additional condition that must be satisfied before initiating a new retry attempt.
28
+ DOC
29
+ contract(
30
+ Kwargs[
31
+ max: Integer,
32
+ ],
33
+ Ksplat[
34
+ interval?: Integer,
35
+ max_interval?: Integer,
36
+ backoff_factor?: Integer,
37
+ exceptions?: ArrayOf[SubclassOf[StandardError]],
38
+ retry_block?: Proc,
39
+ retry_if?: Proc,
40
+ ],
41
+ Block => nil
42
+ )
43
+ def call(max:, **opts, &block)
44
+ Retry.new(max: max, **opts).call(&block)
45
+ end
46
+ end