serega 0.42.0 → 0.50.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.
Files changed (107) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +124 -1207
  3. data/VERSION +1 -1
  4. data/lib/serega/attribute.rb +186 -131
  5. data/lib/serega/attribute_normalizer.rb +164 -345
  6. data/lib/serega/attribute_normalizers/batch.rb +45 -0
  7. data/lib/serega/attribute_normalizers/block.rb +81 -0
  8. data/lib/serega/attribute_normalizers/delegate.rb +34 -0
  9. data/lib/serega/attribute_normalizers/hash_access.rb +37 -0
  10. data/lib/serega/attribute_normalizers/preloads.rb +46 -0
  11. data/lib/serega/attribute_value_resolvers/batch.rb +5 -54
  12. data/lib/serega/attribute_value_resolvers/const.rb +2 -24
  13. data/lib/serega/attribute_value_resolvers/delegate.rb +17 -28
  14. data/lib/serega/attribute_value_resolvers/hash_access.rb +34 -52
  15. data/lib/serega/attribute_value_resolvers/keyword.rb +10 -25
  16. data/lib/serega/attribute_values.rb +46 -0
  17. data/lib/serega/batch_loader.rb +37 -0
  18. data/lib/serega/conditions.rb +56 -0
  19. data/lib/serega/config.rb +105 -144
  20. data/lib/serega/engine/pulls.rb +64 -0
  21. data/lib/serega/engine/run.rb +106 -0
  22. data/lib/serega/errors.rb +36 -8
  23. data/lib/serega/formatter.rb +98 -0
  24. data/lib/serega/plan/cache.rb +96 -0
  25. data/lib/serega/plan/per_ractor_cache.rb +23 -0
  26. data/lib/serega/plan.rb +101 -128
  27. data/lib/serega/plan_point.rb +44 -151
  28. data/lib/serega/plugins/activerecord_preloads/activerecord_preloads.rb +13 -80
  29. data/lib/serega/plugins/activerecord_preloads/lib/preloader.rb +8 -75
  30. data/lib/serega/plugins/context_metadata/context_metadata.rb +40 -123
  31. data/lib/serega/plugins/metadata/check_params.rb +80 -0
  32. data/lib/serega/plugins/metadata/meta_attribute.rb +40 -79
  33. data/lib/serega/plugins/metadata/metadata.rb +40 -168
  34. data/lib/serega/plugins/root/root.rb +91 -235
  35. data/lib/serega/plugins.rb +16 -49
  36. data/lib/serega/presenter.rb +61 -19
  37. data/lib/serega/result_builder.rb +68 -0
  38. data/lib/serega/result_code.rb +203 -0
  39. data/lib/serega/shareable.rb +52 -0
  40. data/lib/serega/source_group.rb +187 -0
  41. data/lib/serega/utils/collection_detector.rb +19 -13
  42. data/lib/serega/utils/deep_merge.rb +26 -0
  43. data/lib/serega/utils/enum_deep_dup.rb +10 -16
  44. data/lib/serega/utils/enum_deep_freeze.rb +8 -14
  45. data/lib/serega/utils/method_signature.rb +6 -15
  46. data/lib/serega/utils/parse_string_modifiers.rb +63 -0
  47. data/lib/serega/utils/ractor_local.rb +36 -0
  48. data/lib/serega/utils/serialized_attribute_error.rb +60 -20
  49. data/lib/serega/utils/to_hash.rb +5 -26
  50. data/lib/serega/validations/attribute/check_block.rb +3 -15
  51. data/lib/serega/validations/attribute/check_name.rb +4 -15
  52. data/lib/serega/validations/attribute/check_opt_base_serializer.rb +3 -15
  53. data/lib/serega/validations/attribute/check_opt_batch.rb +26 -56
  54. data/lib/serega/validations/attribute/check_opt_condition.rb +55 -0
  55. data/lib/serega/validations/attribute/check_opt_delegate.rb +10 -63
  56. data/lib/serega/validations/attribute/check_opt_format.rb +36 -0
  57. data/lib/serega/validations/attribute/check_opt_hash_access.rb +11 -59
  58. data/lib/serega/validations/attribute/check_opt_hide.rb +3 -14
  59. data/lib/serega/validations/attribute/check_opt_many.rb +18 -20
  60. data/lib/serega/validations/attribute/check_opt_method.rb +3 -25
  61. data/lib/serega/validations/attribute/check_opt_preload.rb +3 -26
  62. data/lib/serega/validations/attribute/check_opt_serializer.rb +4 -18
  63. data/lib/serega/validations/attribute/check_opt_value.rb +3 -21
  64. data/lib/serega/validations/check_attribute_params.rb +92 -71
  65. data/lib/serega/validations/check_batch_loader_params.rb +43 -62
  66. data/lib/serega/validations/check_formatter.rb +80 -0
  67. data/lib/serega/validations/check_serialize_keywords.rb +23 -0
  68. data/lib/serega/validations/initiate/check_modifiers.rb +14 -20
  69. data/lib/serega/validations/utils/check_allowed_keys.rb +3 -13
  70. data/lib/serega/validations/utils/check_hash_access_value.rb +44 -0
  71. data/lib/serega/validations/utils/check_opt_is_bool.rb +3 -13
  72. data/lib/serega/validations/utils/check_opt_is_hash.rb +3 -13
  73. data/lib/serega/validations/utils/check_opt_is_string_or_symbol.rb +3 -13
  74. data/lib/serega/version.rb +1 -4
  75. data/lib/serega.rb +459 -388
  76. data/sig/serega/plugins.rbs +49 -0
  77. data/sig/serega.rbs +142 -0
  78. metadata +42 -38
  79. data/lib/serega/data_builder.rb +0 -54
  80. data/lib/serega/engine/level.rb +0 -59
  81. data/lib/serega/engine/level_queue.rb +0 -56
  82. data/lib/serega/engine/loader.rb +0 -70
  83. data/lib/serega/helpers/serializer_class_helper.rb +0 -19
  84. data/lib/serega/object_serializer.rb +0 -125
  85. data/lib/serega/plugins/camel_case/camel_case.rb +0 -213
  86. data/lib/serega/plugins/depth_limit/depth_limit.rb +0 -206
  87. data/lib/serega/plugins/explicit_many_option/explicit_many_option.rb +0 -69
  88. data/lib/serega/plugins/explicit_many_option/validations/check_opt_many.rb +0 -38
  89. data/lib/serega/plugins/formatters/formatters.rb +0 -322
  90. data/lib/serega/plugins/if/if.rb +0 -287
  91. data/lib/serega/plugins/if/validations/check_opt_if.rb +0 -72
  92. data/lib/serega/plugins/if/validations/check_opt_if_value.rb +0 -77
  93. data/lib/serega/plugins/if/validations/check_opt_unless.rb +0 -72
  94. data/lib/serega/plugins/if/validations/check_opt_unless_value.rb +0 -77
  95. data/lib/serega/plugins/metadata/validations/check_block.rb +0 -47
  96. data/lib/serega/plugins/metadata/validations/check_opt_const.rb +0 -39
  97. data/lib/serega/plugins/metadata/validations/check_opt_hide_empty.rb +0 -35
  98. data/lib/serega/plugins/metadata/validations/check_opt_hide_nil.rb +0 -35
  99. data/lib/serega/plugins/metadata/validations/check_opt_value.rb +0 -61
  100. data/lib/serega/plugins/metadata/validations/check_opts.rb +0 -59
  101. data/lib/serega/plugins/metadata/validations/check_path.rb +0 -50
  102. data/lib/serega/plugins/string_modifiers/parse_string_modifiers.rb +0 -111
  103. data/lib/serega/plugins/string_modifiers/string_modifiers.rb +0 -63
  104. data/lib/serega/utils/symbol_name.rb +0 -39
  105. data/lib/serega/validations/attribute/check_opt_const.rb +0 -40
  106. data/lib/serega/validations/check_initiate_params.rb +0 -57
  107. data/lib/serega/validations/check_serialize_params.rb +0 -54
