Module: Testrbl

Defined in:
lib/testrbl.rb,
lib/testrbl/version.rb

Constant Summary collapse

PATTERNS =
[
  /^(\s+)(should|test|it)(\s+|\s*\(\s*)['"](.*)['"](\s*\))?\s+do\s*(?:#.*)?$/,
  /^(\s+)(context|describe)(\s+|\s*\(\s*)['"]?(.*?)['"]?(\s*\))?\s+do\s*(?:#.*)?$/,
  /^(\s+)def(\s+)(test_)([a-z_\d]+)\s*(?:#.*)?$/
]
OPTION_WITH_ARGUMENT =
["-I", "-r", "-n", "--name", "-e", "--exclude", "-s", "--seed"]
INTERPOLATION =
/\\\#\\\{.*?\\\}/
VERSION =
'1.0.0'

Class Method Summary collapse

Class Method Details

.filter_duplicate_final(patterns) ⇒ Object

only keep 1 pattern that stops matching via $



66
67
68
69
# File 'lib/testrbl.rb', line 66

def filter_duplicate_final(patterns)
  found_final = 0
  patterns.reject { |p| p.end_with?("$") and (found_final += 1) > 1 }
end

.line_pattern_option(file, line) ⇒ Object

overwritten by maxitest to just return line



44
45
46
# File 'lib/testrbl.rb', line 44

def line_pattern_option(file, line)
  [file, "-n", "/#{pattern_from_file(File.readlines(file), line)}/"]
end

.pattern_from_file(lines, line) ⇒ Object

usable via external tools like zeus



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/testrbl.rb', line 49

def pattern_from_file(lines, line)
  possible_lines = lines[0..(line.to_i-1)].reverse

  found = possible_lines.map { |line| test_pattern_from_line(line) || block_start_from_line(line) }.compact

  # pattern and the groups it is nested under (like describe - describe - it)
  last_spaces = " " * 100
  patterns = found.select do |spaces, name|
    last_spaces = spaces if spaces.size < last_spaces.size
  end.map(&:last).compact

  return filter_duplicate_final(patterns).reverse.join(".*") if found.size > 0

  raise "no test found before line #{line}"
end

.run_from_cli(argv) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/testrbl.rb', line 14

def run_from_cli(argv)
  files, options = partition_argv(argv)
  files.concat(changed_files) if options.delete("--changed")
  files = ["test"] if files.empty?
  files = files.map { |f| localize(f) }
  load_options, options = partition_options(options)

  if files.size == 1 and files.first =~ /^(\S+):(\d+)$/
    file = $1
    line = $2
    run(ruby + load_options + line_pattern_option(file, line) + options)
  else
    if files.size == 1 and File.file?(files.first)
      run(ruby + load_options + files + options)
    elsif options.none? { |arg| arg =~ /^-n/ }
      seed = if seed = options.index("--seed")
        ["--"] + options.slice!(seed, 2)
      else
        []
      end
      files = files.map { |f| File.directory?(f) ? all_test_files_in(f) : f }.flatten
      run(ruby + load_options + files.map { |f| "-r#{f}" } + options + ["-e", ""] + seed)
    else # pass though
      # no bundle exec: projects with mini and unit-test do not run well via bundle exec testrb
      run ["testrb"] + argv
    end
  end
end