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,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ReeStd::Retry
4
+ contract(
5
+ Kwargs[
6
+ max: Integer,
7
+ ],
8
+ Ksplat[
9
+ interval?: Integer,
10
+ max_interval?: Integer,
11
+ backoff_factor?: Integer,
12
+ exceptions?: ArrayOf[SubclassOf[StandardError]],
13
+ retry_block?: Proc,
14
+ retry_if?: Proc,
15
+ ] => Any
16
+ )
17
+ def initialize(max:, **opts)
18
+ @max = max
19
+ @current_attempt = 0
20
+
21
+ @interval = opts.fetch(:interval, 1)
22
+ @max_interval = opts.fetch(:max_interval, Float::INFINITY)
23
+ @backoff_factor = opts.fetch(:backoff_factor, 1)
24
+
25
+ @exceptions = opts.fetch(:exceptions) { [StandardError].freeze }
26
+ @retry_block = opts.fetch(:retry_block, Proc.new {})
27
+ @retry_if = opts.fetch(:retry_if, Proc.new { true })
28
+ end
29
+
30
+ contract(
31
+ Block => Any
32
+ )
33
+ def call(&block)
34
+ block.call
35
+ rescue => e
36
+ raise unless match_error?(e)
37
+ raise unless has_attempts?
38
+
39
+ @retry_block.call(@current_attempt, e)
40
+
41
+ Kernel.sleep(calculate_retry_interval)
42
+
43
+ increment_attemt!
44
+ retry
45
+ end
46
+
47
+ private
48
+
49
+ def has_attempts?
50
+ @current_attempt < @max
51
+ end
52
+
53
+ def increment_attemt!
54
+ @current_attempt += 1
55
+ end
56
+
57
+ def calculate_retry_interval
58
+ current_interval = @interval * (@backoff_factor ** @current_attempt)
59
+
60
+ [@max_interval, current_interval].min
61
+ end
62
+
63
+ def match_error?(e)
64
+ puts @retry_if.call(e)
65
+ @retry_if.call(e) && @exceptions.any? { e.is_a? _1 }
66
+ end
67
+ end
@@ -0,0 +1,6 @@
1
+ module ReeStd
2
+ include Ree::PackageDSL
3
+
4
+ package do
5
+ end
6
+ end
@@ -0,0 +1,38 @@
1
+ {
2
+ "schema_type": "object",
3
+ "schema_version": "1.1",
4
+ "name": "retry_on_fail",
5
+ "path": "packages/ree_std/package/ree_std/functions/retry_on_fail.rb",
6
+ "mount_as": "fn",
7
+ "class": "ReeStd::RetryOnFail",
8
+ "factory": null,
9
+ "methods": [
10
+ {
11
+ "doc": "## **Ruby Function: retry_on_fail**\n\nThis function allows you to execute a provided block of code and automatically retry it in case a specific exception occurs.\n\nrubyCopy code\n\n`x = 0 retry_on_fail(max: 2, retry_block: ->(attempt, e) { x += 1 } ) { 1 / x }`\n\n## **Parameters**\n\n* **max** (Integer, required): Specifies the maximum number of retry attempts.\n* **interval** (Integer, optional, default: 1): Sets the base delay between retry attempts in seconds.\n* **max_interval** (Integer, optional, default: Float::INFINITY): Defines the upper limit for the delay between retry attempts.\n* **backoff_factor** (Integer, optional, default: 1): Determines the increasing factor for the delay based on the attempt number.\n* **exceptions** (StandardError[], optional, default: [StandardError]): Specifies a list of exceptions that should trigger a retry.\n* **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.\n* **retry_if** (Proc, optional, default: **Proc.new { |exception| true }**): Provides an additional condition that must be satisfied before initiating a new retry attempt.",
12
+ "throws": [
13
+
14
+ ],
15
+ "return": "Any",
16
+ "args": [
17
+ {
18
+ "arg": "max",
19
+ "arg_type": "keyreq",
20
+ "type": "Integer"
21
+ },
22
+ {
23
+ "arg": "opts",
24
+ "arg_type": "keyrest",
25
+ "type": "Ksplat[:interval? => Integer, :max_interval? => Integer, :backoff_factor? => Integer, :exceptions? => ArrayOf[SubclassOf[StandardError]], :retry_block? => Proc, :retry_if? => Proc]"
26
+ },
27
+ {
28
+ "arg": "block",
29
+ "arg_type": "block",
30
+ "type": "Block"
31
+ }
32
+ ]
33
+ }
34
+ ],
35
+ "links": [
36
+
37
+ ]
38
+ }
@@ -0,0 +1,14 @@
1
+ RSpec.describe "ReeStd" do
2
+ it "generates package schema" do
3
+ require 'fileutils'
4
+
5
+ packages_schema_path = Ree.locate_packages_schema(__dir__)
6
+ packages_schema_dir = Pathname.new(packages_schema_path).dirname.to_s
7
+
8
+ FileUtils.cd packages_schema_dir do
9
+ expect(
10
+ system("bundle exec ree gen.package_json ree_std --silence")
11
+ ).to eq(true)
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe :retry_on_fail do
4
+ link :retry_on_fail, from: :ree_std
5
+
6
+ SampleException = Class.new(StandardError)
7
+ YetAnotherException = Class.new(StandardError)
8
+
9
+ class TestRetryProcedure
10
+ def initialize(failed_count: 0, raise_error:)
11
+ @failed_count = failed_count
12
+ @raise_error = raise_error
13
+ @current_attempt = 0
14
+ end
15
+
16
+ def call
17
+ unless succeed?
18
+ @current_attempt += 1
19
+ raise @raise_error
20
+ end
21
+ end
22
+
23
+ def succeed?
24
+ @current_attempt > @failed_count
25
+ end
26
+ end
27
+
28
+ describe "handles specific exception" do
29
+ let(:procedure) { TestRetryProcedure.new(failed_count: 1, raise_error: SampleException.new("sample exception message")) }
30
+
31
+ before(:each) do
32
+ @message = nil
33
+
34
+ retry_on_fail(
35
+ max: 2,
36
+ exceptions: [SampleException],
37
+ retry_block: ->(attempt, e) { @message = "Attempt ##{attempt}: '#{e.message}'" },
38
+ ) { procedure.call }
39
+ end
40
+
41
+ it "should reach succeed case if failed count is less than max retries" do
42
+ expect(procedure.succeed?).to be true
43
+ end
44
+
45
+ it "should execute :retry_block" do
46
+ expect(@message).to eq("Attempt #1: 'sample exception message'")
47
+ end
48
+ end
49
+
50
+ describe "when max attempts was reached" do
51
+ let(:procedure) { TestRetryProcedure.new(failed_count: 3, raise_error: SampleException) }
52
+
53
+ it "raises error" do
54
+ expect {
55
+ retry_on_fail(
56
+ max: 2,
57
+ retry_if: ->(e) { e.is_a?(SampleException) && e.message == 'sample exception message' }
58
+ ) { procedure.call }
59
+ }.to raise_error(SampleException)
60
+ end
61
+ end
62
+
63
+ describe "when handle another exception" do
64
+ let(:procedure) { TestRetryProcedure.new(failed_count: 1, raise_error: YetAnotherException) }
65
+
66
+ it "raises error" do
67
+ expect {
68
+ retry_on_fail(
69
+ max: 2,
70
+ exceptions: [SampleException],
71
+ ) { procedure.call }
72
+ }.to raise_error(YetAnotherException)
73
+ end
74
+ end
75
+
76
+ describe ":retry_if parameter" do
77
+ let(:procedure) { TestRetryProcedure.new(failed_count: 1, raise_error: SampleException) }
78
+
79
+ it "checks positive case" do
80
+ expect {
81
+ retry_on_fail(
82
+ max: 2,
83
+ retry_if: ->(e) { e.class == SampleException }
84
+ ) { procedure.call }
85
+ }.not_to raise_error
86
+ end
87
+
88
+ it "checks negative case" do
89
+ expect {
90
+ retry_on_fail(
91
+ max: 2,
92
+ retry_if: ->(e) { e.class == YetAnotherException }
93
+ ) { procedure.call }
94
+ }.to raise_error(SampleException)
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,3 @@
1
+ RSpec.configure do |config|
2
+ config.extend Ree::RSpecLinkDSL
3
+ end
@@ -24,6 +24,11 @@ class ReeSwagger::BuildRequestBodySchema
24
24
 
