where_is 0.1.0 → 0.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.
- checksums.yaml +4 -4
- data/.rubocop.yml +8 -0
- data/README.md +17 -2
- data/Rakefile +6 -2
- data/bin/console +3 -3
- data/lib/where_is/version.rb +1 -1
- data/lib/where_is.rb +63 -34
- data/where_is.gemspec +14 -11
- metadata +19 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f306ef08ef7d1741687639fb23e8fd2c548aa596
|
4
|
+
data.tar.gz: d192d9414cede7645d027df092051882a0b71598
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 574345e79412de82a51dbf8df6c4391931b283854e7eccf869be8a051ea295ab39a77c32b56d3c1083839b7e25d6d7102fe9e975eb805f264c7f54bd723fd07f
|
7
|
+
data.tar.gz: 7dcbd32e3a79404686153d5582fa13b9db90e110098090a0bf0ec16109b99da493c8883aa3c70e3fceb883a97922897d599ca6d00e9c9f4c14061a425cb87cad
|
data/.rubocop.yml
ADDED
data/README.md
CHANGED
@@ -24,10 +24,25 @@ Or install it yourself as:
|
|
24
24
|
# Where.is takes a class and an optional method
|
25
25
|
|
26
26
|
Where.is(Where, :is)
|
27
|
-
# => ["/Users/david/.rvm/gems/ruby-2.
|
27
|
+
# => ["/Users/david/.rvm/gems/ruby-2.3.1/gems/where_is-0.1.0/lib/where_is.rb", 5]
|
28
28
|
|
29
29
|
Where.is(IRB)
|
30
|
-
# => ["/Users/david/.rvm/rubies/ruby-2.
|
30
|
+
# => ["/Users/david/.rvm/rubies/ruby-2.3.1/lib/ruby/2.2.0/irb/inspector.rb", 24]
|
31
|
+
|
32
|
+
|
33
|
+
# Where.are takes a class and an optional method and will return all definitions
|
34
|
+
# of the method/class
|
35
|
+
Where.are(Where, :is)
|
36
|
+
|
37
|
+
|
38
|
+
Where.are(IRB)
|
39
|
+
# => [
|
40
|
+
# ["/Users/david/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/irb/inspector.rb", 24],
|
41
|
+
# ["/Users/david/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/irb/workspace.rb", 112],
|
42
|
+
# ["(eval)", 2],
|
43
|
+
# ["/Users/david/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/irb.rb", 350],
|
44
|
+
# ["/Users/david/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/irb/init.rb", 16]
|
45
|
+
#]
|
31
46
|
```
|
32
47
|
|
33
48
|
## Development
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'where_is'
|
5
5
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
@@ -10,5 +10,5 @@ require "where_is"
|
|
10
10
|
# require "pry"
|
11
11
|
# Pry.start
|
12
12
|
|
13
|
-
require
|
13
|
+
require 'irb'
|
14
14
|
IRB.start
|
data/lib/where_is/version.rb
CHANGED
data/lib/where_is.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
require
|
1
|
+
require 'where_is/version'
|
2
2
|
|
3
3
|
module Where
|
4
|
-
class <<self
|
4
|
+
class << self
|
5
5
|
def is(klass, method = nil)
|
6
6
|
if method
|
7
7
|
begin
|
@@ -14,6 +14,18 @@ module Where
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
+
def are(klass, method = nil)
|
18
|
+
if method
|
19
|
+
begin
|
20
|
+
Where.are_instance_methods(klass, method)
|
21
|
+
rescue NameError
|
22
|
+
Where.are_methods(klass, method)
|
23
|
+
end
|
24
|
+
else
|
25
|
+
Where.is_class(klass)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
17
29
|
def is_proc(proc)
|
18
30
|
source_location(proc)
|
19
31
|
end
|
@@ -27,62 +39,79 @@ module Where
|
|
27
39
|
end
|
28
40
|
|
29
41
|
def are_methods(klass, method_name)
|
30
|
-
are_via_extractor(:method, klass, method_name)
|
42
|
+
methods = are_via_extractor(:method, klass, method_name)
|
43
|
+
source_locations = group_and_combine_source_locations(methods)
|
44
|
+
|
45
|
+
if source_locations.empty?
|
46
|
+
raise NameError, "#{klass} has no methods called #{method_name}"
|
47
|
+
end
|
48
|
+
|
49
|
+
source_locations
|
31
50
|
end
|
32
51
|
|
33
52
|
def are_instance_methods(klass, method_name)
|
34
|
-
are_via_extractor(:
|
53
|
+
methods = are_via_extractor(:instance_method, klass, method_name)
|
54
|
+
source_locations = group_and_combine_source_locations(methods)
|
55
|
+
|
56
|
+
if source_locations.empty?
|
57
|
+
raise NameError, "#{klass} has no methods called #{method_name}"
|
58
|
+
end
|
59
|
+
|
60
|
+
source_locations
|
35
61
|
end
|
36
62
|
|
37
63
|
def is_class(klass)
|
38
64
|
methods = defined_methods(klass)
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
65
|
+
source_locations = group_and_combine_source_locations(methods)
|
66
|
+
|
67
|
+
if source_locations.empty?
|
68
|
+
raise NameError, "#{klass} has no methods" if methods.empty?
|
69
|
+
raise NameError, "#{klass} only has built-in methods " \
|
70
|
+
"(#{methods.size} in total)"
|
45
71
|
end
|
46
|
-
|
72
|
+
|
73
|
+
source_locations
|
47
74
|
end
|
48
75
|
|
49
|
-
# Raises ArgumentError if klass does not have any Ruby methods defined in it.
|
50
76
|
def is_class_primarily(klass)
|
51
|
-
|
52
|
-
if source_locations.empty?
|
53
|
-
methods = defined_methods(klass)
|
54
|
-
raise ArgumentError, (methods.empty? ?
|
55
|
-
"#{klass} has no methods" :
|
56
|
-
"#{klass} only has built-in methods (#{methods.size} in total)"
|
57
|
-
)
|
58
|
-
end
|
59
|
-
source_locations[0]
|
77
|
+
is_class(klass)[0]
|
60
78
|
end
|
61
79
|
|
62
80
|
private
|
63
81
|
|
64
82
|
def source_location(method)
|
65
|
-
method.source_location || (
|
66
|
-
|
67
|
-
|
68
|
-
|
83
|
+
method.source_location || method.to_s[/: (.*)>/, 1]
|
84
|
+
end
|
85
|
+
|
86
|
+
def group_and_combine_source_locations(source_locations)
|
87
|
+
file_groups = source_locations.group_by { |src_loc| src_loc[0] }.to_a
|
88
|
+
|
89
|
+
file_groups.map! do |file, src_locs|
|
90
|
+
lines = src_locs.map { |sl| sl[1] }
|
91
|
+
count = lines.size
|
92
|
+
line = lines.min
|
93
|
+
{ file: file, count: count, line: line }
|
94
|
+
end
|
95
|
+
|
96
|
+
file_groups.sort_by! { |fc| fc[:count] }
|
97
|
+
file_groups.map { |fc| [fc[:file], fc[:line]] }
|
69
98
|
end
|
70
99
|
|
71
100
|
def are_via_extractor(extractor, klass, method_name)
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
else
|
101
|
+
klass.ancestors.map do |ancestor|
|
102
|
+
begin
|
103
|
+
source_location(ancestor.send(extractor, method_name))
|
104
|
+
rescue NameError
|
77
105
|
nil
|
78
106
|
end
|
79
|
-
end
|
80
|
-
methods.compact
|
107
|
+
end.compact
|
81
108
|
end
|
82
109
|
|
83
110
|
def defined_methods(klass)
|
84
|
-
methods = klass.methods(false)
|
85
|
-
|
111
|
+
methods = klass.methods(false)
|
112
|
+
.map { |m| klass.method(m) }
|
113
|
+
methods += klass.instance_methods(false)
|
114
|
+
.map { |m| klass.instance_method(m) }
|
86
115
|
methods.map(&:source_location).compact
|
87
116
|
end
|
88
117
|
end
|
data/where_is.gemspec
CHANGED
@@ -4,23 +4,26 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'where_is/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'where_is'
|
8
8
|
spec.version = Where::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
9
|
+
spec.authors = ['Dave Allie']
|
10
|
+
spec.email = ['dave@daveallie.com']
|
11
11
|
|
12
|
-
spec.summary =
|
13
|
-
|
14
|
-
spec.
|
15
|
-
|
12
|
+
spec.summary = 'A little Ruby gem for finding the source location' \
|
13
|
+
' where class and methods are defined.'
|
14
|
+
spec.description = 'A little Ruby gem for finding the source location' \
|
15
|
+
' where class and methods are defined.'
|
16
|
+
spec.homepage = 'https://github.com/daveallie/where_is'
|
17
|
+
spec.license = 'MIT'
|
16
18
|
|
17
19
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
18
20
|
f.match(%r{^(test|spec|features)/})
|
19
21
|
end
|
20
|
-
spec.bindir =
|
22
|
+
spec.bindir = 'exe'
|
21
23
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
|
-
spec.require_paths = [
|
24
|
+
spec.require_paths = ['lib']
|
23
25
|
|
24
|
-
spec.add_development_dependency
|
25
|
-
spec.add_development_dependency
|
26
|
+
spec.add_development_dependency 'bundler', '~> 1.13'
|
27
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
28
|
+
spec.add_development_dependency 'rubocop', '~> 0.45.0'
|
26
29
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: where_is
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dave Allie
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-11-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -38,15 +38,30 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rubocop
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.45.0
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.45.0
|
41
55
|
description: A little Ruby gem for finding the source location where class and methods
|
42
56
|
are defined.
|
43
57
|
email:
|
44
|
-
- dave@
|
58
|
+
- dave@daveallie.com
|
45
59
|
executables: []
|
46
60
|
extensions: []
|
47
61
|
extra_rdoc_files: []
|
48
62
|
files:
|
49
63
|
- ".gitignore"
|
64
|
+
- ".rubocop.yml"
|
50
65
|
- CODE_OF_CONDUCT.md
|
51
66
|
- Gemfile
|
52
67
|
- LICENSE.txt
|
@@ -77,10 +92,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
77
92
|
version: '0'
|
78
93
|
requirements: []
|
79
94
|
rubyforge_project:
|
80
|
-
rubygems_version: 2.
|
95
|
+
rubygems_version: 2.5.1
|
81
96
|
signing_key:
|
82
97
|
specification_version: 4
|
83
98
|
summary: A little Ruby gem for finding the source location where class and methods
|
84
99
|
are defined.
|
85
100
|
test_files: []
|
86
|
-
has_rdoc:
|