Sha256: 75495d14e275fe1fbcf9fa8d58ae2c655b2d33b8940d0b1295229bf773b6f12a

Contents?: true

Size: 1.4 KB

Versions: 3

Compression:

Stored size: 1.4 KB

Contents

# frozen_string_literal: true

require 'active_support/core_ext/array/wrap'
require 'active_support/core_ext/object/try'

class ActiveSet
  class Instructions
    class Entry
      class KeyPath
        attr_reader :path

        def initialize(path)
          # `path` can be an Array (e.g. [:parent, :child, :grandchild])
          # or a String (e.g. 'parent.child.grandchild')
          @path = Array.wrap(path).map(&:to_s).flat_map { |x| x.split('.') }
        end

        def attribute
          attribute = @path.last
          return attribute.sub(operator_regex, '') if attribute.match operator_regex
          attribute
        end

        def operator
          attribute = @path.last
          return attribute[operator_regex, 1] if attribute.match operator_regex
          '=='
        end

        def associations_array
          @path.slice(0, @path.length - 1)
        end

        def associations_hash
          associations_array.reverse.reduce({}) { |a, e| { e => a } }
        end

        def value_for(item:)
          resource_for(item: item).send(attribute)
        rescue
          nil
        end

        def resource_for(item:)
          associations_array.reduce(item, :try)
        rescue
          nil
        end

        def titleized
          @path.map(&:titleize).join(' ')
        end

        private

        def operator_regex
          /\((.*?)\)/
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
activeset-0.4.4 lib/active_set/instructions/entry/keypath.rb
activeset-0.4.3 lib/active_set/instructions/entry/keypath.rb
activeset-0.4.2 lib/active_set/instructions/entry/keypath.rb