suggest_rb 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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