lib/suggest.rb in suggest_rb-0.1.0 vs lib/suggest.rb in suggest_rb-0.2.0
- old
+ new
@@ -1,25 +1,45 @@
require "suggest/version"
require "set"
module Suggest
- SUGGEST_MODS = Set.new([Array, Enumerable, String, Hash, Regexp, Integer])
- UNSAFE = Set.new([Array.instance_method(:cycle)])
+ SUGGEST_MODS = Set.new([
+ Array,
+ Enumerable,
+ String,
+ Hash,
+ Regexp,
+ Integer,
+ Set
+ ])
+ UNSAFE_WITH_BLOCK = Set.new([
+ [Array, :cycle],
+ [Enumerable, :cycle]
+ ])
+
+ INCONSISTENT = Set.new([
+ [Array, :sample],
+ [Array, :shuffle],
+ [Array, :shuffle!]
+ ])
+
module Mixin
def what_returns?(expected, args: [], allow_mutation: false)
block = Proc.new if block_given?
- applicable_methods = self.methods.map(&method(:method)).select { |m| SUGGEST_MODS.include?(m.owner) }
+ applicable_methods = self.methods.map(&method(:method)).select do |m|
+ SUGGEST_MODS.include?(m.owner) && !INCONSISTENT.include?([m.owner, m.name])
+ end
applicable_methods.select do |m|
arity = m.arity
next unless arity == -1 || arity == args.count
post = clone
if block
- next if UNSAFE.include?(m.unbind)
+ next if UNSAFE_WITH_BLOCK.include?([m.owner, m.name])
result = post.public_send(m.name, *args, &block) rescue next
else
result = post.public_send(m.name, *args) rescue next
end
@@ -31,18 +51,20 @@
def what_mutates?(expected, opts = {})
args = opts[:args] || []
block = Proc.new if block_given?
- applicable_methods = self.methods.map(&method(:method)).select { |m| SUGGEST_MODS.include?(m.owner) }
+ applicable_methods = self.methods.map(&method(:method)).select do |m|
+ SUGGEST_MODS.include?(m.owner) && !INCONSISTENT.include?([m.owner, m.name])
+ end
applicable_methods.select do |m|
arity = m.arity
next unless arity == -1 || arity == args.count
post = clone
if block
- next if UNSAFE.include?(m.unbind)
+ next if UNSAFE_WITH_BLOCK.include?([m.owner, m.name])
result = post.public_send(m.name, *args, &block) rescue next
else
result = post.public_send(m.name, *args) rescue next
end