mirrors 0.0.2 → 0.0.3
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/lib/mirrors.rb +14 -2
- data/lib/mirrors/class_mixin.rb +3 -3
- data/lib/mirrors/invoke.rb +9 -0
- data/lib/mirrors/package_inference.rb +1 -4
- data/lib/mirrors/package_inference/class_to_file_resolver.rb +17 -3
- data/lib/mirrors/package_mirror.rb +4 -0
- data/mirrors.gemspec +1 -1
- metadata +1 -2
- data/lib/mirrors/hook.rb +0 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c078859b6c16e0d8d32196f080950c37cb5a5d54
|
4
|
+
data.tar.gz: 8c1539195958b54ef2e27db89720e04977a29069
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1e55a49c465000dcb7d621b70ecabc34edb3dfa1339aa522acb01b2f9817df9db8adea1de824c1502f79fde220b23b8fea25bfe89e7da052602c4b073100a6f4
|
7
|
+
data.tar.gz: df2d489ec4fedba86faf0e8a6670e9ea24c704268089cf20eb3e61466c53c8bb1cf30ab18cd321dcd6e83c22ef609c5e29a99fbff26aa823105f225e6eb54deb
|
data/lib/mirrors.rb
CHANGED
@@ -17,6 +17,18 @@ module Mirrors
|
|
17
17
|
@watches = {}
|
18
18
|
@logger = Logger.new(STDOUT)
|
19
19
|
|
20
|
+
ProjectRootNotFound = Class.new(StandardError)
|
21
|
+
|
22
|
+
def project_root
|
23
|
+
if defined?(Bundler)
|
24
|
+
return File.expand_path(Bundler.root)
|
25
|
+
end
|
26
|
+
if Dir.exist?('.git')
|
27
|
+
return File.expand_path(Dir.pwd)
|
28
|
+
end
|
29
|
+
raise ProjectRootNotFound
|
30
|
+
end
|
31
|
+
|
20
32
|
def packages
|
21
33
|
packages = {}
|
22
34
|
# Object is the top-level.
|
@@ -120,12 +132,12 @@ module Mirrors
|
|
120
132
|
|
121
133
|
# find the class of obj
|
122
134
|
def basic_class(obj)
|
123
|
-
|
135
|
+
Mirrors.kernel_instance_invoke(obj, :class)
|
124
136
|
end
|
125
137
|
|
126
138
|
# find the class name of obj
|
127
139
|
def basic_class_name(klass)
|
128
|
-
|
140
|
+
Mirrors.module_instance_invoke(obj, :name)
|
129
141
|
end
|
130
142
|
|
131
143
|
def intern_class_mirror(mirror)
|
data/lib/mirrors/class_mixin.rb
CHANGED
data/lib/mirrors/invoke.rb
CHANGED
@@ -10,6 +10,7 @@ module Mirrors
|
|
10
10
|
|
11
11
|
@unbound_module_instance_methods = {}
|
12
12
|
@unbound_class_singleton_methods = {}
|
13
|
+
@unbound_kernel_instance_methods = {}
|
13
14
|
|
14
15
|
def self.module_instance_invoke(receiver, msg)
|
15
16
|
module_instance_method(msg).bind(receiver).call
|
@@ -26,4 +27,12 @@ module Mirrors
|
|
26
27
|
def self.class_singleton_method(msg)
|
27
28
|
@unbound_class_singleton_methods[msg] ||= Class.method(msg).unbind
|
28
29
|
end
|
30
|
+
|
31
|
+
def self.kernel_instance_invoke(receiver, msg)
|
32
|
+
kernel_instance_method(msg).bind(receiver).call
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.kernel_instance_method(msg)
|
36
|
+
@unbound_kernel_instance_methods[msg] ||= Kernel.instance_method(msg)
|
37
|
+
end
|
29
38
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'rbconfig'
|
2
2
|
require 'set'
|
3
3
|
|
4
|
-
require 'mirrors/hook'
|
5
4
|
require 'mirrors/package_inference/class_to_file_resolver'
|
5
|
+
require 'mirrors/invoke'
|
6
6
|
|
7
7
|
module Mirrors
|
8
8
|
module PackageInference
|
@@ -121,9 +121,6 @@ module Mirrors
|
|
121
121
|
end
|
122
122
|
|
123
123
|
def determine_filename(key, resolver)
|
124
|
-
if fn = CLASS_DEFINITION_POINTS[key]
|
125
|
-
return fn
|
126
|
-
end
|
127
124
|
resolver.resolve(Object.const_get(key))
|
128
125
|
end
|
129
126
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'mirrors/invoke'
|
2
|
+
|
1
3
|
module Mirrors
|
2
4
|
module PackageInference
|
3
5
|
class ClassToFileResolver
|
@@ -7,9 +9,18 @@ module Mirrors
|
|
7
9
|
|
8
10
|
def resolve(klass)
|
9
11
|
return nil if klass.nil?
|
10
|
-
|
11
|
-
|
12
|
-
|
12
|
+
|
13
|
+
name = begin
|
14
|
+
Mirrors.module_instance_invoke(klass, :name)
|
15
|
+
rescue TypeError
|
16
|
+
# klass is not a class/module, so we can't really determine its
|
17
|
+
# origin.
|
18
|
+
return nil
|
19
|
+
end
|
20
|
+
|
21
|
+
try_fast(klass, name) ||
|
22
|
+
try_fast(klass.singleton_class, name) ||
|
23
|
+
try_slow(klass) ||
|
13
24
|
try_slow(klass.singleton_class)
|
14
25
|
end
|
15
26
|
|
@@ -47,6 +58,9 @@ module Mirrors
|
|
47
58
|
meth.source =~ /\A\s+def (self\.)?#{Regexp.quote(meth.name)}/
|
48
59
|
rescue MethodSource::SourceNotFoundError
|
49
60
|
false
|
61
|
+
rescue NoMethodError => e
|
62
|
+
STDERR.puts "\x1b[31mbug in method_source for #{meth}: #{e.inspect}\x1b[0m"
|
63
|
+
false
|
50
64
|
end
|
51
65
|
end
|
52
66
|
|
data/mirrors.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mirrors
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Burke Libbey
|
@@ -79,7 +79,6 @@ files:
|
|
79
79
|
- lib/mirrors/field_mirror/class_variable_mirror.rb
|
80
80
|
- lib/mirrors/field_mirror/constant_mirror.rb
|
81
81
|
- lib/mirrors/field_mirror/instance_variable_mirror.rb
|
82
|
-
- lib/mirrors/hook.rb
|
83
82
|
- lib/mirrors/index/indexer.rb
|
84
83
|
- lib/mirrors/index/marker.rb
|
85
84
|
- lib/mirrors/invoke.rb
|
data/lib/mirrors/hook.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
require 'mirrors/invoke'
|
2
|
-
|
3
|
-
module Mirrors
|
4
|
-
CLASS_DEFINITION_POINTS = {}
|
5
|
-
|
6
|
-
NoGemfile = Class.new(StandardError)
|
7
|
-
|
8
|
-
class << self
|
9
|
-
attr_accessor :project_root
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
begin
|
14
|
-
unless Mirrors.project_root
|
15
|
-
appline = caller.detect { |line| line !~ /:in `require'/ }
|
16
|
-
f = File.expand_path(appline.sub(/:\d.*/, ''))
|
17
|
-
Mirrors.project_root = loop do
|
18
|
-
f = File.dirname(f)
|
19
|
-
raise Mirrors::NoGemfile if f == '/'
|
20
|
-
break f if File.exist?("#{f}/Gemfile")
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
class Class
|
26
|
-
alias_method :__lg_orig_inherited, :inherited
|
27
|
-
def inherited(subclass)
|
28
|
-
file = caller[0].sub(/:\d+:in.*/, '')
|
29
|
-
key = Mirrors.module_instance_invoke(subclass, :inspect)
|
30
|
-
Mirrors::CLASS_DEFINITION_POINTS[key] = file
|
31
|
-
__lg_orig_inherited(subclass)
|
32
|
-
end
|
33
|
-
end
|