lib/yard/code_objects/step_transformer.rb in yard-cucumber-2.0.3 vs lib/yard/code_objects/step_transformer.rb in yard-cucumber-2.1.0

- old
+ new

@@ -5,47 +5,91 @@ include Cucumber::LocationHelper attr_reader :constants, :keyword, :source, :value, :literal_value attr_accessor :steps - + + # This defines an escape pattern within a string or regex: + # /^the first #{CONSTANT} step$/ + # + # This is used below in the value to process it if there happen to be + # constants defined here. + # + # @note this does not handle the result of method calls + # @note this does not handle multiple constants within the same escaped area + # ESCAPE_PATTERN = /#\{\s*(\w+)\s*\}/ unless defined?(ESCAPE_PATTERN) + # + # When requesting a step tranformer object value, process it, it it hasn't + # alredy been processed, replacing any constants that may be lurking within + # the value. + # + # Processing it means looking for any escaped characters that happen to be + # CONSTANTS that could be matched and then replaced. This is done recursively + # as CONSTANTS can be defined with more CONSTANTS. + # + def value + unless @processed + @processed = true + until (nested = constants_from_value).empty? + nested.each {|n| @value.gsub!(value_regex(n),find_value_for_constant(n)) } + end + end + + @value + end + + # + # Set the literal value and the value of the step definition. + # + # The literal value is as it appears in the step definition file with any + # constants. The value, when retrieved will attempt to replace those + # constants with their regex or string equivalents to hopefully match more + # steps and step definitions. + # + # def value=(value) @literal_value = format_source(value) @value = format_source(value) - until (nested = constants_from_value).empty? - nested.each {|n| @value.gsub!(value_regex(n),find_value_for_constant(n)) } - end - @steps = [] + value end + # Generate a regex with the step transformers value def regex - @regex ||= /#{strip_regex_from(@value)}/ + @regex ||= /#{strip_regex_from(value)}/ end - + + # Look through the specified data for the escape pattern and return an array + # of those constants found. This defaults to the @value within step transformer + # as it is used internally, however, it can be called externally if it's + # needed somewhere. def constants_from_value(data=@value) data.scan(ESCAPE_PATTERN).flatten.collect { |value| value.strip } end protected + # + # Looking through all the constants in the registry and returning the value + # with the regex items replaced from the constnat if present + # def find_value_for_constant(name) constant = YARD::Registry.all(:constant).find{|c| c.name == name.to_sym } log.warn "StepTransformer#find_value_for_constant : Could not find the CONSTANT [#{name}] using the string value." unless constant constant ? strip_regex_from(constant.value) : name end + # Return a regex of the value def value_regex(value) /#\{\s*#{value}\s*\}/ end + # Step the regex starting / and ending / from the value def strip_regex_from(value) value.gsub(/^\/|\/$/,'') end - - end end \ No newline at end of file