Sha256: f6096a24b2afeeaf7fb77bcf231dafb92329f7965c53b23ebfb4892852bb13d9

Contents?: true

Size: 1.73 KB

Versions: 5

Compression:

Stored size: 1.73 KB

Contents

module Spec
  module Story
    class Step
      PARAM_PATTERN = /([^\\]|^)(\$(?!\$)\w*)/
      PARAM_OR_GROUP_PATTERN = /(\$(?!\$)\w*)|\(.*?\)/
      
      attr_reader :name
      
      def initialize(name, &block)
        init_name(name)
        init_expression(name)
        block_given? ? init_module(name, &block) : set_pending
      end

      def perform(instance, *args)
        raise Spec::Example::ExamplePendingError.new("Not Yet Implemented") if pending?
        instance.extend(@mod)
        instance.__send__(sanitize(@name), *args)
      end

      def matches?(name)
        !(matches = name.match(@expression)).nil?
      end
            
      def parse_args(name)
        name.match(@expression)[1..-1]
      end

      private
      
      def sanitize(a_string_or_regexp)
        return a_string_or_regexp.source if Regexp == a_string_or_regexp
        a_string_or_regexp.to_s
      end

      def init_module(name, &block)
        sanitized_name = sanitize(name)
        @mod = Module.new do
          define_method(sanitized_name, &block)
        end
      end
    
      def set_pending
        @pending = true
      end
      
      def pending?
        @pending == true
      end
      
      def init_name(name)
        @name = name
      end
    
      def init_expression(string_or_regexp)
        if String === string_or_regexp
          expression = string_or_regexp.dup
          %w<? ( ) [ ] { } ^ !>.each {|c| expression.gsub! c, "\\#{c}"}
        elsif Regexp === string_or_regexp
          expression = string_or_regexp.source
        end
        while expression =~ PARAM_PATTERN
          expression.gsub!($2, "(.*?)")
        end
        @expression = Regexp.new("\\A#{expression}\\Z", Regexp::MULTILINE)
      end

    end
  end
end

Version data entries

5 entries across 5 versions & 2 rubygems

Version Path
rspec-0.0.10 lib/spec/story/step.rb
spree-0.4.1 vendor/plugins/rspec/lib/spec/story/step.rb
spree-0.4.0 vendor/plugins/rspec/lib/spec/story/step.rb
spree-0.5.0 vendor/plugins/rspec/lib/spec/story/step.rb
spree-0.5.1 vendor/plugins/rspec/lib/spec/story/step.rb