serega 0.19.0 → 0.20.1
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.
- checksums.yaml +4 -4
- data/README.md +5 -2
- data/VERSION +1 -1
- data/lib/serega/config.rb +0 -2
- data/lib/serega/errors.rb +9 -1
- data/lib/serega/object_serializer.rb +13 -7
- data/lib/serega/plan_point.rb +24 -16
- data/lib/serega/plugins/activerecord_preloads/activerecord_preloads.rb +9 -5
- data/lib/serega/plugins/batch/batch.rb +26 -2
- data/lib/serega/plugins/batch/lib/plugins_extensions/if.rb +31 -0
- data/lib/serega/plugins/camel_case/camel_case.rb +20 -2
- data/lib/serega/plugins/context_metadata/context_metadata.rb +13 -4
- data/lib/serega/plugins/depth_limit/depth_limit.rb +20 -2
- data/lib/serega/plugins/explicit_many_option/explicit_many_option.rb +1 -1
- data/lib/serega/plugins/formatters/formatters.rb +13 -4
- data/lib/serega/plugins/if/if.rb +21 -4
- data/lib/serega/plugins/metadata/meta_attribute.rb +1 -1
- data/lib/serega/plugins/metadata/metadata.rb +4 -4
- data/lib/serega/plugins/preloads/lib/preloads_config.rb +1 -1
- data/lib/serega/plugins/preloads/preloads.rb +26 -2
- data/lib/serega/plugins/presenter/presenter.rb +2 -2
- data/lib/serega/plugins/root/root.rb +25 -5
- data/lib/serega/plugins/string_modifiers/string_modifiers.rb +1 -1
- data/lib/serega/validations/initiate/check_modifiers.rb +12 -5
- metadata +4 -3
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 11094f59dcd5d1d918604998ac267dbd13297bf0f70a9f3da5fd5ba74eb76b06
         | 
| 4 | 
            +
              data.tar.gz: 97d1a419769b73937afde735e24210690e2f7702943d60db5be4252301e07255
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: f9e3bfb207894f09c9c88658bad62e2a28e8b4d44648a74f807d332862b0cd7bdc67870f0d06786de0eb64537fd1a824c5d4f375406b71d18410b63c5a8c5320
         | 
| 7 | 
            +
              data.tar.gz: 1171f2aabb7ce1c63a9e2f95f5413e9d80a882326ada4fac561b527c8a1adcc263ff19d6224eb070f0ebb333254ff48c9c7f56861ff6418732848cde3ffbc5b5
         | 
    
        data/README.md
    CHANGED
    
    | @@ -301,7 +301,7 @@ fields_as_string = 'first_name,enemy' | |
| 301 301 | 
             
            UserSerializer.new(only: fields).to_h(bruce)
         | 
| 302 302 | 
             
            UserSerializer.to_h(bruce, only: fields)
         | 
| 303 303 | 
             
            UserSerializer.to_h(bruce, only: fields_as_string)
         | 
| 304 | 
            -
            # => raises Serega::AttributeNotExist | 
| 304 | 
            +
            # => raises Serega::AttributeNotExist
         | 
| 305 305 |  | 
| 306 306 | 
             
            # With no existing attribute and disabled validation
         | 
| 307 307 | 
             
            fields = %i[first_name enemy]
         | 
| @@ -1074,7 +1074,10 @@ a single object. | |
| 1074 1074 |  | 
| 1075 1075 | 
             
            - The `Serega::SeregaError` is a base error raised by this gem.
         | 
| 1076 1076 | 
             
            - The `Serega::AttributeNotExist` error is raised when validating attributes in
         | 
| 1077 | 
            -
              `:only, :except, :with` modifiers
         | 
| 1077 | 
            +
              `:only, :except, :with` modifiers. This error contains additional methods:
         | 
| 1078 | 
            +
             | 
| 1079 | 
            +
               - `#serializer` - shows current serializer
         | 
| 1080 | 
            +
               - `#attributes` - lists not existing attributes
         | 
| 1078 1081 |  | 
| 1079 1082 | 
             
            ## Release
         | 
| 1080 1083 |  | 
    
        data/VERSION
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            0. | 
| 1 | 
            +
            0.20.1
         | 
    
        data/lib/serega/config.rb
    CHANGED
    
    
    
        data/lib/serega/errors.rb
    CHANGED
    
    | @@ -11,5 +11,13 @@ class Serega | |
| 11 11 | 
             
              # @example
         | 
| 12 12 | 
             
              #   Serega.new(only: 'FOO')
         | 
| 13 13 | 
             
              #   # => Attribute 'FOO' not exists (Serega::AttributeNotExist)
         | 
| 14 | 
            -
              class AttributeNotExist < SeregaError | 
| 14 | 
            +
              class AttributeNotExist < SeregaError
         | 
| 15 | 
            +
                attr_reader :serializer, :attributes
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                def initialize(message = nil, serializer = nil, attributes = nil)
         | 
| 18 | 
            +
                  super(message)
         | 
| 19 | 
            +
                  @serializer = serializer
         | 
| 20 | 
            +
                  @attributes = attributes
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
              end
         | 
| 15 23 | 
             
            end
         | 
| @@ -38,8 +38,8 @@ class Serega | |
| 38 38 |  | 
| 39 39 | 
             
                  private
         | 