25
25
  next if path_params.include?(field.name)
26
26
 
27
+ if field.type == mapper
28
+ acc[field.name] = {}
29
+ next
30
+ end
31
+
27
32
  swagger_field = {}
28
33
 
29
34
  required_fields << field.name.to_s if !field.optional
@@ -16,6 +16,11 @@ class ReeSwagger::BuildSerializerSchema
16
16
  properties = mapper.fields.each_with_object({}) do |(_name, field), acc|
17
17
  next unless fields_filters.all? { _1.allow?(field.name) }
18
18
 
19
+ if field.type == mapper
20
+ acc[field.name] = {}
21
+ next
22
+ end
23
+
19
24
  swagger_field = {}
20
25
 
21
26
  field_mapper = field.type
@@ -44,8 +44,9 @@ RSpec.describe :build_endpoint_schema do
44
44
 
45
45
  ReeSwaggerTest::Locales.register_as_swagger_type
46
46
 
47
- serializer = mapper_factory.call.use(:serialize) do
47
+ serializer = mapper_factory.call(register_as: :obj).use(:serialize) do
48
48
  integer :id
49
+ obj :prev_obj, null: true
49
50
  end
50
51
 
51
52
  _tag_caster = mapper_factory.call(register_as: :tag).use(:cast) do
