Class: Spec::Translator

Class | Spec::Translator
In: | lib/spec/translator.rb
Parent: | Object

### Methods

standard_matcher? translate translate_dir translate_file translate_line

### Public Instance methods

standard_matcher?(matcher)

[Source]

         # 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

translate(from, to)

[Source]

        # 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

translate_dir(from, to)

[Source]

        # 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

translate_file(from, to)

[Source]

        # 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

translate_line(line)

[Source]

        # 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

[Validate]