@@ -1,63 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Serega
4
- module SeregaPlugins
5
- #
6
- # Plugin :string_modifiers
7
- #
8
- # Allows `:only`, `:except` and `:with` to be given as a single comma-separated
9
- # string, with nested attributes in parentheses. Useful for accepting a field
10
- # list straight from a query parameter.
11
- #
12
- # @example
13
- # class UserSerializer < Serega
14
- # plugin :string_modifiers
15
- #
16
- # attribute :username
17
- # attribute :first_name
18
- # attribute :addresses, serializer: AddressSerializer, hide: true
19
- # end
20
- #
21
- # UserSerializer.to_h(user, only: "username,addresses(line1,line2)")
22
- #
23
- module StringModifiers
24
- # @return [Symbol] Plugin name
25
- # @private
26
- def self.plugin_name
27
- :string_modifiers
28
- end
29
-
30
- #
31
- # Applies plugin code to specific serializer
32
- #
33
- # @param serializer_class [Class<Serega>] Current serializer class
34
- # @param _opts [Hash] Plugin options
35
- #
36
- # @return [void]
37
- #
38
- # @private
39
- def self.load_plugin(serializer_class, **_opts)
40
- serializer_class.include(InstanceMethods)
41
- require_relative "parse_string_modifiers"
42
- end
43
-
44
- #
45
- # Serega additional/patched instance methods
46
- #
47
- # @see Serega
48
- #
49
- # @private
50
- module InstanceMethods
51
- private
52
-
53
- def parse_modifier(value)
54
- return ParseStringModifiers.parse(value) if value.is_a?(String)
55
-
56
- super
57
- end
58
- end
59
- end
60
-
61
- register_plugin(StringModifiers.plugin_name, StringModifiers)
62
- end
63
- end
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Serega
4
- # @private
5
- module SeregaUtils
6
- #
7
- # Utility to get frozen string from symbol in any ruby version
8
- #
9
- # @private
10
- class SymbolName
11
- class << self
12
- #
13
- # Returns frozen string corresponding to provided symbol
14
- #
15
- # @param key [Symbol]
16
- #
17
- # @return [String] frozen string corresponding to provided symbol
18
- #
19
- def call(key)
20
- key.is_a?(String) ? key : to_frozen_string(key)
21
- end
22
-
23
- private
24
-
25
- # :nocov:
26
- if RUBY_VERSION < "3"
27
- def to_frozen_string(key)
28
- key.to_s.freeze
29
- end
30
- else
31
- def to_frozen_string(key)
32
- key.name
33
- end
34
- end
35
- # :nocov:
36
- end
37
- end
38
- end
39
- end
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Serega
4
- # @private
5
- module SeregaValidations
6
- # @private
7
- module Attribute
8
- #
9
- # Attribute `:const` option validator
10
- #
11
- # @private
12
- class CheckOptConst
13
- class << self
14
- #
15
- # Checks attribute :const option
16
- #
17
- # @param opts [Hash] Attribute options
18
- #
19
- # @raise [SeregaError] Attribute validation error
20
- #
21
- # @return [void]
22
- #
23
- def call(opts)
24
- return unless opts.key?(:const)
25
-
26
- check_usage_with_other_params(opts)
27
- end
28
-
29
- private
30
-
31
- def check_usage_with_other_params(opts)
32
- raise SeregaError, "Option :const can not be used together with option :method" if opts.key?(:method)
33
- raise SeregaError, "Option :const can not be used together with option :value" if opts.key?(:value)
34
- raise SeregaError, "Option :const can not be used together with option :batch" if opts.key?(:batch)
35
- end
36
- end
37
- end
38
- end
39
- end
40
- end
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Serega
4
- # @private
5
- module SeregaValidations
6
- #
7
- # Validations of serializer initialization options
8
- #
9
- # @private
10
- class CheckInitiateParams
11
- #
12
- # Validations of serializer initialization options instance methods
13
- #
14
- # @private
15
- module InstanceMethods
16
- # @return [Hash] validated initialization options
17
- attr_reader :opts
18
-
19
- #
20
- # Initializes validator for initialization options
21
- #
22
- # @param opts [Hash] initialization options
23
- #
24
- # @return [void]
25
- #
26
- def initialize(opts)
27
- @opts = opts
28
- end
29
-
30
- #
31
- # Validates initiating params
32
- #
33
- def validate
34
- check_allowed_keys
35
- check_modifiers
36
- end
37
-
38
- private
39
-
40
- def check_allowed_keys
41
- Utils::CheckAllowedKeys.call(opts, serializer_class.config.initiate_keys, :initiate)
42
- end
43
-
44
- def check_modifiers
45
- Initiate::CheckModifiers.new.call(serializer_class, opts[:only], opts[:with], opts[:except])
46
- end
47
-
48
- def serializer_class
49
- self.class.serializer_class
50
- end
51
- end
52
-
53
- include InstanceMethods
54
- extend Serega::SeregaHelpers::SerializerClassHelper
55
- end
56
- end
57
- end
@@ -1,54 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Serega
4
- # @private
5
- module SeregaValidations
6
- #
7
- # Validations of serialization options
8
- #
9
- # @private
10
- class CheckSerializeParams
11
- #
12
- # Validations of serialization options instance methods
13
- #
14
- # @private
15
- module InstanceMethods
16
- attr_reader :opts
17
-
18
- #
19
- # Initializes validator for serialization options
20
- #
21
- # @param opts [Hash] serialization options
22
- #
23
- # @return [void]
24
- #
25
- def initialize(opts)
26
- @opts = opts
27
- end
28
-
29
- #
30
- # Validates serialization options
31
- #
32
- def validate
33
- check_opts
34
- end
35
-
36
- private
37
-
38
- def check_opts
39
- Utils::CheckAllowedKeys.call(opts, serializer_class.config.serialize_keys, :serialize)
40
-
41
- Utils::CheckOptIsHash.call(opts, :context)
42
- Utils::CheckOptIsBool.call(opts, :many)
43
- end
44
-
45
- def serializer_class
46
- self.class.serializer_class
47
- end
48
- end
49
-
50
- include InstanceMethods
51
- extend Serega::SeregaHelpers::SerializerClassHelper
52
- end
53
- end
54
- end