我有一个简单的库,旨在为rails项目创建安全的slu .. RSpec测试如下所示:
RSpec.describe SlugSupport do
it 'filters out punctuation' do
expect(SlugSupport.slugify('`~!@#$%^&*()_+-={}|[]\:",./<>?:\'\/\\')).to be_nil
end
end
,实现如下:
class SlugSupport
def self.slugify str
slug = str.to_s.downcase.strip
tmp = slug.gsub(/[[:punct:]\s`$<>^|+=~]+/, '-').gsub(/^[-]+/, '')
tmp.empty? ? nil : tmp
end
end
通过此实施,测试可以正常进行,但会产生警告。
lib/slug_support.rb:8: warning: character class has duplicated range: /[[:punct:]\s`$<>^|+=~]+/
但是,当我从正则表达式
中删除其他字符时slug.gsub(/[[:punct:]\s]+/, '-').gsub(/^[-]+/, '')
我没有收到任何警告,但测试失败了:
1) SlugSupport filters out punctuation
Failure/Error: expect(SlugSupport.slugify('`~!@#$%^&*()_+-={}|[]\:",./<>?:\'\/\\')).to be_nil
expected: nil
got: "`~-$-^-+-=-|-<>-"
# ./spec/lib/slug_support_spec.rb:12:in `block (2 levels) in <top (required)>'
从其他SO问题(例如Why does Ruby /[[:punct:]]/ miss some punctuation characters?),我认为[:punct]字符组对我的语言环境的行为正确。所以问题是:警告不正确吗?并且,如果警告不正确,堆栈的哪个部分会生成警告,RSpec,Rails或Ruby?
答案 0 :(得分:1)
我在我的语言环境中没有收到警告,但我认为并非所有字符都在IBla[]
中。只需删除那些;你可以使用这样的东西来弄清楚它们是:
[[:punct:]]