methodfinder 1.1.1 → 1.2.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.
Files changed (3) hide show
  1. data/README.markdown +43 -19
  2. data/lib/methodfinder.rb +36 -22
  3. metadata +2 -2
data/README.markdown CHANGED
@@ -1,22 +1,18 @@
1
1
  Description
2
2
  ---
3
3
 
4
- This project was inspired by Smalltalk's Method Finder.
5
-
6
- Provided with a receiver, a desired result and possibly some
7
- arguments, `MethodFinder.find` will list all methods that produce the
8
- given result when called on the receiver with the provided arguments.
9
-
10
- This gem also adds `Object#find_method`, which besides offering an
11
- alternate interface to pretty much the same functionality, also allows
12
- you to test for state other than the return value of the method.
13
-
14
- All of this probably sounds more complicated than it really is, just
15
- look at the examples below.
4
+ This project was originally inspired by Smalltalk's Method Finder, but
5
+ additonal features were added over time.
16
6
 
17
7
  Usage
18
8
  ---
19
9
 
10
+ ### MethodFinder.find
11
+
12
+ Provided with a receiver, the desired result and possibly some
13
+ arguments, `MethodFinder.find` will list all methods that produce the
14
+ given result when called on the receiver with the provided arguments.
15
+
20
16
  >> MethodFinder.find(10,1,3)
21
17
  => [:%, :<=>, :>>, :[], :modulo, :remainder]
22
18
  >> MethodFinder.find("abc","ABC")
@@ -26,9 +22,12 @@ Usage
26
22
  >> MethodFinder.find(['a','b','c'],['A','B','C']) { |x| x.upcase }
27
23
  => [:collect, :collect!, :map, :map!]
28
24
 
29
- Thanks to a
30
- [suggestion](https://github.com/citizen428/methodfinder/issues/closed#issue/3)
31
- by Ryan Bates, this gem now also provides an alternative interface:
25
+ ### Object#find_method
26
+
27
+ This gem also adds `Object#find_method`, which besides offering an
28
+ alternate interface to pretty much the same functionality as
29
+ `MethodFinder.find`, also allows you to test for state other than
30
+ the return value of the method.
32
31
 
33
32
  >> %w[a b c].find_method { |a| a.unknown(1) ; a == %w[a c] }
34
33
  => [:delete_at, :slice!]
@@ -39,6 +38,30 @@ Inside `find_method`'s block, the receiver is available as block
39
38
  argument and the special method `unknown` is used as a placeholder for
40
39
  the desired method.
41
40
 
41
+ ### MethodFinder.find\_classes\_and_modules
42
+
43
+ A simple method to return all currently defined modules and classes.
44
+
45
+ >> MethodFinder.find_classes_and_modules
46
+ => [ArgumentError, Array, BasicObject, Bignum ... ZeroDivisionError]
47
+
48
+ ### MethodFinder.find\_in\_class\_or_module
49
+
50
+ Searches for a given name within a class. The first parameter can
51
+ either be a class object, a symbol or a string whereas the optional
52
+ second parameter can be a string or a regular expression:
53
+
54
+ >> MethodFinder.find_in_class_or_module('Array', 'shuff')
55
+ => [:shuffle, :shuffle!]
56
+ >> MethodFinder.find_in_class_or_module(Float, /^to/)
57
+ => [:to_f, :to_i, :to_int, :to_r, :to_s]
58
+
59
+ If the second parameter is omitted, all methods of the class or module
60
+ will be returned.
61
+
62
+ >> MethodFinder.find_in_class_or_module(Math)
63
+ => [:acos, :acosh, :asin ... :tanh]
64
+
42
65
  Warning
43
66
  ---
44
67
 
@@ -56,14 +79,15 @@ IRB, not with `script/console`).
56
79
  Todo
57
80
  ---
58
81
 
59
- * a method black list
60
- * maybe an alternate form of calling this (issue #3)
61
-
82
+ * a method black list (maybe)
62
83
 
63
84
  Thanks
64
85
  ---
65
86
 
66
- * Matthew Lucas for packaging it as a gem.
87
+ * Matthew Lucas for first packaging this as a gem.
88
+ * Ryan Bates for
89
+ [suggesting](https://github.com/citizen428/methodfinder/issues/closed#issue/3)
90
+ what eventually became `Object#find_method`.
67
91
 
68
92
  License
69
93
  ---
data/lib/methodfinder.rb CHANGED
@@ -15,33 +15,47 @@ class MethodFinder
15
15
  :cycle => [1] # prevent cycling forever
16
16
  }
17
17
 
18
- def self.find(obj, res, *args, &block)
19
- redirect_streams
20
-
21
- obj.methods.sort.map(&:intern).select do |met|
22
- o = obj.dup rescue obj
23
- m = o.method(met)
24
- if m.arity <= args.size
25
- a = args.empty? && ARGS.has_key?(met) ? ARGS[met] : args
26
- m.call(*a, &block) == res rescue nil
18
+ class << self
19
+ def find(obj, res, *args, &block)
20
+ redirect_streams
21
+
22
+ obj.methods.sort.map(&:intern).select do |met|
23
+ o = obj.dup rescue obj
24
+ m = o.method(met)
25
+ if m.arity <= args.size
26
+ a = args.empty? && ARGS.has_key?(met) ? ARGS[met] : args
27
+ m.call(*a, &block) == res rescue nil
28
+ end
27
29
  end
30
+ ensure
31
+ restore_streams
28
32
  end
29
- ensure
30
- restore_streams
31
- end
32
33
 
33
- def self.redirect_streams
34
- @orig_stdout = $stdout
35
- @orig_stderr = $stderr
36
- $stdout = StringIO.new
37
- $stderr = StringIO.new
38
- end
34
+ def find_classes_and_modules
35
+ constants = Object.constants.sort.map { |c| Object.const_get(c) }
36
+ constants.select { |c| c.class == Class || c.class == Module}
37
+ end
39
38
 
40
- def self.restore_streams
41
- $stdout = @orig_stdout
42
- $stderr = @orig_stderr
43
- end
39
+ def find_in_class_or_module(c, pattern=/./)
40
+ cs = Object.const_get(c.to_s)
41
+ class_methods = cs.methods(false) rescue []
42
+ instance_methods = cs.instance_methods(false)
43
+ all_methods = class_methods + instance_methods
44
+ all_methods.grep(/#{pattern}/).sort
45
+ end
44
46
 
47
+ def redirect_streams
48
+ @orig_stdout = $stdout
49
+ @orig_stderr = $stderr
50
+ $stdout = StringIO.new
51
+ $stderr = StringIO.new
52
+ end
53
+
54
+ def restore_streams
55
+ $stdout = @orig_stdout
56
+ $stderr = @orig_stderr
57
+ end
58
+ end
45
59
  private_class_method :redirect_streams, :restore_streams
46
60
  end
47
61
 
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: methodfinder
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 1.1.1
5
+ version: 1.2.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Michael Kohl
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-04-05 00:00:00 +02:00
13
+ date: 2011-04-09 00:00:00 +02:00
14
14
  default_executable:
15
15
  dependencies: []
16
16