| Class | Spec::Runner::SpecParser |
| In: |
lib/spec/runner/spec_parser.rb
|
| Parent: | Object |
Parses a spec file and finds the nearest example for a given line number.
# File lib/spec/runner/spec_parser.rb, line 5
5: def spec_name_for(io, line_number)
6: source = io.read
7: behaviour, behaviour_line = behaviour_at_line(source, line_number)
8: example, example_line = example_at_line(source, line_number)
9: if behaviour && example && (behaviour_line < example_line)
10: "#{behaviour} #{example}"
11: elsif behaviour
12: behaviour
13: else
14: nil
15: end
16: end
# File lib/spec/runner/spec_parser.rb, line 20
20: def behaviour_at_line(source, line_number)
21: find_above(source, line_number, /^\s*(context|describe)\s+(.*)\s+do/)
22: end
# File lib/spec/runner/spec_parser.rb, line 24
24: def example_at_line(source, line_number)
25: find_above(source, line_number, /^\s*(specify|it)\s+(.*)\s+do/)
26: end
Returns the context/describe or specify/it name and the line number
# File lib/spec/runner/spec_parser.rb, line 29
29: def find_above(source, line_number, pattern)
30: lines_above_reversed(source, line_number).each_with_index do |line, n|
31: return [parse_description($2), line_number-n] if line =~ pattern
32: end
33: nil
34: end
# File lib/spec/runner/spec_parser.rb, line 36
36: def lines_above_reversed(source, line_number)
37: lines = source.split("\n")
38: lines[0...line_number].reverse
39: end