| Class | Spec::Translator |
| In: |
lib/spec/translator.rb
|
| Parent: | Object |
# File lib/spec/translator.rb, line 88
88: def standard_matcher?(matcher)
89: patterns = [
90: /^be/,
91: /^be_close/,
92: /^eql/,
93: /^equal/,
94: /^has/,
95: /^have/,
96: /^change/,
97: /^include/,
98: /^match/,
99: /^raise_error/,
100: /^respond_to/,
101: /^redirect_to/,
102: /^satisfy/,
103: /^throw_symbol/,
104: # Extra ones that we use in spec_helper
105: /^pass/,
106: /^fail/,
107: /^fail_with/,
108: ]
109: matched = patterns.detect{ |p| matcher =~ p }
110: !matched.nil?
111: end
# File lib/spec/translator.rb, line 5
5: def translate(from, to)
6: from = File.expand_path(from)
7: to = File.expand_path(to)
8: if File.directory?(from)
9: translate_dir(from, to)
10: elsif(from =~ /\.rb$/)
11: translate_file(from, to)
12: end
13: end
# File lib/spec/translator.rb, line 15
15: def translate_dir(from, to)
16: FileUtils.mkdir_p(to) unless File.directory?(to)
17: Dir["#{from}/*"].each do |sub_from|
18: path = sub_from[from.length+1..-1]
19: sub_to = File.join(to, path)
20: translate(sub_from, sub_to)
21: end
22: end
# File lib/spec/translator.rb, line 24
24: def translate_file(from, to)
25: translation = ""
26: File.open(from) do |io|
27: io.each_line do |line|
28: translation << translate_line(line)
29: end
30: end
31: File.open(to, "w") do |io|
32: io.write(translation)
33: end
34: end
# File lib/spec/translator.rb, line 36
36: def translate_line(line)
37: # Translate deprecated mock constraints
38: line.gsub!(/:any_args/, 'any_args')
39: line.gsub!(/:anything/, 'anything')
40: line.gsub!(/:boolean/, 'boolean')
41: line.gsub!(/:no_args/, 'no_args')
42: line.gsub!(/:numeric/, 'an_instance_of(Numeric)')
43: line.gsub!(/:string/, 'an_instance_of(String)')
44:
45: return line if line =~ /(should_not|should)_receive/
46:
47: line.gsub!(/(^\s*)context([\s*|\(]['|"|A-Z])/, '\1describe\2')
48: line.gsub!(/(^\s*)specify([\s*|\(]['|"|A-Z])/, '\1it\2')
49: line.gsub!(/(^\s*)context_setup(\s*[do|\{])/, '\1before(:all)\2')
50: line.gsub!(/(^\s*)context_teardown(\s*[do|\{])/, '\1after(:all)\2')
51: line.gsub!(/(^\s*)setup(\s*[do|\{])/, '\1before(:each)\2')
52: line.gsub!(/(^\s*)teardown(\s*[do|\{])/, '\1after(:each)\2')
53:
54: if line =~ /(.*\.)(should_not|should)(?:_be)(?!_)(.*)/m
55: pre = $1
56: should = $2
57: post = $3
58: be_or_equal = post =~ /(<|>)/ ? "be" : "equal"
59:
60: return "#{pre}#{should} #{be_or_equal}#{post}"
61: end
62:
63: if line =~ /(.*\.)(should_not|should)_(?!not)\s*(.*)/m
64: pre = $1
65: should = $2
66: post = $3
67:
68: post.gsub!(/^raise/, 'raise_error')
69: post.gsub!(/^throw/, 'throw_symbol')
70:
71: unless standard_matcher?(post)
72: post = "be_#{post}"
73: end
74:
75: # Add parenthesis
76: post.gsub!(/^(\w+)\s+([\w|\.|\,|\(.*\)|\'|\"|\:|@| ]+)(\})/, '\1(\2)\3') # inside a block
77: post.gsub!(/^(redirect_to)\s+(.*)/, '\1(\2)') # redirect_to, which often has http:
78: post.gsub!(/^(\w+)\s+([\w|\.|\,|\(.*\)|\{.*\}|\'|\"|\:|@| ]+)/, '\1(\2)')
79: post.gsub!(/(\s+\))/, ')')
80: post.gsub!(/\)\}/, ') }')
81: post.gsub!(/^(\w+)\s+(\/.*\/)/, '\1(\2)') #regexps
82: line = "#{pre}#{should} #{post}"
83: end
84:
85: line
86: end