Sha256: 9f220d2a153fc54c6388a8da8e19691e1f14696294c1b5d9538ce02dc492044f

Contents?: true

Size: 1.84 KB

Versions: 1

Compression:

Stored size: 1.84 KB

Contents

module StairMaster
  class Step
    attr_accessor :label, :path, :conditions

    def initialize(label, path, conditions)
      @label      = label
      @path       = path
      @conditions = build_conditions conditions
    end

    ## Methods --------------------------------------------

    def available?(context)
      rules   = @conditions[:availability]
      ( rules.empty? ? [true] : test_rules(rules, context) ).all?
    end

    def skip?(context)
      rules = @conditions[:skippable]
      ( rules.empty? ? [false] : test_rules(rules, context) ).all?
    end

    def test_rules(rules, context)
      results = []
      rules.each{ |condition| results << condition.test(context) }
      results
    end

    def url_for(resources=[], options={})
      begin
        Rails.application.routes.url_helpers.send @path.to_sym, resources, options
      rescue
        raise RuntimeError, "Could not find the route '#{ @path }' in your application."
      end
    end

    private # ---------------------------------------------

    def build_conditions(conditions)
      conditions          = conditions.empty? ? {} : conditions.first
      availability_rules  = []
      skip_rules          = []

      conditions.each do |k,v|
        condition_type, type = k.to_s.split('_').map{ |v| v.to_sym }

        if condition_type == :available ## It is an "availability" condition
          availability_rules << ::StairMaster::Conditions::Availability.new(self, type, v)
        elsif condition_type == :skip   ## It is a "skip" condition
          skip_rules << ::StairMaster::Conditions::Skippable.new(self, type, v)
        else
          ## We don't know what this type of condition is so raise an exception
          raise RuntimeError, "Unknown type for: #{ k }"
        end
      end

      { availability: availability_rules, skippable: skip_rules }
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
stair_master-0.0.1 lib/stair_master/step.rb