RSpeC语言 从'should'升级到'expect'语法的脚本?



我有数百个文件,其中也有数百个"应该"语句。

有没有一种自动方法可以将这些文件更新为新语法?

我想要既可以创建新文件又可以内联修改现有文件的选项。

sed 是一个很好的工具。

以下内容将处理当前目录中的所有文件,并将它们写出到_spec_seded目录中的新文件中。 这目前处理大约 99%+ 的更改,但仍可能让您需要进行一些手动更改(数量取决于您的代码和编码风格)。

与 sed 脚本一样,您应该检查结果、运行差异并手动查看文件。 理想情况下,您使用的是 git,这有助于使差异更加容易。

filenum=1
find . -type f -name '*_spec.rb' | while read file; do
  mkdir -p ../_spec_seded/"${file%/*}"
  echo "next file...$filenum...$file"
  let filenum+=1
  cp "$file" ../_spec_seded/"$file"
  sed -i '                           # Exclude:
/^ *describe .*do/! {                # -describe...do descriptions
  /^ *it .*do/! {                    # -it...do descriptions
    /^[[:blank:]]*#/! {             # -comments
      /^ *def .*.should.*/! {       # -inline methods
        /.should/ {
          s/.should/).to/                      # Change .should to .to
          s/(S)/expect(1/                    # Add expect( at start of line.
          /.to( |_not )>=/ s/>=/be >=/    # Change operators for
          /.to( |_not )>[^=]/ s/>/be >/      # >, >=, <, <= and !=
          /.to( |_not )<=/ s/<=/be <=/
          /.to( |_not )<[^=]/ s/</be </
          /.to( |_not )!=/ s/!=/be !=/
        }
        /.to +==( +|$)/ s/==/eq/
        /=~/ {                                      # Change match operator
          s/=~/match(/
          s/$/ )/
          s/[ )$/[/
        }
        s/[^}.to|end.to].to /).to /                 # Add paren
        /eq ({.*} )/ s/ ({/ ( {/                     # Add space
        /to(_|_not_)receive/ s/_receive/ receive/ # receive
        /.to eq [.*]/ {
          s/ eq [/ match_array([/
          s/]$/])/
        }
        /expect.*(.*lambda.*{.*})/ {                 # Remove unneeded lambdas
          s/( *lambda *{/{/
          s/ }).to / }.to /
        }
        /expect *{ *.*(.*) *}).to/ {                  # Fix extra end paren
          s/}).to/}.to/
        }
      }
    }
  }
}' ../_spec_seded/"$file"
done

请谨慎使用。 目前,该脚本在_seded/中创建新文件,以便首先进行安全审查。 脚本放置在/spec目录中并从那里运行。如果您有数百个文件,这可以为您节省数小时或数天的工作时间!如果您使用它,我建议"步骤 2"是手动将文件从 _spec_seded 复制到 spec 本身并运行它们。 我建议您不要只是重命名整个目录。 首先,文件(例如spec_helper.rb)当前未复制到_spec_seded

2013/11/18 注意:我继续升级此脚本。 覆盖更多边缘情况,并使匹配更具体,并排除更多边缘情况,例如注释行。

附言应该审查的差异可以看到(从项目目录根目录):

diff -r /spec /_spec_seded

git 也有很好的差异选项,但我喜欢在将文件添加到 git 之前先看看。

迟来的更新,主要针对那些可能通过搜索引擎找到此页面的人。

为此,请使用Yuji Nakayama的优质Transpec宝石。我已经在不同的项目中使用了 10 多次,没有问题。

从网站:

Transpec 可让您立即将 RSpec 2 规范升级到 RSpec 3。它支持几乎所有 RSpec 3 更改的转换,并且由 RSpec 团队推荐。

此外,即使您现在不打算将其升级到 RSpec 3,您也可以在 RSpec 2 项目中使用它。

最新更新