Sha256: 2a8a83adf2bb3e4df091b5b3d132889d400c5d08b42db8805a70c0a9490c1347

Contents?: true

Size: 943 Bytes

Versions: 2

Compression:

Stored size: 943 Bytes

Contents

require "active_support/core_ext/hash/keys"

module PageEz
  class Options
    def self.merge(options, dynamic_options = nil, *args)
      dynamic_options ||= -> { {} }

      keys_to_extract = dynamic_options.parameters.filter_map do |type, name|
        if type == :keyreq || type == :key
          name
        end
      end

      if args.last.is_a?(Hash)
        if dynamic_options.arity == 0
          options.merge(*args)
        else
          kwargs = args.pop

          if keys_to_extract.empty?
            options.merge(dynamic_options.call(*args, **kwargs))
          else
            sliced = kwargs.slice(*keys_to_extract)
            except = kwargs.except(*keys_to_extract)
            options.merge(
              dynamic_options.call(*args, **sliced)
            ).merge(
              except
            )
          end
        end
      else
        options.merge(dynamic_options.call(*args))
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
page_ez-0.2.0 lib/page_ez/options.rb
page_ez-0.1.0 lib/page_ez/options.rb