private_please 0.0.5 → 0.1.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 +7 -0
- data/.ruby-version +1 -1
- data/.travis.yml +3 -5
- data/CHANGELOG +4 -0
- data/Gemfile +2 -0
- data/LICENSE.txt +21 -0
- data/README.md +58 -98
- data/Rakefile +6 -2
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/private_please/config.rb +15 -0
- data/lib/private_please/methods_calls_tracker.rb +44 -0
- data/lib/private_please/reporting/simple_text.rb +43 -0
- data/lib/private_please/reporting/templates/simple.txt.erb +11 -0
- data/lib/private_please/storage/called_methods_memory_store.rb +20 -0
- data/lib/private_please/tracking/debug/trace_point_data_logger.rb +81 -0
- data/lib/private_please/tracking/method_details.rb +27 -0
- data/lib/private_please/tracking/result.rb +25 -0
- data/lib/private_please/tracking/trace_point_details.rb +41 -0
- data/lib/private_please/tracking/trace_point_processor.rb +71 -0
- data/lib/private_please/utils/ruby_utils.rb +44 -0
- data/lib/private_please/utils/source_file_utils.rb +20 -0
- data/lib/private_please/utils/two_level_stack.rb +13 -0
- data/lib/private_please/version.rb +2 -1
- data/lib/private_please.rb +27 -34
- data/private_please.gemspec +32 -25
- metadata +106 -185
- data/Guardfile +0 -8
- data/LICENSE +0 -22
- data/TODO +0 -20
- data/bin/pp_ruby +0 -62
- data/bin/ruby_pp +0 -62
- data/doc/dev_notes.txt +0 -32
- data/doc/fixtures/complex.rb +0 -103
- data/doc/fixtures/empty_class.rb +0 -7
- data/doc/fixtures/fixture_helper.rb +0 -8
- data/doc/fixtures/sample.rb +0 -57
- data/lib/private_please/candidate.rb +0 -49
- data/lib/private_please/report/table.rb +0 -44
- data/lib/private_please/report.rb +0 -6
- data/lib/private_please/reporter/base.rb +0 -14
- data/lib/private_please/reporter/data_compiler.rb +0 -82
- data/lib/private_please/reporter/helpers/options_helpers.rb +0 -37
- data/lib/private_please/reporter/helpers/text_table_helpers.rb +0 -9
- data/lib/private_please/reporter/simple_text.rb +0 -18
- data/lib/private_please/reporter/templates/simple.txt.erb +0 -80
- data/lib/private_please/reporter.rb +0 -8
- data/lib/private_please/ruby_backports.rb +0 -22
- data/lib/private_please/storage/calls_store.rb +0 -41
- data/lib/private_please/storage/candidates_store.rb +0 -52
- data/lib/private_please/storage/methods_names.rb +0 -10
- data/lib/private_please/storage/methods_names_bucket.rb +0 -69
- data/lib/private_please/storage.rb +0 -8
- data/lib/private_please/tracking/extension.rb +0 -12
- data/lib/private_please/tracking/instrumentor.rb +0 -49
- data/lib/private_please/tracking/instruments_all_methods_below.rb +0 -28
- data/lib/private_please/tracking/instruments_automatically_all_methods_in_all_classes.rb +0 -68
- data/lib/private_please/tracking/line_change_tracker.rb +0 -26
- data/lib/private_please/tracking/load_utils/gem_utils.rb +0 -49
- data/lib/private_please/tracking/load_utils/standard_lib_utils.rb +0 -38
- data/lib/private_please/tracking/load_utils.rb +0 -32
- data/lib/private_please/tracking/utils.rb +0 -34
- data/lib/private_please/tracking.rb +0 -49
- data/sample.rb +0 -68
- data/spec/01_tracking_candidate_methods/excluding_gems_and_standard_libraries_spec.rb +0 -31
- data/spec/01_tracking_candidate_methods/explicitely_with_the_private_please_command_spec.rb +0 -118
- data/spec/01_tracking_candidate_methods/load_utils_spec.rb +0 -40
- data/spec/01_tracking_candidate_methods/systematically_in_auto_mode_spec.rb +0 -185
- data/spec/03_logging_calls_on_candidate_methods_spec.rb +0 -37
- data/spec/04_instrumented_program_activity_observation_result_spec.rb +0 -86
- data/spec/05_reporting/report_table_spec.rb +0 -51
- data/spec/06_at_exit_spec.rb +0 -18
- data/spec/_helpers/assert_helpers.rb +0 -76
- data/spec/fixtures/bug_22.rb +0 -17
- data/spec/fixtures/bug_30.rb +0 -6
- data/spec/fixtures/issue_25.rb +0 -12
- data/spec/fixtures/sample_class_for_report.rb +0 -56
- data/spec/fixtures/sample_class_with_all_calls_combinations.rb +0 -69
- data/spec/sandbox/Gemfile +0 -4
- data/spec/sandbox/Gemfile.lock +0 -14
- data/spec/sandbox/README.txt +0 -26
- data/spec/sandbox/normal.rb +0 -7
- data/spec/sandbox/normal_prepended_with_require.rb +0 -8
- data/spec/spec_helper.rb +0 -38
- data/spec/units/calls_store_spec.rb +0 -15
- data/spec/units/candidates_store_spec.rb +0 -55
- data/spec/units/reporter/data_compiler_spec.rb +0 -12
- data/spec/units/reporter/fixtures/simple_case_1.rb +0 -30
- data/spec/units/reporter/fixtures/simple_case_2.rb +0 -55
@@ -1,69 +0,0 @@
|
|
1
|
-
# Associates and indexes classes (name) and some of their methods (names).
|
2
|
-
# Ex:
|
3
|
-
# +-------------+---------------------------------------+
|
4
|
-
# | class name => 1+ methods names |
|
5
|
-
# +-------------+---------------------------------------+
|
6
|
-
# | 'Foo' | MethodsNames.new('foo to_baz to_bar') |
|
7
|
-
# | 'Bar' | MethodsNames.new('qux') |
|
8
|
-
# +-------------+---------------------------------------+
|
9
|
-
|
10
|
-
module PrivatePlease
|
11
|
-
module Storage
|
12
|
-
|
13
|
-
class MethodsNamesBucket < Hash
|
14
|
-
|
15
|
-
def initialize
|
16
|
-
super{|hash, class_name|
|
17
|
-
#hash[class_name] = PrivatePlease::Storage::MethodsNames.new
|
18
|
-
hash.set_methods_names(class_name, MethodsNames.new)
|
19
|
-
}
|
20
|
-
end
|
21
|
-
|
22
|
-
def clone
|
23
|
-
(self.class).new.tap do |klone|
|
24
|
-
classes_names.each do |class_name|
|
25
|
-
klone.set_methods_names(class_name, (self).get_methods_names(class_name))
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
#--------------------------------------------------------------------------
|
31
|
-
# QUERIES:
|
32
|
-
#--------------------------------------------------------------------------
|
33
|
-
|
34
|
-
alias_method :classes_names, :keys
|
35
|
-
alias_method :get_methods_names, :[]
|
36
|
-
# undef :[], :keys # should be undef-ed, but that complexifies the test #TODO : undef :[], :keys
|
37
|
-
# ( => must define ==(other) and cast type of 'other')
|
38
|
-
|
39
|
-
#--------------------------------------------------------------------------
|
40
|
-
# COMMANDS:
|
41
|
-
#--------------------------------------------------------------------------
|
42
|
-
|
43
|
-
alias_method :set_methods_names, :[]=
|
44
|
-
undef :[]=
|
45
|
-
|
46
|
-
def add_method_name(class_name, method_name)
|
47
|
-
self.get_methods_names(class_name).add(method_name)
|
48
|
-
end
|
49
|
-
|
50
|
-
def remove(other)
|
51
|
-
other.classes_names.each do |cn|
|
52
|
-
next if (methods_to_remove = other.get_methods_names(cn)).empty?
|
53
|
-
next if (methods_before = self .get_methods_names(cn)).empty?
|
54
|
-
difference = methods_before - methods_to_remove
|
55
|
-
self.set_methods_names(cn, difference)
|
56
|
-
end
|
57
|
-
prune!
|
58
|
-
self
|
59
|
-
end
|
60
|
-
|
61
|
-
private
|
62
|
-
|
63
|
-
def prune!
|
64
|
-
self.reject!{|_, v|v.empty?}
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
end
|
69
|
-
end
|
@@ -1,8 +0,0 @@
|
|
1
|
-
module PrivatePlease
|
2
|
-
module Storage
|
3
|
-
end
|
4
|
-
end
|
5
|
-
require File.dirname(__FILE__) + '/storage/calls_store'
|
6
|
-
require File.dirname(__FILE__) + '/storage/candidates_store'
|
7
|
-
require File.dirname(__FILE__) + '/storage/methods_names'
|
8
|
-
require File.dirname(__FILE__) + '/storage/methods_names_bucket'
|
@@ -1,49 +0,0 @@
|
|
1
|
-
module PrivatePlease ; module Tracking
|
2
|
-
|
3
|
-
module Instrumentor
|
4
|
-
class << self
|
5
|
-
|
6
|
-
def add_call_tracking_code_to(candidate)
|
7
|
-
return if candidate.already_instrumented?
|
8
|
-
candidate.mark_as_instrumented
|
9
|
-
|
10
|
-
klass, method_name = candidate.klass, candidate.method_name
|
11
|
-
candidate.instance_method? ?
|
12
|
-
add_call_tracking_code_to_instance_method(klass, method_name) :
|
13
|
-
add_call_tracking_code_to_class_method( klass, method_name)
|
14
|
-
end
|
15
|
-
|
16
|
-
|
17
|
-
private
|
18
|
-
|
19
|
-
def add_call_tracking_code_to_class_method(klass, method_name)
|
20
|
-
orig_method = klass.singleton_class.instance_method(method_name)
|
21
|
-
klass.class_eval <<RUBY
|
22
|
-
define_singleton_method(method_name) do |*args, &blk| # def self.observed_method_i(..)
|
23
|
-
set_trace_func(nil) #don't track activity while here #
|
24
|
-
PrivatePlease::Tracking.after_singleton_method_call(method_name, self_class=self)
|
25
|
-
set_trace_func(LineChangeTracker::MY_TRACE_FUN) #
|
26
|
-
# make the original call : #
|
27
|
-
orig_method.bind(self).call(*args, &blk) # <call original method>
|
28
|
-
end # end
|
29
|
-
RUBY
|
30
|
-
end
|
31
|
-
|
32
|
-
|
33
|
-
def add_call_tracking_code_to_instance_method(klass, method_name)
|
34
|
-
orig_method = klass.instance_method(method_name)
|
35
|
-
klass.class_eval <<RUBY
|
36
|
-
define_method(method_name) do |*args, &blk| # def observed_method_i(..)
|
37
|
-
set_trace_func(nil) #don't track activity while here #
|
38
|
-
PrivatePlease::Tracking.after_instance_method_call(method_name, self.class)
|
39
|
-
set_trace_func(LineChangeTracker::MY_TRACE_FUN) #
|
40
|
-
# make the original call : #
|
41
|
-
orig_method.bind(self).call(*args, &blk) # <call original method>
|
42
|
-
end # end
|
43
|
-
RUBY
|
44
|
-
end
|
45
|
-
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
end end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
module PrivatePlease ; module Tracking
|
2
|
-
|
3
|
-
module InstrumentsAllMethodsBelow
|
4
|
-
include PrivatePlease::Tracking::Extension
|
5
|
-
|
6
|
-
def self.included(base)
|
7
|
-
|
8
|
-
def base.singleton_method_added(method_name)
|
9
|
-
return if Utils.private_singleton_method?(self, method_name) \
|
10
|
-
|| Utils.singleton_method_defined_by_ancestor?(self, method_name)
|
11
|
-
|
12
|
-
candidate = Candidate.for_class_method(klass = self, method_name)
|
13
|
-
Instrumentor.add_call_tracking_code_to(candidate)
|
14
|
-
end
|
15
|
-
|
16
|
-
|
17
|
-
def base.method_added(method_name)
|
18
|
-
return if Utils.private_instance_method?(self, method_name) \
|
19
|
-
|| Utils.instance_method_defined_by_ancestor?(self, method_name)
|
20
|
-
|
21
|
-
candidate = Candidate.for_instance_method(klass = self, method_name)
|
22
|
-
Instrumentor.add_call_tracking_code_to(candidate)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|
27
|
-
|
28
|
-
end end
|
@@ -1,68 +0,0 @@
|
|
1
|
-
module Kernel
|
2
|
-
|
3
|
-
alias_method :_orig_require, :require
|
4
|
-
|
5
|
-
def require string
|
6
|
-
prev_val = PrivatePlease.pp_automatic_mode_enabled?
|
7
|
-
if PrivatePlease::Tracking::LoadUtils.standard_lib_or_gem?(string)
|
8
|
-
PrivatePlease.pp_automatic_mode_disable
|
9
|
-
end
|
10
|
-
|
11
|
-
send :_orig_require, string
|
12
|
-
|
13
|
-
PrivatePlease.pp_automatic_mode_enable(prev_val)
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
17
|
-
|
18
|
-
class Class
|
19
|
-
|
20
|
-
def singleton_method_added(method_name)
|
21
|
-
return unless PrivatePlease.pp_automatic_mode_enabled?
|
22
|
-
|
23
|
-
return if PrivatePlease::Tracking::Utils.private_singleton_method?(self, method_name) \
|
24
|
-
|| PrivatePlease::Tracking::Utils.singleton_method_defined_by_ancestor?(self, method_name)
|
25
|
-
|
26
|
-
candidate = PrivatePlease::Candidate.for_class_method(klass = self, method_name)
|
27
|
-
PrivatePlease::Tracking::Instrumentor.add_call_tracking_code_to(candidate)
|
28
|
-
end
|
29
|
-
|
30
|
-
|
31
|
-
def method_added(method_name)
|
32
|
-
return unless PrivatePlease.pp_automatic_mode_enabled?
|
33
|
-
|
34
|
-
return if [:method_added].include?(method_name)
|
35
|
-
return if PrivatePlease::Tracking::Utils.private_instance_method?(self, method_name) \
|
36
|
-
|| PrivatePlease::Tracking::Utils.instance_method_defined_by_ancestor?(self, method_name)
|
37
|
-
|
38
|
-
candidate = PrivatePlease::Candidate.for_instance_method(klass = self, method_name)
|
39
|
-
PrivatePlease::Tracking::Instrumentor.add_call_tracking_code_to(candidate)
|
40
|
-
end
|
41
|
-
|
42
|
-
end
|
43
|
-
|
44
|
-
|
45
|
-
class Module
|
46
|
-
|
47
|
-
def singleton_method_added(method_name)
|
48
|
-
return unless PrivatePlease.pp_automatic_mode_enabled?
|
49
|
-
|
50
|
-
return if [:included].include?(method_name) #&& !self.is_a?(Class)
|
51
|
-
return if PrivatePlease::Tracking::Utils.private_singleton_method?(self, method_name)
|
52
|
-
|
53
|
-
candidate = PrivatePlease::Candidate.for_class_method(klass = self, method_name)
|
54
|
-
PrivatePlease::Tracking::Instrumentor.add_call_tracking_code_to(candidate)
|
55
|
-
end
|
56
|
-
|
57
|
-
|
58
|
-
def method_added(method_name)
|
59
|
-
return unless PrivatePlease.pp_automatic_mode_enabled?
|
60
|
-
|
61
|
-
return if [:method_added, :singleton_method_added].include?(method_name)
|
62
|
-
return if PrivatePlease::Tracking::Utils.private_instance_method?(self, method_name)
|
63
|
-
|
64
|
-
candidate = PrivatePlease::Candidate.for_instance_method(klass = self, method_name)
|
65
|
-
PrivatePlease::Tracking::Instrumentor.add_call_tracking_code_to(candidate)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
@@ -1,26 +0,0 @@
|
|
1
|
-
module PrivatePlease ; module Tracking
|
2
|
-
|
3
|
-
class LineChangeTracker
|
4
|
-
class << self
|
5
|
-
|
6
|
-
attr_accessor :prev_prev_self, :prev_self, :curr_self
|
7
|
-
@@prev_self = @@curr_self = nil
|
8
|
-
|
9
|
-
alias :call_initiator :prev_self
|
10
|
-
|
11
|
-
def reset
|
12
|
-
prev_prev_self = prev_self = curr_self = nil
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
MY_TRACE_FUN = lambda do |event, file, line, id, binding, klass|
|
17
|
-
return unless 'line'==event
|
18
|
-
LineChangeTracker.prev_prev_self = LineChangeTracker.prev_self
|
19
|
-
LineChangeTracker.prev_self = LineChangeTracker.curr_self
|
20
|
-
LineChangeTracker.curr_self = (eval 'self', binding)
|
21
|
-
#puts "my : #{event} in #{file}/#{line} id:#{id} klass:#{klass} - self = #{(eval'self', binding).inspect}"
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
|
26
|
-
end end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
# OPTIMISATION :
|
2
|
-
# Calls to `$ gem ..` are slow (esp. on jruby!)
|
3
|
-
# => we 1/ pre-perform them asynchronously (Threads) when this file is loaded,
|
4
|
-
# 2/ cache the obtained value in a variable,
|
5
|
-
# 3/ rewrite the slow method as a noop version that simply returns the cached value.
|
6
|
-
|
7
|
-
module PrivatePlease::Tracking::LoadUtils
|
8
|
-
|
9
|
-
module GemUtils
|
10
|
-
|
11
|
-
class << self
|
12
|
-
|
13
|
-
# performs `$ gem env`
|
14
|
-
#
|
15
|
-
def gem_env
|
16
|
-
GEM_ENV_PRELOADER.join
|
17
|
-
gem_env # call the fast/just rewritten version
|
18
|
-
end
|
19
|
-
|
20
|
-
# performs `$ gem list` + extracts the names
|
21
|
-
#
|
22
|
-
def gems_names
|
23
|
-
GEMS_NAMES_PRELOADER.join
|
24
|
-
gems_names
|
25
|
-
end
|
26
|
-
|
27
|
-
#-------------------------------------------------------------------------------------------------------------------
|
28
|
-
private
|
29
|
-
|
30
|
-
GEM_ENV_PRELOADER = Thread.new do
|
31
|
-
@@_cached_gem_env = `gem env`
|
32
|
-
def GemUtils.gem_env
|
33
|
-
@@_cached_gem_env
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
GEMS_NAMES_PRELOADER = Thread.new do
|
38
|
-
@@_cached_gems_names = `gem list`. # very slow on jruby
|
39
|
-
split("\n").
|
40
|
-
map { |l| l.match(/(\S+)\s+.*/)[1]} # ["bundle", "bundler", "rspec", ..]
|
41
|
-
def GemUtils.gems_names
|
42
|
-
@@_cached_gems_names
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
module PrivatePlease::Tracking::LoadUtils
|
2
|
-
|
3
|
-
module StandardLibUtils
|
4
|
-
|
5
|
-
class << self
|
6
|
-
|
7
|
-
def standard_lib?(requiree)
|
8
|
-
path_base = "#{std_lib_home}/#{requiree}"
|
9
|
-
if File.exists?(path_base)
|
10
|
-
path_base
|
11
|
-
elsif File.exists?("#{path_base}.rb")
|
12
|
-
"#{path_base}.rb"
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
#-------------------------------------------------------------------------------------------------------------------
|
17
|
-
private
|
18
|
-
|
19
|
-
# Ex: "/Users/ara/.rbenv/versions/jruby-1.7.3/bin/jruby"
|
20
|
-
def ruby_executable
|
21
|
-
@@_ruby_executable ||= GemUtils.gem_env.match(/RUBY EXECUTABLE:\s*(.*)/)[1]
|
22
|
-
end
|
23
|
-
|
24
|
-
# Ex: "/Users/ara/.rbenv/versions/jruby-1.7.3/lib/ruby/1.9"
|
25
|
-
def std_lib_home
|
26
|
-
@@_std_lib_home ||= begin
|
27
|
-
basedir = ruby_executable.gsub(/bin\/[j]?ruby/, 'lib/ruby') # => "/Users/ara/.rbenv/versions/jruby-1.7.3/lib/ruby"
|
28
|
-
# jruby has 2+ directories of std. libs under the basedir : 1.8 and 1.9
|
29
|
-
$:.detect {|path| # We choose the one that is also in the load path.
|
30
|
-
path =~ /#{basedir}\/[12][^\/]+$/ #
|
31
|
-
} # => "/Users/ara/.rbenv/versions/jruby-1.7.3/lib/ruby/1.9"
|
32
|
-
end # ^^^ == the mode
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
module PrivatePlease::Tracking
|
2
|
-
|
3
|
-
module LoadUtils
|
4
|
-
require File.dirname(__FILE__) + '/load_utils/gem_utils'
|
5
|
-
require File.dirname(__FILE__) + '/load_utils/standard_lib_utils'
|
6
|
-
|
7
|
-
class << self
|
8
|
-
|
9
|
-
def standard_lib_or_gem?(requiree)
|
10
|
-
(@@_standard_lib_or_gem ||= {})[requiree] ||= begin
|
11
|
-
standard_lib?(requiree) || gem?(requiree)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def standard_lib?(requiree)
|
16
|
-
(@@_standard_lib ||= {})[requiree] ||= StandardLibUtils.standard_lib?(requiree)
|
17
|
-
end
|
18
|
-
|
19
|
-
def gem?(requiree)
|
20
|
-
(@@_gems ||= {})[requiree] ||= begin
|
21
|
-
base_name = requiree.include?('/') ?
|
22
|
-
requiree.split('/').first : # ex: require 'rspec/autorun'
|
23
|
-
requiree # ex: require 'rspec'
|
24
|
-
GemUtils.gems_names.include?(base_name)
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
module PrivatePlease::Tracking
|
2
|
-
|
3
|
-
module Utils
|
4
|
-
class << self
|
5
|
-
|
6
|
-
def private_instance_method?(klass, method_name)
|
7
|
-
klass.private_method_defined?(method_name)
|
8
|
-
end
|
9
|
-
|
10
|
-
def private_singleton_method?(klass, method_name)
|
11
|
-
klass.singleton_class.private_method_defined?(method_name)
|
12
|
-
end
|
13
|
-
|
14
|
-
def instance_method_defined_by_ancestor?(klass, method_name)
|
15
|
-
ancestor_of(klass).any? do |a|
|
16
|
-
a.method_defined?(method_name) || a.private_method_defined?(method_name)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def singleton_method_defined_by_ancestor?(klass, method_name)
|
21
|
-
ancestor_of(klass).any? do |a|
|
22
|
-
a.singleton_class.method_defined?(method_name) || a.singleton_class.private_method_defined?(method_name)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
private
|
27
|
-
def ancestor_of(klass)
|
28
|
-
klass.ancestors - [klass]
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
require 'private_please/tracking/line_change_tracker'
|
2
|
-
module PrivatePlease
|
3
|
-
module Tracking
|
4
|
-
|
5
|
-
class << self
|
6
|
-
|
7
|
-
def after_instance_method_call(method_name, zelf_class)
|
8
|
-
store_call_to_tracked_method(
|
9
|
-
candidate = PrivatePlease::Candidate.for_instance_method(zelf_class, method_name),
|
10
|
-
is_outside_call = (caller_class != zelf_class)
|
11
|
-
)
|
12
|
-
end
|
13
|
-
|
14
|
-
def after_singleton_method_call(method_name, zelf_class)
|
15
|
-
store_call_to_tracked_method(
|
16
|
-
candidate = PrivatePlease::Candidate.for_class_method(zelf_class, method_name),
|
17
|
-
is_outside_call = (caller_class != zelf_class)
|
18
|
-
)
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
def caller_class
|
24
|
-
call_initiator = LineChangeTracker.call_initiator
|
25
|
-
if call_initiator.nil?
|
26
|
-
#TODO : investigate why and how this happens
|
27
|
-
end
|
28
|
-
(caller_is_class_method = call_initiator.is_a?(Class)) ?
|
29
|
-
call_initiator :
|
30
|
-
call_initiator.class
|
31
|
-
end
|
32
|
-
|
33
|
-
def store_call_to_tracked_method(candidate, is_outside_call)
|
34
|
-
is_outside_call ?
|
35
|
-
PrivatePlease.calls_store.store_outside_call(candidate) :
|
36
|
-
PrivatePlease.calls_store.store_inside_call( candidate)
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
require 'private_please/tracking/utils'
|
45
|
-
require 'private_please/tracking/load_utils'
|
46
|
-
require 'private_please/tracking/instrumentor'
|
47
|
-
require 'private_please/tracking/extension'
|
48
|
-
require 'private_please/tracking/instruments_all_methods_below'
|
49
|
-
require 'private_please/tracking/instruments_automatically_all_methods_in_all_classes'
|