3

次の仕様が必要だとします。

it { should allow_value("git://host.xz/path/to/repo.git/").for(:url) }
it { should allow_value("git://user@host.xz/path/to/repo.git/").for(:url) }
it { should allow_value("git://host.xz:123/path/to/repo.git/").for(:url) }
it { should allow_value("git://user@host.xz:123/path/to/repo.git/").for(:url) }
...

私が書くことができれば、それはより簡単でよりコンパクトになるでしょう:

"git://{user@,}host.xz{:123,}/path/to/repo.git".expand.each do |p|
  it { should allow_value(p).for(:url) }
end

またはさらに良い:

"{git,ssh,http,https,rsync}://[user@]host.xz[:123]/path/to/repo.git[/]".expand.each do |p|
  it { should allow_value(p).for(:url) }
end

Rubyでこれを実現する方法は何ですか?

編集 最初に試したのはbracecompでしたが、1.9.3では動作しませんでした。

[1] pry(main)> require 'bracecomp'
[2] pry(main)> 'server-{a,b}-{07..10}'.expand
TypeError: scan() yielded Symbol (must be Array[2])
from bracecomp.y:66:in `scan'
4

2 に答える 2

4

どうですか

%w[git ssh http https rsync].product(['user@', nil], [':123', nil]).each do |protocol, user, port|
  it { should allow_value("#{protocol}://#{user}host.xz#{port}/path/to/repo.git").for(:url) }
end

外部ライブラリへの依存はなく、すべてのRuby開発者が理解できます。

これはスペックヘルパーやカスタムマッチャーにとっては悲鳴を上げるものですが、私は思います。

于 2013-01-07T16:06:11.683 に答える
1

bracecomp-0.1.2は、ブレース拡張を実行するために使用できます。以下は、gemのホームページから抜粋した例です。

require 'bracecomp'
p 'server-{a,b}-{07..10}'.expand
#=> ["server-a-07", "server-a-08", "server-a-09", "server-a-10", "server-b-07", "server-b-08", "server-b-09", "server-b-10"]
p 'zone-{a..c}'.expand
#=> ["zone-a", "zone-b", "zone-c"]
于 2013-01-17T16:35:27.900 に答える