| 40 40 |  | 
| 41 | 
            -
                  def serialize_array( | 
| 42 | 
            -
                     | 
| 41 | 
            +
                  def serialize_array(objects)
         | 
| 42 | 
            +
                    objects.map { |object| serialize_object(object) }
         | 
| 43 43 | 
             
                  end
         | 
| 44 44 |  | 
| 45 45 | 
             
                  # Patched in:
         | 
| @@ -70,6 +70,7 @@ class Serega | |
| 70 70 |  | 
| 71 71 | 
             
                  # Patched in:
         | 
| 72 72 | 
             
                  # - plugin :if (conditionally skips attaching)
         | 
| 73 | 
            +
                  # - plugin :batch :if extension (removes prepared key)
         | 
| 73 74 | 
             
                  def attach_final_value(final_value, point, container)
         | 
| 74 75 | 
             
                    container[point.name] = final_value
         | 
| 75 76 | 
             
                  end
         | 
| @@ -79,11 +80,16 @@ class Serega | |
| 79 80 | 
             
                  end
         | 
| 80 81 |  | 
| 81 82 | 
             
                  def relation_value(value, point)
         | 
| 82 | 
            -
                     | 
| 83 | 
            -
             | 
| 84 | 
            -
             | 
| 85 | 
            -
             | 
| 86 | 
            -
                     | 
| 83 | 
            +
                    child_serializer(point).serialize(value)
         | 
| 84 | 
            +
                  end
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                  def child_serializer(point)
         | 
| 87 | 
            +
                    point.child_object_serializer.new(
         | 
| 88 | 
            +
                      context: context,
         | 
| 89 | 
            +
                      plan: point.child_plan,
         | 
| 90 | 
            +
                      many: point.many,
         | 
| 91 | 
            +
                      **opts
         | 
| 92 | 
            +
                    )
         | 
| 87 93 | 
             
                  end
         | 
| 88 94 |  | 
| 89 95 | 
             
                  def array?(object, many)
         | 
    
        data/lib/serega/plan_point.rb
    CHANGED
    
    | @@ -9,8 +9,6 @@ class Serega | |
| 9 9 | 
             
                # SeregaPlanPoint instance methods
         | 
| 10 10 | 
             
                #
         | 
| 11 11 | 
             
                module InstanceMethods
         | 
| 12 | 
            -
                  extend Forwardable
         | 
| 13 | 
            -
             | 
| 14 12 | 
             
                  # Link to current plan this point belongs to
         | 
| 15 13 | 
             
                  # @return [SeregaAttribute] Current plan
         | 
| 16 14 | 
             
                  attr_reader :plan
         | 
| @@ -27,20 +25,6 @@ class Serega | |
| 27 25 | 
             
                  # @return [Hash] Attributes to serialize
         | 
| 28 26 | 
             
                  attr_reader :modifiers
         | 
| 29 27 |  | 
| 30 | 
            -
                  # @!method name
         | 
| 31 | 
            -
                  #   Attribute `name`
         | 
| 32 | 
            -
                  #   @see SeregaAttribute::AttributeInstanceMethods#name
         | 
| 33 | 
            -
                  # @!method value
         | 
| 34 | 
            -
                  #   Attribute `value` block
         | 
| 35 | 
            -
                  #   @see SeregaAttribute::AttributeInstanceMethods#value
         | 
| 36 | 
            -
                  # @!method many
         | 
| 37 | 
            -
                  #   Attribute `many` option
         | 
| 38 | 
            -
                  #   @see SeregaAttribute::AttributeInstanceMethods#many
         | 
| 39 | 
            -
                  # @!method serializer
         | 
| 40 | 
            -
                  #   Attribute `serializer` option
         | 
| 41 | 
            -
                  #   @see SeregaAttribute::AttributeInstanceMethods#serializer
         | 
| 42 | 
            -
                  def_delegators :@attribute, :name, :value, :many, :serializer
         | 
| 43 | 
            -
             | 
| 44 28 | 
             
                  #
         | 
| 45 29 | 
             
                  # Initializes plan point
         | 
| 46 30 | 
             
                  #
         | 
| @@ -60,6 +44,30 @@ class Serega | |
| 60 44 | 
             
                    set_normalized_vars
         | 
| 61 45 | 
             
                  end
         | 
| 62 46 |  | 
| 47 | 
            +
                  # Attribute `value`
         | 
| 48 | 
            +
                  # @see SeregaAttribute::AttributeInstanceMethods#value
         | 
| 49 | 
            +
                  def value(obj, ctx)
         | 
| 50 | 
            +
                    attribute.value(obj, ctx)
         | 
| 51 | 
            +
                  end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                  # Attribute `name`
         | 
| 54 | 
            +
                  # @see SeregaAttribute::AttributeInstanceMethods#value
         | 
| 55 | 
            +
                  def name
         | 
| 56 | 
            +
                    attribute.name
         | 
| 57 | 
            +
                  end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                  # Attribute `many` option
         | 
| 60 | 
            +
                  # @see SeregaAttribute::AttributeInstanceMethods#many
         | 
| 61 | 
            +
                  def many
         | 
| 62 | 
            +
                    attribute.many
         | 
| 63 | 
            +
                  end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                  # Attribute `serializer` option
         | 
| 66 | 
            +
                  # @see SeregaAttribute::AttributeInstanceMethods#serializer
         | 
| 67 | 
            +
                  def serializer
         | 
| 68 | 
            +
                    attribute.serializer
         | 
| 69 | 
            +
                  end
         | 
| 70 | 
            +
             | 
| 63 71 | 
             
                  #
         | 
| 64 72 | 
             
                  # @return [SeregaObjectSerializer] object serializer for child plan
         | 
| 65 73 | 
             
                  #
         | 
| @@ -54,17 +54,21 @@ class Serega | |
| 54 54 | 
             
                  # Checks requirements to load plugin
         | 
| 55 55 | 
             
                  #
         | 
| 56 56 | 
             
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 57 | 
            -
                  # @param  | 
| 57 | 
            +
                  # @param opts [Hash] plugin options
         | 
| 58 58 | 
             
                  #
         | 
| 59 59 | 
             
                  # @return [void]
         | 
| 60 60 | 
             
                  #
         | 
| 61 | 
            -
                  def self.before_load_plugin(serializer_class, ** | 
| 61 | 
            +
                  def self.before_load_plugin(serializer_class, **opts)
         | 
| 62 | 
            +
                    opts.each_key do |key|
         | 
| 63 | 
            +
                      raise SeregaError, "Plugin #{plugin_name.inspect} does not accept the #{key.inspect} option. No options are allowed"
         | 
| 64 | 
            +
                    end
         | 
| 65 | 
            +
             | 
| 62 66 | 
             
                    unless serializer_class.plugin_used?(:preloads)
         | 
| 63 | 
            -
                      raise SeregaError, "Please load  | 
| 67 | 
            +
                      raise SeregaError, "Plugin #{plugin_name.inspect} must be loaded after the :preloads plugin. Please load the :preloads plugin first"
         | 
| 64 68 | 
             
                    end
         | 
| 65 69 |  | 
| 66 70 | 
             
                    if serializer_class.plugin_used?(:batch)
         | 
| 67 | 
            -
                      raise SeregaError, "Plugin  | 
| 71 | 
            +
                      raise SeregaError, "Plugin #{plugin_name.inspect} must be loaded before the :batch plugin"
         | 
| 68 72 | 
             
                    end
         | 
| 69 73 | 
             
                  end
         | 
| 70 74 |  | 
| @@ -72,7 +76,7 @@ class Serega | |
| 72 76 | 
             
                  # Applies plugin code to specific serializer
         | 
| 73 77 | 
             
                  #
         | 
| 74 78 | 
             
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 75 | 
            -
                  # @param _opts [Hash]  | 
| 79 | 
            +
                  # @param _opts [Hash] Plugin options
         | 
| 76 80 | 
             
                  #
         | 
| 77 81 | 
             
                  # @return [void]
         | 
| 78 82 | 
             
                  #
         | 
| @@ -25,11 +25,30 @@ class Serega | |
| 25 25 | 
             
                    :batch
         | 
| 26 26 | 
             
                  end
         | 
| 27 27 |  | 
| 28 | 
            +
                  # Checks requirements to load plugin
         | 
| 29 | 
            +
                  #
         | 
| 30 | 
            +
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 31 | 
            +
                  # @param opts [Hash] plugin options
         | 
| 32 | 
            +
                  #
         | 
| 33 | 
            +
                  # @return [void]
         | 
| 34 | 
            +
                  #
         | 
| 35 | 
            +
                  def self.before_load_plugin(serializer_class, **opts)
         | 
| 36 | 
            +
                    allowed_keys = %i[auto_hide id_method]
         | 
| 37 | 
            +
                    opts.each_key do |key|
         | 
| 38 | 
            +
                      next if allowed_keys.include?(key)
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                      raise SeregaError,
         | 
| 41 | 
            +
                        "Plugin #{plugin_name.inspect} does not accept the #{key.inspect} option. Allowed options:\n" \
         | 
| 42 | 
            +
                        "  - :auto_hide [Boolean] - Marks attribute as hidden when it has :batch loader specified\n" \
         | 
| 43 | 
            +
                        "  - :id_method [Symbol, #call] - Specified the default method to use to find object identifier"
         | 
| 44 | 
            +
                    end
         | 
| 45 | 
            +
                  end
         | 
| 46 | 
            +
             | 
| 28 47 | 
             
                  #
         | 
| 29 48 | 
             
                  # Applies plugin code to specific serializer
         | 
| 30 49 | 
             
                  #
         | 
| 31 50 | 
             
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 32 | 
            -
                  # @param _opts [Hash]  | 
| 51 | 
            +
                  # @param _opts [Hash] Plugin options
         | 
| 33 52 | 
             
                  #
         | 
| 34 53 | 
             
                  # @return [void]
         | 
| 35 54 | 
             
                  #
         | 
| @@ -60,7 +79,7 @@ class Serega | |
| 60 79 | 
             
                  # Runs callbacks after plugin was attached
         | 
| 61 80 | 
             
                  #
         | 
| 62 81 | 
             
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 63 | 
            -
                  # @param opts [Hash]  | 
| 82 | 
            +
                  # @param opts [Hash] Plugin options
         | 
| 64 83 | 
             
                  #
         | 
| 65 84 | 
             
                  # @return [void]
         | 
| 66 85 | 
             
                  #
         | 
| @@ -86,6 +105,11 @@ class Serega | |
| 86 105 | 
             
                      serializer_class::SeregaAttribute.include(PluginsExtensions::Formatters::SeregaAttributeInstanceMethods)
         | 
| 87 106 | 
             
                    end
         | 
| 88 107 |  | 
| 108 | 
            +
                    if serializer_class.plugin_used?(:if)
         | 
| 109 | 
            +
                      require_relative "lib/plugins_extensions/if"
         | 
| 110 | 
            +
                      serializer_class::SeregaObjectSerializer.include(PluginsExtensions::If::ObjectSerializerInstanceMethods123)
         | 
| 111 | 
            +
                    end
         | 
| 112 | 
            +
             | 
| 89 113 | 
             
                    if serializer_class.plugin_used?(:preloads)
         | 
| 90 114 | 
             
                      require_relative "lib/plugins_extensions/preloads"
         | 
| 91 115 | 
             
                      serializer_class::SeregaAttributeNormalizer.include(PluginsExtensions::Preloads::AttributeNormalizerInstanceMethods)
         | 
| @@ -0,0 +1,31 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class Serega
         | 
| 4 | 
            +
              module SeregaPlugins
         | 
| 5 | 
            +
                module Batch
         | 
| 6 | 
            +
                  #
         | 
| 7 | 
            +
                  # Extensions (mini-plugins) that are enabled when :batch plugin used with other plugins
         | 
| 8 | 
            +
                  #
         | 
| 9 | 
            +
                  module PluginsExtensions
         | 
| 10 | 
            +
                    #
         | 
| 11 | 
            +
                    # Extension that is used when :if plugin is loaded
         | 
| 12 | 
            +
                    #
         | 
| 13 | 
            +
                    module If
         | 
| 14 | 
            +
                      #
         | 
| 15 | 
            +
                      # SeregaObjectSerializer additional/patched class methods
         | 
| 16 | 
            +
                      #
         | 
| 17 | 
            +
                      # @see Serega::SeregaObjectSerializer
         | 
| 18 | 
            +
                      #
         | 
| 19 | 
            +
                      module ObjectSerializerInstanceMethods123
         | 
| 20 | 
            +
                        private
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                        # Removes key added by `batch` plugin at the start of serialization to preserve attributes ordering
         | 
| 23 | 
            +
                        def attach_final_value(value, point, container)
         | 
| 24 | 
            +
                          container.delete(point.name) if super == SeregaPlugins::If::KEY_SKIPPED
         | 
| 25 | 
            +
                        end
         | 
| 26 | 
            +
                      end
         | 
| 27 | 
            +
                    end
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
            end
         | 
| @@ -48,11 +48,29 @@ class Serega | |
| 48 48 | 
             
                    :camel_case
         | 
| 49 49 | 
             
                  end
         | 
| 50 50 |  | 
| 51 | 
            +
                  # Checks requirements to load plugin
         | 
| 52 | 
            +
                  #
         | 
| 53 | 
            +
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 54 | 
            +
                  # @param opts [Hash] plugin options
         | 
| 55 | 
            +
                  #
         | 
| 56 | 
            +
                  # @return [void]
         | 
| 57 | 
            +
                  #
         | 
| 58 | 
            +
                  def self.before_load_plugin(serializer_class, **opts)
         | 
| 59 | 
            +
                    allowed_keys = %i[transform]
         | 
| 60 | 
            +
                    opts.each_key do |key|
         | 
| 61 | 
            +
                      next if allowed_keys.include?(key)
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                      raise SeregaError,
         | 
| 64 | 
            +
                        "Plugin #{plugin_name.inspect} does not accept the #{key.inspect} option. Allowed options:\n" \
         | 
| 65 | 
            +
                        "  - :transform [#call] - Custom transformation"
         | 
| 66 | 
            +
                    end
         | 
| 67 | 
            +
                  end
         | 
| 68 | 
            +
             | 
| 51 69 | 
             
                  #
         | 
| 52 70 | 
             
                  # Applies plugin code to specific serializer
         | 
| 53 71 | 
             
                  #
         | 
| 54 72 | 
             
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 55 | 
            -
                  # @param _opts [Hash]  | 
| 73 | 
            +
                  # @param _opts [Hash] Plugin options
         | 
| 56 74 | 
             
                  #
         | 
| 57 75 | 
             
                  # @return [void]
         | 
| 58 76 | 
             
                  #
         | 
| @@ -66,7 +84,7 @@ class Serega | |
| 66 84 | 
             
                  # Adds config options and runs other callbacks after plugin was loaded
         | 
| 67 85 | 
             
                  #
         | 
| 68 86 | 
             
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 69 | 
            -
                  # @param opts [Hash]  | 
| 87 | 
            +
                  # @param opts [Hash] Plugin options
         | 
| 70 88 | 
             
                  #
         | 
| 71 89 | 
             
                  # @return [void]
         | 
| 72 90 | 
             
                  #
         | 
| @@ -30,13 +30,22 @@ class Serega | |
| 30 30 | 
             
                  # Checks requirements and loads additional plugins
         | 
| 31 31 | 
             
                  #
         | 
| 32 32 | 
             
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 33 | 
            -
                  # @param opts [Hash]  | 
| 33 | 
            +
                  # @param opts [Hash] Plugin options
         | 
| 34 34 | 
             
                  #
         | 
| 35 35 | 
             
                  # @return [void]
         | 
| 36 36 | 
             
                  #
         | 
| 37 37 | 
             
                  def self.before_load_plugin(serializer_class, **opts)
         | 
| 38 | 
            +
                    allowed_keys = %i[context_metadata_key]
         | 
| 39 | 
            +
                    opts.each_key do |key|
         | 
| 40 | 
            +
                      next if allowed_keys.include?(key)
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                      raise SeregaError,
         | 
| 43 | 
            +
                        "Plugin #{plugin_name.inspect} does not accept the #{key.inspect} option. Allowed options:\n" \
         | 
| 44 | 
            +
                        "  - :context_metadata_key [Symbol] - The key name that must be used to add metadata. Default is :meta."
         | 
| 45 | 
            +
                    end
         | 
| 46 | 
            +
             | 
| 38 47 | 
             
                    unless serializer_class.plugin_used?(:root)
         | 
| 39 | 
            -
                      raise SeregaError, " | 
| 48 | 
            +
                      raise SeregaError, "Plugin #{plugin_name.inspect} must be loaded after the :root plugin. Please load the :root plugin first"
         | 
| 40 49 | 
             
                    end
         | 
| 41 50 | 
             
                  end
         | 
| 42 51 |  | 
| @@ -44,7 +53,7 @@ class Serega | |
| 44 53 | 
             
                  # Applies plugin code to specific serializer
         | 
| 45 54 | 
             
                  #
         | 
| 46 55 | 
             
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 47 | 
            -
                  # @param _opts [Hash]  | 
| 56 | 
            +
                  # @param _opts [Hash] Plugin options
         | 
| 48 57 | 
             
                  #
         | 
| 49 58 | 
             
                  # @return [void]
         | 
| 50 59 | 
             
                  #
         | 
| @@ -58,7 +67,7 @@ class Serega | |
| 58 67 | 
             
                  # Adds config options and runs other callbacks after plugin was loaded
         | 
| 59 68 | 
             
                  #
         | 
| 60 69 | 
             
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 61 | 
            -
                  # @param opts [Hash]  | 
| 70 | 
            +
                  # @param opts [Hash] Plugin options
         | 
| 62 71 | 
             
                  #
         | 
| 63 72 | 
             
                  # @return [void]
         | 
| 64 73 | 
             
                  #
         | 
| @@ -41,11 +41,29 @@ class Serega | |
| 41 41 | 
             
                    :depth_limit
         | 
| 42 42 | 
             
                  end
         | 
| 43 43 |  | 
| 44 | 
            +
                  # Checks requirements
         | 
| 45 | 
            +
                  #
         | 
| 46 | 
            +
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 47 | 
            +
                  # @param opts [Hash] Plugin options
         | 
| 48 | 
            +
                  #
         | 
| 49 | 
            +
                  # @return [void]
         | 
| 50 | 
            +
                  #
         | 
| 51 | 
            +
                  def self.before_load_plugin(serializer_class, **opts)
         | 
| 52 | 
            +
                    allowed_keys = %i[limit]
         | 
| 53 | 
            +
                    opts.each_key do |key|
         | 
| 54 | 
            +
                      next if allowed_keys.include?(key)
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                      raise SeregaError,
         | 
| 57 | 
            +
                        "Plugin #{plugin_name.inspect} does not accept the #{key.inspect} option. Allowed options:\n" \
         | 
| 58 | 
            +
                        "  - :limit [Integer] - Maximum serialization depth."
         | 
| 59 | 
            +
                    end
         | 
| 60 | 
            +
                  end
         | 
| 61 | 
            +
             | 
| 44 62 | 
             
                  #
         | 
| 45 63 | 
             
                  # Applies plugin code to specific serializer
         | 
| 46 64 | 
             
                  #
         | 
| 47 65 | 
             
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 48 | 
            -
                  # @param _opts [Hash]  | 
| 66 | 
            +
                  # @param _opts [Hash] Plugin options
         | 
| 49 67 | 
             
                  #
         | 
| 50 68 | 
             
                  # @return [void]
         | 
| 51 69 | 
             
                  #
         | 
| @@ -58,7 +76,7 @@ class Serega | |
| 58 76 | 
             
                  # Adds config options and runs other callbacks after plugin was loaded
         | 
| 59 77 | 
             
                  #
         | 
| 60 78 | 
             
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 61 | 
            -
                  # @param opts [Hash]  | 
| 79 | 
            +
                  # @param opts [Hash] Plugin options
         | 
| 62 80 | 
             
                  #
         | 
| 63 81 | 
             
                  # @return [void]
         | 
| 64 82 | 
             
                  #
         | 
| @@ -51,13 +51,22 @@ class Serega | |
| 51 51 | 
             
                  # Checks requirements and loads additional plugins
         | 
| 52 52 | 
             
                  #
         | 
| 53 53 | 
             
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 54 | 
            -
                  # @param opts [Hash]  | 
| 54 | 
            +
                  # @param opts [Hash] Plugin options
         | 
| 55 55 | 
             
                  #
         | 
| 56 56 | 
             
                  # @return [void]
         | 
| 57 57 | 
             
                  #
         | 
| 58 58 | 
             
                  def self.before_load_plugin(serializer_class, **opts)
         | 
| 59 | 
            +
                    allowed_keys = %i[formatters]
         | 
| 60 | 
            +
                    opts.each_key do |key|
         | 
| 61 | 
            +
                      next if allowed_keys.include?(key)
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                      raise SeregaError,
         | 
| 64 | 
            +
                        "Plugin #{plugin_name.inspect} does not accept the #{key.inspect} option. Allowed options:\n" \
         | 
| 65 | 
            +
                        "  - :formatters [Hash<Symbol, #call>] - Formatters (names and according callable values)"
         | 
| 66 | 
            +
                    end
         | 
| 67 | 
            +
             | 
| 59 68 | 
             
                    if serializer_class.plugin_used?(:batch)
         | 
| 60 | 
            -
                      raise SeregaError, "Plugin  | 
| 69 | 
            +
                      raise SeregaError, "Plugin #{plugin_name.inspect} must be loaded before the :batch plugin"
         | 
| 61 70 | 
             
                    end
         | 
| 62 71 | 
             
                  end
         | 
| 63 72 |  | 
| @@ -65,7 +74,7 @@ class Serega | |
| 65 74 | 
             
                  # Applies plugin code to specific serializer
         | 
| 66 75 | 
             
                  #
         | 
| 67 76 | 
             
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 68 | 
            -
                  # @param _opts [Hash]  | 
| 77 | 
            +
                  # @param _opts [Hash] Plugin options
         | 
| 69 78 | 
             
                  #
         | 
| 70 79 | 
             
                  # @return [void]
         | 
| 71 80 | 
             
                  #
         | 
| @@ -79,7 +88,7 @@ class Serega | |
| 79 88 | 
             
                  # Adds config options and runs other callbacks after plugin was loaded
         | 
| 80 89 | 
             
                  #
         | 
| 81 90 | 
             
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 82 | 
            -
                  # @param opts [Hash]  | 
| 91 | 
            +
                  # @param opts [Hash] Plugin options
         | 
| 83 92 | 
             
                  #
         | 
| 84 93 | 
             
                  # @return [void]
         | 
| 85 94 | 
             
                  #
         | 
    
        data/lib/serega/plugins/if/if.rb
    CHANGED
    
    | @@ -42,16 +42,32 @@ class Serega | |
| 42 42 | 
             
                #  end
         | 
| 43 43 | 
             
                #
         | 
| 44 44 | 
             
                module If
         | 
| 45 | 
            +
                  # This value must be returned to identify that serialization key was skipped
         | 
| 46 | 
            +
                  KEY_SKIPPED = :_key_skipped_with_serega_if_plugin
         | 
| 47 | 
            +
             | 
| 45 48 | 
             
                  # @return [Symbol] Plugin name
         | 
| 46 49 | 
             
                  def self.plugin_name
         | 
| 47 50 | 
             
                    :if
         | 
| 48 51 | 
             
                  end
         | 
| 49 52 |  | 
| 53 | 
            +
                  # Checks requirements to load plugin
         | 
| 54 | 
            +
                  #
         | 
| 55 | 
            +
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 56 | 
            +
                  # @param opts [Hash] plugin options
         | 
| 57 | 
            +
                  #
         | 
| 58 | 
            +
                  # @return [void]
         | 
| 59 | 
            +
                  #
         | 
| 60 | 
            +
                  def self.before_load_plugin(serializer_class, **opts)
         | 
| 61 | 
            +
                    if serializer_class.plugin_used?(:batch)
         | 
| 62 | 
            +
                      raise SeregaError, "Plugin #{plugin_name.inspect} must be loaded before the :batch plugin"
         | 
| 63 | 
            +
                    end
         | 
| 64 | 
            +
                  end
         | 
| 65 | 
            +
             | 
| 50 66 | 
             
                  #
         | 
| 51 67 | 
             
                  # Applies plugin code to specific serializer
         | 
| 52 68 | 
             
                  #
         | 
| 53 69 | 
             
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 54 | 
            -
                  # @param _opts [Hash]  | 
| 70 | 
            +
                  # @param _opts [Hash] Plugin options
         | 
| 55 71 | 
             
                  #
         | 
| 56 72 | 
             
                  # @return [void]
         | 
| 57 73 | 
             
                  #
         | 
| @@ -72,7 +88,7 @@ class Serega | |
| 72 88 | 
             
                  # Adds config options and runs other callbacks after plugin was loaded
         | 
| 73 89 | 
             
                  #
         | 
| 74 90 | 
             
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 75 | 
            -
                  # @param opts [Hash]  | 
| 91 | 
            +
                  # @param opts [Hash] Plugin options
         | 
| 76 92 | 
             
                  #
         | 
| 77 93 | 
             
                  # @return [void]
         | 
| 78 94 | 
             
                  #
         | 
| @@ -194,12 +210,13 @@ class Serega | |
| 194 210 | 
             
                    private
         | 
| 195 211 |  | 
| 196 212 | 
             
                    def serialize_point(object, point, _container)
         | 
| 197 | 
            -
                      return unless point.satisfy_if_conditions?(object, context)
         | 
| 213 | 
            +
                      return KEY_SKIPPED unless point.satisfy_if_conditions?(object, context)
         | 
| 198 214 | 
             
                      super
         | 
| 199 215 | 
             
                    end
         | 
| 200 216 |  | 
| 201 217 | 
             
                    def attach_final_value(value, point, _container)
         | 
| 202 | 
            -
                      return unless point.satisfy_if_value_conditions?(value, context)
         | 
| 218 | 
            +
                      return KEY_SKIPPED unless point.satisfy_if_value_conditions?(value, context)
         | 
| 219 | 
            +
             | 
| 203 220 | 
             
                      super
         | 
| 204 221 | 
             
                    end
         | 
| 205 222 | 
             
                  end
         | 
| @@ -46,13 +46,13 @@ class Serega | |
| 46 46 | 
             
                  # Checks requirements and loads additional plugins
         | 
| 47 47 | 
             
                  #
         | 
| 48 48 | 
             
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 49 | 
            -
                  # @param _opts [Hash]  | 
| 49 | 
            +
                  # @param _opts [Hash] Plugin options
         | 
| 50 50 | 
             
                  #
         | 
| 51 51 | 
             
                  # @return [void]
         | 
| 52 52 | 
             
                  #
         | 
| 53 53 | 
             
                  def self.before_load_plugin(serializer_class, **_opts)
         | 
| 54 54 | 
             
                    unless serializer_class.plugin_used?(:root)
         | 
| 55 | 
            -
                      raise SeregaError, " | 
| 55 | 
            +
                      raise SeregaError, "Plugin #{plugin_name.inspect} must be loaded after the :root plugin. Please load the :root plugin first"
         | 
| 56 56 | 
             
                    end
         | 
| 57 57 | 
             
                  end
         | 
| 58 58 |  | 
| @@ -60,7 +60,7 @@ class Serega | |
| 60 60 | 
             
                  # Applies plugin code to specific serializer
         | 
| 61 61 | 
             
                  #
         | 
| 62 62 | 
             
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 63 | 
            -
                  # @param _opts [Hash]  | 
| 63 | 
            +
                  # @param _opts [Hash] Plugin options
         | 
| 64 64 | 
             
                  #
         | 
| 65 65 | 
             
                  # @return [void]
         | 
| 66 66 | 
             
                  #
         | 
| @@ -87,7 +87,7 @@ class Serega | |
| 87 87 | 
             
                  # Adds config options and runs other callbacks after plugin was loaded
         | 
| 88 88 | 
             
                  #
         | 
| 89 89 | 
             
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 90 | 
            -
                  # @param _opts [Hash]  | 
| 90 | 
            +
                  # @param _opts [Hash] Plugin options
         | 
| 91 91 | 
             
                  #
         | 
| 92 92 | 
             
                  # @return [void]
         | 
| 93 93 | 
             
                  #
         | 
| @@ -51,7 +51,7 @@ class Serega | |
| 51 51 | 
             
                        opts.fetch(method_name)
         | 
| 52 52 | 
             
                      end
         | 
| 53 53 |  | 
| 54 | 
            -
                      define_method("#{method_name}=") do |value|
         | 
| 54 | 
            +
                      define_method(:"#{method_name}=") do |value|
         | 
| 55 55 | 
             
                        raise SeregaError, "Must have boolean value, #{value.inspect} provided" if (value != true) && (value != false)
         | 
| 56 56 | 
             
                        opts[method_name] = value
         | 
| 57 57 | 
             
                      end
         | 
| @@ -70,11 +70,35 @@ class Serega | |
| 70 70 | 
             
                    :preloads
         | 
| 71 71 | 
             
                  end
         | 
| 72 72 |  | 
| 73 | 
            +
                  # Checks requirements to load plugin
         | 
| 74 | 
            +
                  #
         | 
| 75 | 
            +
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 76 | 
            +
                  # @param opts [Hash] plugin options
         | 
| 77 | 
            +
                  #
         | 
| 78 | 
            +
                  # @return [void]
         | 
| 79 | 
            +
                  #
         | 
| 80 | 
            +
                  def self.before_load_plugin(serializer_class, **opts)
         | 
| 81 | 
            +
                    allowed_keys = DEFAULT_CONFIG.keys
         | 
| 82 | 
            +
                    opts.each_key do |key|
         | 
| 83 | 
            +
                      next if allowed_keys.include?(key)
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                      raise SeregaError,
         | 
| 86 | 
            +
                        "Plugin #{plugin_name.inspect} does not accept the #{key.inspect} option. Allowed options:\n" \
         | 
| 87 | 
            +
                        "  - :auto_preload_attributes_with_delegate [Boolean] - Automatically adds `preload: <delegate_to>` option to attributes with :delegate option specified\n" \
         | 
| 88 | 
            +
                        "  - :auto_preload_attributes_with_serializer [Boolean] - Automatically adds `preload: <attribute_name>` option to attributes with :serializer option specified\n" \
         | 
| 89 | 
            +
                        "  - :auto_hide_attributes_with_preload [Boolean] - Automatically adds `hide: true` option to attributes with :preload option (specified manually or added automatically)"
         | 
| 90 | 
            +
                    end
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                    if serializer_class.plugin_used?(:batch)
         | 
| 93 | 
            +
                      raise SeregaError, "Plugin #{plugin_name.inspect} must be loaded before the :batch plugin"
         | 
| 94 | 
            +
                    end
         | 
| 95 | 
            +
                  end
         | 
| 96 | 
            +
             | 
| 73 97 | 
             
                  #
         | 
| 74 98 | 
             
                  # Applies plugin code to specific serializer
         | 
| 75 99 | 
             
                  #
         | 
| 76 100 | 
             
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 77 | 
            -
                  # @param _opts [Hash]  | 
| 101 | 
            +
                  # @param _opts [Hash] Plugin options
         | 
| 78 102 | 
             
                  #
         | 
| 79 103 | 
             
                  # @return [void]
         | 
| 80 104 | 
             
                  #
         | 
| @@ -104,7 +128,7 @@ class Serega | |
| 104 128 | 
             
                  # Adds config options and runs other callbacks after plugin was loaded
         | 
| 105 129 | 
             
                  #
         | 
| 106 130 | 
             
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 107 | 
            -
                  # @param opts [Hash]  | 
| 131 | 
            +
                  # @param opts [Hash] Plugin options
         | 
| 108 132 | 
             
                  #
         | 
| 109 133 | 
             
                  # @return [void]
         | 
| 110 134 | 
             
                  #
         | 
| @@ -29,7 +29,7 @@ class Serega | |
| 29 29 | 
             
                  # Applies plugin code to specific serializer
         | 
| 30 30 | 
             
                  #
         | 
| 31 31 | 
             
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 32 | 
            -
                  # @param _opts [Hash]  | 
| 32 | 
            +
                  # @param _opts [Hash] Plugin options
         | 
| 33 33 | 
             
                  #
         | 
| 34 34 | 
             
                  # @return [void]
         | 
| 35 35 | 
             
                  #
         | 
| @@ -42,7 +42,7 @@ class Serega | |
| 42 42 | 
             
                  # Runs callbacks after plugin was attached
         | 
| 43 43 | 
             
                  #
         | 
| 44 44 | 
             
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 45 | 
            -
                  # @param _opts [Hash]  | 
| 45 | 
            +
                  # @param _opts [Hash] Plugin options
         | 
| 46 46 | 
             
                  #
         | 
| 47 47 | 
             
                  # @return [void]
         | 
| 48 48 | 
             
                  #
         | 
| @@ -60,11 +60,31 @@ class Serega | |
| 60 60 | 
             
                    :root
         | 
| 61 61 | 
             
                  end
         | 
| 62 62 |  | 
| 63 | 
            +
                  # Checks requirements to load plugin
         | 
| 64 | 
            +
                  #
         | 
| 65 | 
            +
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 66 | 
            +
                  # @param opts [Hash] plugin options
         | 
| 67 | 
            +
                  #
         | 
| 68 | 
            +
                  # @return [void]
         | 
| 69 | 
            +
                  #
         | 
| 70 | 
            +
                  def self.before_load_plugin(serializer_class, **opts)
         | 
| 71 | 
            +
                    allowed_keys = %i[root root_one root_many]
         | 
| 72 | 
            +
                    opts.each_key do |key|
         | 
| 73 | 
            +
                      next if allowed_keys.include?(key)
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                      raise SeregaError,
         | 
| 76 | 
            +
                        "Plugin #{plugin_name.inspect} does not accept the #{key.inspect} option. Allowed options:\n" \
         | 
| 77 | 
            +
                        "  - :root [String, Symbol, nil] Specifies common root keyword used when serializing one or multiple objects\n" \
         | 
| 78 | 
            +
                        "  - :root_one [String, Symbol, nil] Specifies root keyword used when serializing one object\n" \
         | 
| 79 | 
            +
                        "  - :root_many [String, Symbol, nil] Specifies root keyword used when serializing multiple objects" \
         | 
| 80 | 
            +
                    end
         | 
| 81 | 
            +
                  end
         | 
| 82 | 
            +
             | 
| 63 83 | 
             
                  #
         | 
| 64 84 | 
             
                  # Applies plugin code to specific serializer
         | 
| 65 85 | 
             
                  #
         | 
| 66 86 | 
             
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 67 | 
            -
                  # @param _opts [Hash]  | 
| 87 | 
            +
                  # @param _opts [Hash] Plugin options
         | 
| 68 88 | 
             
                  #
         | 
| 69 89 | 
             
                  # @return [void]
         | 
| 70 90 | 
             
                  #
         | 
| @@ -78,7 +98,7 @@ class Serega | |
| 78 98 | 
             
                  # Adds config options and runs other callbacks after plugin was loaded
         | 
| 79 99 | 
             
                  #
         | 
| 80 100 | 
             
                  # @param serializer_class [Class<Serega>] Current serializer class
         | 
| 81 | 
            -
                  # @param opts [Hash]  | 
| 101 | 
            +
                  # @param opts [Hash] Plugin options
         | 
| 82 102 | 
             
                  #
         | 
| 83 103 | 
             
                  # @return [void]
         | 
| 84 104 | 
             
                  #
         | 
| @@ -102,9 +122,9 @@ class Serega | |
| 102 122 | 
             
                    #
         | 
| 103 123 | 
             
                    # Configures response root key
         | 
| 104 124 | 
             
                    #
         | 
| 105 | 
            -
                    # @param root [String, Symbol, nil] Specifies common root when serializing one or multiple objects
         | 
| 106 | 
            -
                    # @param one [String, Symbol, nil] Specifies root when serializing one object
         | 
| 107 | 
            -
                    # @param many [String, Symbol, nil] Specifies root when serializing multiple objects
         | 
| 125 | 
            +
                    # @param root [String, Symbol, nil] Specifies common root keyword used when serializing one or multiple objects
         | 
| 126 | 
            +
                    # @param one [String, Symbol, nil] Specifies root keyword used when serializing one object
         | 
| 127 | 
            +
                    # @param many [String, Symbol, nil] Specifies root keyword used when serializing multiple objects
         | 
| 108 128 | 
             
                    #
         | 
| 109 129 | 
             
                    # @return [Hash] Configured root names
         | 
| 110 130 | 
             
                    #
         | 
| @@ -27,7 +27,7 @@ class Serega | |
| 27 27 | 
             
                      validate(serializer_class, with) if with
         | 
| 28 28 | 
             
                      validate(serializer_class, except) if except
         | 
| 29 29 |  | 
| 30 | 
            -
                      raise_errors if any_error?
         | 
| 30 | 
            +
                      raise_errors(serializer_class) if any_error?
         | 
| 31 31 | 
             
                    end
         | 
| 32 32 |  | 
| 33 33 | 
             
                    private
         | 
| @@ -66,12 +66,19 @@ class Serega | |
| 66 66 | 
             
                    end
         | 
| 67 67 |  | 
| 68 68 | 
             
                    def save_error(name)
         | 
| 69 | 
            -
                       | 
| 70 | 
            -
                      error_attributes << full_attribute_name
         | 
| 69 | 
            +
                      error_attributes << build_full_attribute_name(*parents_names, name)
         | 
| 71 70 | 
             
                    end
         | 
| 72 71 |  | 
| 73 | 
            -
                    def  | 
| 74 | 
            -
                       | 
| 72 | 
            +
                    def build_full_attribute_name(*names)
         | 
| 73 | 
            +
                      head, *nested = *names
         | 
| 74 | 
            +
                      result = head.to_s # names are symbols, we need not frozen string
         | 
| 75 | 
            +
                      nested.each { |nested_name| result << "(" << nested_name.to_s }
         | 
| 76 | 
            +
                      nested.each { result << ")" }
         | 
| 77 | 
            +
                      result
         | 
| 78 | 
            +
                    end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                    def raise_errors(serializer_class)
         | 
| 81 | 
            +
                      raise Serega::AttributeNotExist.new("Not existing attributes: #{error_attributes.join(", ")}", serializer_class, error_attributes)
         | 
| 75 82 | 
             
                    end
         | 
| 76 83 |  | 
| 77 84 | 
             
                    def any_error?
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: serega
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.20.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Andrey Glushkov
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2024-02-25 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies: []
         | 
| 13 13 | 
             
            description: |
         | 
| 14 14 | 
             
              JSON Serializer
         | 
| @@ -54,6 +54,7 @@ files: | |
| 54 54 | 
             
            - lib/serega/plugins/batch/lib/modules/plan_point.rb
         | 
| 55 55 | 
             
            - lib/serega/plugins/batch/lib/plugins_extensions/activerecord_preloads.rb
         | 
| 56 56 | 
             
            - lib/serega/plugins/batch/lib/plugins_extensions/formatters.rb
         | 
| 57 | 
            +
            - lib/serega/plugins/batch/lib/plugins_extensions/if.rb
         | 
| 57 58 | 
             
            - lib/serega/plugins/batch/lib/plugins_extensions/preloads.rb
         | 
| 58 59 | 
             
            - lib/serega/plugins/batch/lib/validations/check_batch_opt_id_method.rb
         | 
| 59 60 | 
             
            - lib/serega/plugins/batch/lib/validations/check_batch_opt_loader.rb
         | 
| @@ -140,7 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 140 141 | 
             
                - !ruby/object:Gem::Version
         | 
| 141 142 | 
             
                  version: '0'
         | 
| 142 143 | 
             
            requirements: []
         | 
| 143 | 
            -
            rubygems_version: 3. | 
| 144 | 
            +
            rubygems_version: 3.5.6
         | 
| 144 145 | 
             
            signing_key:
         | 
| 145 146 | 
             
            specification_version: 4
         | 
| 146 147 | 
             
            summary: JSON Serializer
         |