@@ -133,7 +134,8 @@ RSpec.describe :build_endpoint_schema do
133
134
  schema: {
134
135
  type: 'object',
135
136
  properties: {
136
- id: { type: 'integer' }
137
+ id: { type: 'integer' },
138
+ prev_obj: {}
137
139
  }
138
140
  }
139
141
  }
@@ -14,10 +14,11 @@ RSpec.describe :build_request_body_schema_spec do
14
14
  }
15
15
 
16
16
  it {
17
- caster = mapper_factory.call.use(:cast) do
17
+ caster = mapper_factory.call(register_as: :user).use(:cast) do
18
18
  string :name
19
19
  string :email
20
20
  string? :last_name
21
+ user :friend
21
22
  end
22
23
 
23
24
  schema = {
@@ -25,7 +26,8 @@ RSpec.describe :build_request_body_schema_spec do
25
26
  properties: {
26
27
  name: { type: "string" },
27
28
  email: { type: "string" },
28
- last_name: { type: "string" }
29
+ last_name: { type: "string" },
30
+ friend: {}
29
31
  },
30
32
  required: ["name", "email"]
31
33
  }
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ReeLib
4
- VERSION = "1.0.49"
4
+ VERSION = "1.0.50"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ree_lib
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.49
4
+ version: 1.0.50
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ruslan Gatiyatov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-05-31 00:00:00.000000000 Z
11
+ date: 2023-06-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ree
@@ -220,6 +220,20 @@ dependencies:
220
220
  - - "~>"
221
221
  - !ruby/object:Gem::Version
222
222
  version: 3.3.1
223
+ - !ruby/object:Gem::Dependency
224
+ name: faker
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: '3.2'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - "~>"
235
+ - !ruby/object:Gem::Version
236
+ version: '3.2'
223
237
  description: Ree Lib provides set of packages to extend Ruby Standard Library
224
238
  email:
225
239
  - ruslan.gatiyatov@gmail.com
@@ -292,8 +306,13 @@ files:
292
306
  - lib/ree_lib/packages/ree_dao/Package.schema.json
293
307
  - lib/ree_lib/packages/ree_dao/bin/console
294
308
  - lib/ree_lib/packages/ree_dao/package/ree_dao.rb
309
+ - lib/ree_lib/packages/ree_dao/package/ree_dao/aggregate_dsl.rb
310
+ - lib/ree_lib/packages/ree_dao/package/ree_dao/association.rb
311
+ - lib/ree_lib/packages/ree_dao/package/ree_dao/associations.rb
295
312
  - lib/ree_lib/packages/ree_dao/package/ree_dao/beans/connections.rb
296
313
  - lib/ree_lib/packages/ree_dao/package/ree_dao/beans/dao_cache.rb
314
+ - lib/ree_lib/packages/ree_dao/package/ree_dao/contract/dao_dataset_contract.rb
315
+ - lib/ree_lib/packages/ree_dao/package/ree_dao/contract/entity_contract.rb
297
316
  - lib/ree_lib/packages/ree_dao/package/ree_dao/dataset_extensions.rb
298
317
  - lib/ree_lib/packages/ree_dao/package/ree_dao/dsl.rb
299
318
  - lib/ree_lib/packages/ree_dao/package/ree_dao/functions/build_connection.rb
@@ -303,9 +322,11 @@ files:
303
322
  - lib/ree_lib/packages/ree_dao/package/ree_dao/functions/drop_cache.rb
304
323
  - lib/ree_lib/packages/ree_dao/package/ree_dao/functions/extract_changes.rb
305
324
  - lib/ree_lib/packages/ree_dao/package/ree_dao/functions/init_cache.rb
325
+ - lib/ree_lib/packages/ree_dao/package/ree_dao/functions/load_agg.rb
306
326
  - lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb
307
327
  - lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_one.rb
308
328
  - lib/ree_lib/packages/ree_dao/package/ree_dao/functions/persist_assoc.rb
329
+ - lib/ree_lib/packages/ree_dao/package/ree_dao/thread_parents.rb
309
330
  - lib/ree_lib/packages/ree_dao/package/ree_dao/wrappers/pg_array.rb
310
331
  - lib/ree_lib/packages/ree_dao/package/ree_dao/wrappers/pg_jsonb.rb
311
332
  - lib/ree_lib/packages/ree_dao/schemas/ree_dao/beans/connections.schema.json
@@ -317,6 +338,7 @@ files:
317
338
  - lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/drop_cache.schema.json
318
339
  - lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/extract_changes.schema.json
319
340
  - lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/init_cache.schema.json
341
+ - lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/load_agg.schema.json
320
342
  - lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/one_to_many.schema.json
321
343
  - lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/one_to_one.schema.json
322
344
  - lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/persist_assoc.schema.json
@@ -324,6 +346,9 @@ files:
324
346
  - lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/build_pg_connection_spec.rb
325
347
  - lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/build_sqlite_connection/max_connections_spec.rb
326
348
  - lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/build_sqlite_connection_spec.rb
349
+ - lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/load_agg/load_agg_benchmark_spec.rb
350
+ - lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/load_agg/load_agg_spec.rb
351
+ - lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/load_agg/ree_dao_load_agg_test.rb
327
352
  - lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/one_to_many_spec.rb
328
353
  - lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/one_to_one_spec.rb
329
354
  - lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/persist_assoc_spec.rb
@@ -1146,6 +1171,17 @@ files:
1146
1171
  - lib/ree_lib/packages/ree_routes/spec/package_schema_spec.rb
1147
1172
  - lib/ree_lib/packages/ree_routes/spec/ree_routes/dsl_spec.rb
1148
1173
  - lib/ree_lib/packages/ree_routes/spec/spec_helper.rb
1174
+ - lib/ree_lib/packages/ree_std/.gitignore
1175
+ - lib/ree_lib/packages/ree_std/.rspec
1176
+ - lib/ree_lib/packages/ree_std/Package.schema.json
1177
+ - lib/ree_lib/packages/ree_std/bin/console
1178
+ - lib/ree_lib/packages/ree_std/package/ree_std.rb
1179
+ - lib/ree_lib/packages/ree_std/package/ree_std/functions/retry_on_fail.rb
1180
+ - lib/ree_lib/packages/ree_std/package/ree_std/retry.rb
1181
+ - lib/ree_lib/packages/ree_std/schemas/ree_std/functions/retry_on_fail.schema.json
1182
+ - lib/ree_lib/packages/ree_std/spec/package_schema_spec.rb
1183
+ - lib/ree_lib/packages/ree_std/spec/ree_std/functions/retry_on_fail_spec.rb
1184
+ - lib/ree_lib/packages/ree_std/spec/spec_helper.rb
1149
1185
  - lib/ree_lib/packages/ree_string/.gitignore
1150
1186
  - lib/ree_lib/packages/ree_string/.rspec
1151
1187
  - lib/ree_lib/packages/ree_string/Package.schema.json