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