Sha256: 2804a86f0c86b5ed25b25315ccdd6e5265cafc2dbb2236ade15c67bd8e89db00

Contents?: true

Size: 1.62 KB

Versions: 25

Compression:

Stored size: 1.62 KB

Contents

# frozen_string_literal: true

module Decidim
  module Attributes
    # Custom attributes value to represent an Array.
    class Array < ActiveModel::Type::Value
      attr_reader :value_type, :default

      def initialize(value_type: ::Object, default: [])
        @value_type = value_type
        @default = default
      end

      def type # :nodoc:
        :array
      end

      # The value would not be cast in case it is nil by default. We also want
      # to cast the nil values to the default values.
      def cast(value)
        cast_value(value)
      end

      # The nested validator should be only added for those attributes that
      # inherit from the AttributeObject::Model type. Otherwise this would be
      # also added e.g. for ActiveRecord objects which would cause unexpected
      # validation errors.
      #
      # The hash type inherits from the array type, so this covers both cases.
      def validate_nested?
        return false unless value_type.is_a?(Class)

        (value_type < Decidim::AttributeObject::Model) == true
      end

      private

      def cast_value(value)
        value ||= default.dup

        if value.is_a?(::Hash)
          value = value.values
        elsif !value.is_a?(::Array)
          value =
            if value.respond_to?(:to_a)
              value.to_a
            else
              [value]
            end
        end

        value.map { |v| primitive_value(v, value_type) }
      end

      def primitive_value(value, type)
        return type.cast(value) if type.is_a?(ActiveModel::Type::Value)

        Decidim::AttributeObject.type(type).cast(value)
      end
    end
  end
end

Version data entries

25 entries across 25 versions & 1 rubygems

Version Path
decidim-core-0.29.1 lib/decidim/attributes/array.rb
decidim-core-0.28.4 lib/decidim/attributes/array.rb
decidim-core-0.27.9 lib/decidim/attributes/array.rb
decidim-core-0.29.0 lib/decidim/attributes/array.rb
decidim-core-0.28.3 lib/decidim/attributes/array.rb
decidim-core-0.27.8 lib/decidim/attributes/array.rb
decidim-core-0.29.0.rc4 lib/decidim/attributes/array.rb
decidim-core-0.29.0.rc3 lib/decidim/attributes/array.rb
decidim-core-0.29.0.rc2 lib/decidim/attributes/array.rb
decidim-core-0.29.0.rc1 lib/decidim/attributes/array.rb
decidim-core-0.28.2 lib/decidim/attributes/array.rb
decidim-core-0.27.7 lib/decidim/attributes/array.rb
decidim-core-0.28.1 lib/decidim/attributes/array.rb
decidim-core-0.27.6 lib/decidim/attributes/array.rb
decidim-core-0.28.0 lib/decidim/attributes/array.rb
decidim-core-0.27.5 lib/decidim/attributes/array.rb
decidim-core-0.28.0.rc5 lib/decidim/attributes/array.rb
decidim-core-0.28.0.rc4 lib/decidim/attributes/array.rb
decidim-core-0.27.4 lib/decidim/attributes/array.rb
decidim-core-0.27.3 lib/decidim/attributes/array.rb