ree_lib 1.0.49 → 1.0.50

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.
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