suggest_rb 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +8 -0
- data/lib/suggest.rb +46 -5
- data/lib/suggest/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e4b15e6cb0b18984749d2abbdd32835774de3e480374dfc3d4a9dd7393f1b208
|
4
|
+
data.tar.gz: 71444761f35ef08b561a0e3f5cfc8c84061ab9ddc974f494f99bd0b2b42b163b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 42fd7d3197b65a1c708533545f16c8f395574a26275fa48a32bcf26589e98b5c98e8aedbbc79201a98ec582da2b1253d6122b1907722d6588480aa039d88ee30
|
7
|
+
data.tar.gz: daa3d40c2ca895d59552d6ae4dc9c6dd37619e8647493e74d1bdc8ac0202dbadddecb80f723f4c7494e9b6a4eb26ef1bbbb0ccd7ddaecfaad056a00e08ffbf08
|
data/README.md
CHANGED
@@ -56,3 +56,11 @@ require 'suggest'
|
|
56
56
|
[1,2,3,4].what_mutates? [2,4] { |n| n % 2 == 0 }
|
57
57
|
=> [:select!, :keep_if]
|
58
58
|
```
|
59
|
+
|
60
|
+
## Note to Self
|
61
|
+
|
62
|
+
Snippet to use in `bin/console` for finding methods for blacklisting:
|
63
|
+
|
64
|
+
```
|
65
|
+
Suggest::SUGGEST_MODS.flat_map { |k| [k].product(k.instance_methods) }.select { |k, v| v == :rand }.map { |k, v| k.instance_method(v).owner }.uniq
|
66
|
+
```
|
data/lib/suggest.rb
CHANGED
@@ -4,12 +4,26 @@ require "set"
|
|
4
4
|
module Suggest
|
5
5
|
SUGGEST_MODS = Set.new([
|
6
6
|
Array,
|
7
|
+
BasicObject,
|
8
|
+
Comparable,
|
9
|
+
Complex,
|
7
10
|
Enumerable,
|
8
|
-
|
11
|
+
FalseClass,
|
12
|
+
Float,
|
9
13
|
Hash,
|
10
|
-
Regexp,
|
11
14
|
Integer,
|
12
|
-
|
15
|
+
Math,
|
16
|
+
NilClass,
|
17
|
+
Numeric,
|
18
|
+
Range,
|
19
|
+
Regexp,
|
20
|
+
Regexp,
|
21
|
+
Set,
|
22
|
+
String,
|
23
|
+
Struct,
|
24
|
+
Symbol,
|
25
|
+
Time,
|
26
|
+
TrueClass,
|
13
27
|
])
|
14
28
|
|
15
29
|
UNSAFE_WITH_BLOCK = Set.new([
|
@@ -23,12 +37,24 @@ module Suggest
|
|
23
37
|
[Array, :shuffle!]
|
24
38
|
])
|
25
39
|
|
40
|
+
TOO_COMPLICATED = Set.new([
|
41
|
+
[String, :freeze],
|
42
|
+
[Set, :freeze],
|
43
|
+
[Set, :taint],
|
44
|
+
[Set, :untaint],
|
45
|
+
[Numeric, :singleton_method_added],
|
46
|
+
[Numeric, :clone],
|
47
|
+
[Numeric, :dup],
|
48
|
+
])
|
49
|
+
|
26
50
|
module Mixin
|
27
51
|
def what_returns?(expected, args: [], allow_mutation: false)
|
28
52
|
block = Proc.new if block_given?
|
29
53
|
|
30
54
|
applicable_methods = self.methods.map(&method(:method)).select do |m|
|
31
|
-
SUGGEST_MODS.include?(m.owner) &&
|
55
|
+
SUGGEST_MODS.include?(m.owner) &&
|
56
|
+
!INCONSISTENT.include?([m.owner, m.name]) &&
|
57
|
+
!TOO_COMPLICATED.include?([m.owner, m.name])
|
32
58
|
end
|
33
59
|
|
34
60
|
applicable_methods.select do |m|
|
@@ -54,7 +80,9 @@ module Suggest
|
|
54
80
|
block = Proc.new if block_given?
|
55
81
|
|
56
82
|
applicable_methods = self.methods.map(&method(:method)).select do |m|
|
57
|
-
SUGGEST_MODS.include?(m.owner) &&
|
83
|
+
SUGGEST_MODS.include?(m.owner) &&
|
84
|
+
!INCONSISTENT.include?([m.owner, m.name]) &&
|
85
|
+
!TOO_COMPLICATED.include?([m.owner, m.name])
|
58
86
|
end
|
59
87
|
|
60
88
|
applicable_methods.select do |m|
|
@@ -81,6 +109,19 @@ module Suggest
|
|
81
109
|
def self.eq?(result, expected)
|
82
110
|
result.is_a?(expected.class) && result == expected
|
83
111
|
end
|
112
|
+
|
113
|
+
def self.suggestable_methods
|
114
|
+
candidates = []
|
115
|
+
SUGGEST_MODS.each do |mod|
|
116
|
+
owned_methods = mod.instance_methods.select { |m| mod.instance_method(m).owner == mod }
|
117
|
+
next if owned_methods.none?
|
118
|
+
candidates += [mod].product(owned_methods)
|
119
|
+
end
|
120
|
+
|
121
|
+
candidates.reject do |m|
|
122
|
+
INCONSISTENT.include?(m) || TOO_COMPLICATED.include?(m)
|
123
|
+
end
|
124
|
+
end
|
84
125
|
end
|
85
126
|
|
86
127
|
Object.include(Suggest::Mixin)
|
data/lib/suggest/version.rb
CHANGED