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.
Files changed (89) hide show
  1. checksums.yaml +7 -0
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +3 -5
  4. data/CHANGELOG +4 -0
  5. data/Gemfile +2 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +58 -98
  8. data/Rakefile +6 -2
  9. data/bin/console +14 -0
  10. data/bin/setup +8 -0
  11. data/lib/private_please/config.rb +15 -0
  12. data/lib/private_please/methods_calls_tracker.rb +44 -0
  13. data/lib/private_please/reporting/simple_text.rb +43 -0
  14. data/lib/private_please/reporting/templates/simple.txt.erb +11 -0
  15. data/lib/private_please/storage/called_methods_memory_store.rb +20 -0
  16. data/lib/private_please/tracking/debug/trace_point_data_logger.rb +81 -0
  17. data/lib/private_please/tracking/method_details.rb +27 -0
  18. data/lib/private_please/tracking/result.rb +25 -0
  19. data/lib/private_please/tracking/trace_point_details.rb +41 -0
  20. data/lib/private_please/tracking/trace_point_processor.rb +71 -0
  21. data/lib/private_please/utils/ruby_utils.rb +44 -0
  22. data/lib/private_please/utils/source_file_utils.rb +20 -0
  23. data/lib/private_please/utils/two_level_stack.rb +13 -0
  24. data/lib/private_please/version.rb +2 -1
  25. data/lib/private_please.rb +27 -34
  26. data/private_please.gemspec +32 -25
  27. metadata +106 -185
  28. data/Guardfile +0 -8
  29. data/LICENSE +0 -22
  30. data/TODO +0 -20
  31. data/bin/pp_ruby +0 -62
  32. data/bin/ruby_pp +0 -62
  33. data/doc/dev_notes.txt +0 -32
  34. data/doc/fixtures/complex.rb +0 -103
  35. data/doc/fixtures/empty_class.rb +0 -7
  36. data/doc/fixtures/fixture_helper.rb +0 -8
  37. data/doc/fixtures/sample.rb +0 -57
  38. data/lib/private_please/candidate.rb +0 -49
  39. data/lib/private_please/report/table.rb +0 -44
  40. data/lib/private_please/report.rb +0 -6
  41. data/lib/private_please/reporter/base.rb +0 -14
  42. data/lib/private_please/reporter/data_compiler.rb +0 -82
  43. data/lib/private_please/reporter/helpers/options_helpers.rb +0 -37
  44. data/lib/private_please/reporter/helpers/text_table_helpers.rb +0 -9
  45. data/lib/private_please/reporter/simple_text.rb +0 -18
  46. data/lib/private_please/reporter/templates/simple.txt.erb +0 -80
  47. data/lib/private_please/reporter.rb +0 -8
  48. data/lib/private_please/ruby_backports.rb +0 -22
  49. data/lib/private_please/storage/calls_store.rb +0 -41
  50. data/lib/private_please/storage/candidates_store.rb +0 -52
  51. data/lib/private_please/storage/methods_names.rb +0 -10
  52. data/lib/private_please/storage/methods_names_bucket.rb +0 -69
  53. data/lib/private_please/storage.rb +0 -8
  54. data/lib/private_please/tracking/extension.rb +0 -12
  55. data/lib/private_please/tracking/instrumentor.rb +0 -49
  56. data/lib/private_please/tracking/instruments_all_methods_below.rb +0 -28
  57. data/lib/private_please/tracking/instruments_automatically_all_methods_in_all_classes.rb +0 -68
  58. data/lib/private_please/tracking/line_change_tracker.rb +0 -26
  59. data/lib/private_please/tracking/load_utils/gem_utils.rb +0 -49
  60. data/lib/private_please/tracking/load_utils/standard_lib_utils.rb +0 -38
  61. data/lib/private_please/tracking/load_utils.rb +0 -32
  62. data/lib/private_please/tracking/utils.rb +0 -34
  63. data/lib/private_please/tracking.rb +0 -49
  64. data/sample.rb +0 -68
  65. data/spec/01_tracking_candidate_methods/excluding_gems_and_standard_libraries_spec.rb +0 -31
  66. data/spec/01_tracking_candidate_methods/explicitely_with_the_private_please_command_spec.rb +0 -118
  67. data/spec/01_tracking_candidate_methods/load_utils_spec.rb +0 -40
  68. data/spec/01_tracking_candidate_methods/systematically_in_auto_mode_spec.rb +0 -185
  69. data/spec/03_logging_calls_on_candidate_methods_spec.rb +0 -37
  70. data/spec/04_instrumented_program_activity_observation_result_spec.rb +0 -86
  71. data/spec/05_reporting/report_table_spec.rb +0 -51
  72. data/spec/06_at_exit_spec.rb +0 -18
  73. data/spec/_helpers/assert_helpers.rb +0 -76
  74. data/spec/fixtures/bug_22.rb +0 -17
  75. data/spec/fixtures/bug_30.rb +0 -6
  76. data/spec/fixtures/issue_25.rb +0 -12
  77. data/spec/fixtures/sample_class_for_report.rb +0 -56
  78. data/spec/fixtures/sample_class_with_all_calls_combinations.rb +0 -69
  79. data/spec/sandbox/Gemfile +0 -4
  80. data/spec/sandbox/Gemfile.lock +0 -14
  81. data/spec/sandbox/README.txt +0 -26
  82. data/spec/sandbox/normal.rb +0 -7
  83. data/spec/sandbox/normal_prepended_with_require.rb +0 -8
  84. data/spec/spec_helper.rb +0 -38
  85. data/spec/units/calls_store_spec.rb +0 -15
  86. data/spec/units/candidates_store_spec.rb +0 -55
  87. data/spec/units/reporter/data_compiler_spec.rb +0 -12
  88. data/spec/units/reporter/fixtures/simple_case_1.rb +0 -30
  89. data/spec/units/reporter/fixtures/simple_case_2.rb +0 -55
data/sample.rb DELETED
@@ -1,68 +0,0 @@
1
- # require 'private_please'
2
- require 'lib/private_please' # use the latest version
3
-
4
- module ReportSample
5
- ###########################################
6
- class Simple # Internal calls : #
7
- # -> called methods are _GOOD CANDIDATES_ #
8
- def make_internal_calls ###########################################
9
- instance_m_1 # i -> i
10
- instance_m_3 # i -> i
11
- self.class.class_m_1 # i -> C
12
- self.class.class_m_2 # i -> C
13
- self.class.c_make_internal_method_calls # i -> C --> C
14
- end # +-> i
15
-
16
- def self.c_make_internal_method_calls #
17
- class_m_1 # C -> C
18
- new.instance_m_2 # C -> i
19
- end #
20
- end
21
-
22
- #######################################################
23
- class AnotherClass # External calls (would fail if methods were private) #
24
- private_please # -> called methods are _BAD CANDIDATES_ #
25
- def make_external_calls #######################################################
26
- Simple.new.instance_m_1 # i -> i
27
- Simple .class_m_1 # i -> C
28
- self.class.c_make_external_calls # i -> C -> i
29
- end # -> C
30
- def self.c_make_external_calls #
31
- Simple.new.instance_m_1 # C -> i
32
- Simple .class_m_1 # C -> C
33
- Simple .class_m_2 # C -> C
34
- end #
35
- def call_the_candidate_from_inside_and_outside
36
- make_external_calls
37
- Simple.new.make_internal_calls
38
- end
39
- def never_called; end
40
- def self.never_called_c; end
41
- end
42
-
43
- #-----------------------------------------------------------------------------------------------------------------------
44
- class Simple
45
- def self.not_a_candidate_c1;
46
- class_m_2
47
- end
48
-
49
- private_please
50
- def instance_m_1; end
51
- def instance_m_2; end
52
- def instance_m_3; end
53
-
54
- def self.class_m_1;
55
- class_m_2
56
- end
57
- def self.class_m_2; end
58
-
59
- def never_called_1; end
60
- def self.class_never_called_1; end
61
- end
62
- end unless defined?(ReportSample::Simple)
63
- #-----------------------------------------------------------------------------------------------------------------------
64
-
65
- ReportSample::Simple.new.make_internal_calls
66
- ReportSample::AnotherClass.new.make_external_calls
67
- ReportSample::AnotherClass.c_make_external_calls
68
-
@@ -1,31 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "acceptance : standard libs are not tracked" do
4
-
5
- before { PrivatePlease.pp_automatic_mode_enable }
6
- after { PrivatePlease.pp_automatic_mode_disable}
7
-
8
- module RequireTest; end
9
- #-----------------
10
-
11
- example "the csv **standard library** is required but not tracked" do
12
-
13
- class RequireTest::Case1
14
- require 'csv'
15
- def foo ; end
16
- end
17
-
18
- assert_classes_names ['RequireTest::Case1']
19
- end
20
-
21
- example "the rspec **gem** is required but not tracked" do
22
-
23
- class RequireTest::Case2
24
- require 'rspec/autorun'
25
- def foo ; end
26
- end
27
-
28
- assert_classes_names ['RequireTest::Case2']
29
- end
30
-
31
- end
@@ -1,118 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe PrivatePlease, 'collecting the details of selected candidate-methods to observe' do
4
- module MarkingTest; end
5
-
6
- let(:candidates_store) { PrivatePlease.storage }
7
-
8
- # ----------------
9
- context 'observing with `private_please`' do
10
- # ----------------
11
-
12
- example 'all the instance methods defined after `private_please` are stored as candidates' do
13
-
14
- class MarkingTest::Automatic1
15
- def foo ; end # NO (too early)
16
- private_please # ---> # <start observing>
17
- def baz ; end # *
18
- public # *
19
- def qux ; end # *
20
- def included ; end # * special name, but valid candidate (in classes).
21
- end
22
- assert_instance_methods_candidates 'MarkingTest::Automatic1' =>[:baz, :qux, :included]
23
- assert_class_methods_candidates ({})
24
- end
25
-
26
-
27
- example 'all the class methods defined after `private_please` are stored as candidates' do
28
- class MarkingTest::Automatic1b
29
- def self.foo ; end # NO (too early)
30
- private_please # ---> # <start observing>
31
- def self.baz ; end # YES
32
- public # *
33
- def self.qux ; end # YES
34
- end
35
-
36
- assert_instance_methods_candidates ({})
37
- assert_class_methods_candidates 'MarkingTest::Automatic1b' =>[:baz, :qux]
38
- end
39
-
40
- example ('already private methods are ignored/not observed') do
41
- class MarkingTest::Automatic1c
42
- private_please # ---> # <start observing>
43
- def self.baz ; end # YES
44
- public # *
45
- def qux ; end # YES
46
- private #
47
- def already_private ; end # NO
48
- class << self
49
- private
50
- def class_already_private ; end # NO
51
- end
52
- end
53
-
54
- assert_instance_methods_candidates 'MarkingTest::Automatic1c' =>[:qux]
55
- assert_class_methods_candidates 'MarkingTest::Automatic1c' =>[:baz]
56
- end
57
-
58
-
59
- example 'method coming from an included module are observed too' do
60
-
61
- module Extra002 ; private_please end # <<=== Pre-instrument.
62
- module Extra002::ClassMethods ; private_please end # <<=== Pre-instrument.
63
-
64
- module Extra002 # Reopen the pre-instrumented
65
- def im_from_module ; end # module.
66
- def self.included(base) #
67
- base.extend ClassMethods #
68
- end #
69
- module ClassMethods #
70
- def cm_from_module ; end #
71
- end #
72
- end #
73
- assert_instance_methods_candidates 'Extra002' =>[:im_from_module],
74
- 'Extra002::ClassMethods' =>[:cm_from_module]
75
- assert_class_methods_candidates ({})
76
- end
77
- end
78
-
79
- # ----------------
80
- describe 'overridden methods are not tracked' do
81
- # ----------------
82
- module ExplOverridingTest ; end
83
-
84
- example 'overridden methods are NOT marked as candidate' do
85
- module ExplOverridingTest::UserClasses
86
- class Base #
87
- def base_foo ; end #
88
- def self.c_base_foo ; end #
89
- private_please # <start tracking>
90
- def base_t_bar ; end # is tracked
91
- def self.c_base_t_bar ; end # is tracked
92
- private
93
- def base_priv ; end # private => not tracked
94
- end
95
-
96
- class Overrider < Base
97
- private_please # <start tracking>
98
- def base_priv ; end # overriding a private method => not tracked
99
- def base_yes ; end # new -> tracked
100
- def self.c_base_yes ; end # new -> tracked
101
-
102
- def base_foo ; end # NOT tracked
103
- def base_t_bar ; end # NOT tracked
104
- def self.c_base_foo ; end # NOT tracked
105
- def self.c_base_t_bar ; end # NOT tracked
106
-
107
- def to_s ; end # NOT tracked
108
- end
109
- end
110
-
111
- assert_instance_methods_candidates 'ExplOverridingTest::UserClasses::Base' => [:base_t_bar],
112
- 'ExplOverridingTest::UserClasses::Overrider' => [:base_yes]
113
- assert_class_methods_candidates 'ExplOverridingTest::UserClasses::Base' => [:c_base_t_bar],
114
- 'ExplOverridingTest::UserClasses::Overrider' => [:c_base_yes]
115
- end
116
- end
117
-
118
- end
@@ -1,40 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe PrivatePlease::Tracking::LoadUtils do
4
-
5
- def std_lib?(requiree)
6
- PrivatePlease::Tracking::LoadUtils.standard_lib?(requiree)
7
- end
8
-
9
- def gem?(requiree)
10
- PrivatePlease::Tracking::LoadUtils.gem?(requiree)
11
- end
12
-
13
-
14
- example '.standard_lib? detects if a string matches a standard library' do
15
- std_lib?('csv' ).should be_true
16
- std_lib?('csv.rb' ).should be_true
17
- std_lib?('bigdecimal' ).should be_true
18
- std_lib?('bigdecimal/util' ).should be_true
19
- std_lib?('bigdecimal/util.rb' ).should be_true
20
-
21
- std_lib?('rspec' ).should be_false
22
- std_lib?('private_please' ).should be_false
23
- end
24
-
25
- example '.gem? detects if a string matches a gem' do
26
- gem?('csv' ).should be_false
27
- gem?('csv.rb' ).should be_false
28
- gem?('bigdecimal' ).should be_false
29
- gem?('bigdecimal/util' ).should be_false
30
- gem?('bigdecimal/util.rb' ).should be_false
31
-
32
- gem?('rspec' ).should be_true
33
- gem?('rspec/core/rake_task').should be_true
34
- gem?('rspec/autorun' ).should be_true
35
- gem?('coderay' ).should be_true
36
- #gem?('private_please' ).should be_false
37
- end
38
-
39
-
40
- end
@@ -1,185 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe PrivatePlease, 'in $automatic mode, all the methods are tracked for observation by PP' do
4
-
5
- before { PrivatePlease.pp_automatic_mode_enable }
6
- after { PrivatePlease.pp_automatic_mode_disable}
7
-
8
- # ----------------
9
- context 'in a flat class,' do # simple class; no module nor inheritance
10
- # ----------------
11
- module AutFlatClass; end
12
-
13
- example 'instance and singleton methods are tracked' do
14
- class AutFlatClass::Case1
15
- def foo ; end #
16
- def baz ; end #
17
- def self.foo ; end #
18
- def self.baz ; end #
19
- end
20
-
21
- assert_instance_methods_candidates 'AutFlatClass::Case1' => [:baz, :foo]
22
- assert_singleton_methods_candidates 'AutFlatClass::Case1' => [:baz, :foo]
23
- end
24
-
25
-
26
- example '.included and #included are 2 methods we track in classes.' do
27
- class AutFlatClass::Case2
28
- def foo ; end #
29
-
30
- def self.baz ; end #
31
- end
32
-
33
- assert_instance_methods_candidates 'AutFlatClass::Case2' => [:foo]
34
- assert_singleton_methods_candidates 'AutFlatClass::Case2' => [:baz]
35
- end
36
-
37
-
38
- example 'already private methods are not tracked' do
39
- class AutFlatClass::Case3
40
- def foo ; end # YES
41
- def self.baz ; end # YES
42
- private
43
- def already_private ; end # NO
44
- class << self
45
- private
46
- def class_already_private ; end # NO
47
- end
48
- end
49
-
50
- assert_instance_methods_candidates 'AutFlatClass::Case3' => [:foo]
51
- assert_singleton_methods_candidates 'AutFlatClass::Case3' => [:baz]
52
- end
53
-
54
- example 'metaprograpping-related Class methods are not tracked' do
55
- class AutFlatClass::Case4
56
- def singleton_method_added(_) ; end # NO
57
- def method_added( _) ; end # NO
58
- end
59
-
60
- assert_instance_methods_candidates ({})
61
- assert_singleton_methods_candidates ({})
62
- end
63
- end
64
-
65
- # ----------------
66
- context 'in a flat module,' do # no inheritance
67
- # ----------------
68
- module AutFlatModule; end
69
-
70
- example 'instance and singleton methods are tracked' do
71
- module AutFlatModule::Case1
72
- def foo ; end #
73
- def self.baz ; end #
74
- end
75
-
76
- assert_instance_methods_candidates 'AutFlatModule::Case1' => [:foo]
77
- assert_singleton_methods_candidates 'AutFlatModule::Case1' => [:baz]
78
- end
79
-
80
- example 'we track #included but not .included' do
81
- module AutFlatModule::Case2
82
- def foo ; end #
83
- def included ; end # : not a special name in classes
84
-
85
- def self.baz ; end #
86
- def self.included ; end # : not a special name in classes
87
- end
88
-
89
- assert_instance_methods_candidates 'AutFlatModule::Case2' => [:foo, :included]
90
- assert_singleton_methods_candidates 'AutFlatModule::Case2' => [:baz]
91
- end
92
-
93
-
94
- example 'already private methods are not tracked' do
95
- module AutFlatModule::Case3
96
- private
97
- def already_private ; end # NO
98
- class << self
99
- private
100
- def class_already_private ; end # NO
101
- end
102
- end
103
-
104
- assert_instance_methods_candidates ({})
105
- assert_singleton_methods_candidates ({})
106
- end
107
-
108
- example 'metaprograpping-related Module methods are not tracked' do
109
- module AutFlatModule::Case4
110
- def singleton_method_added(_) ; end # NO
111
- def method_added( _) ; end # NO
112
- def self.included(base) ; end # NO
113
- end
114
-
115
- assert_instance_methods_candidates ({})
116
- assert_singleton_methods_candidates ({})
117
- end
118
-
119
- end
120
-
121
-
122
- # ----------------
123
- context '1 class including 1 module' do
124
- # ----------------
125
- module IncludedModule ; end
126
-
127
- example 'the tracked module methods are associated to the module, not the class(es) that includes the module' do
128
- module IncludedModule
129
- module Module1 #
130
- def im_from_module ; end # YES
131
- def self.included(base) # NO
132
- base.extend ClassMethods #
133
- end #
134
- module ClassMethods #
135
- def cm_from_module ; end # YES
136
- end #
137
- end #
138
- class Case1
139
- include Module1 # NO methods are associated to this class.
140
- end
141
- end
142
-
143
- assert_instance_methods_candidates 'IncludedModule::Module1' =>[:im_from_module],
144
- 'IncludedModule::Module1::ClassMethods' =>[:cm_from_module]
145
- assert_singleton_methods_candidates ({})
146
- end
147
-
148
- end
149
-
150
-
151
- # ----------------
152
- describe 'overridden methods are not tracked in classes' do
153
- # ----------------
154
- module ImplOverridingTest ; end
155
-
156
- example 'overridden methods are NOT marked as candidate' do
157
- module ImplOverridingTest
158
- class Base
159
- def base_t_foo ; end # is tracked
160
- def self.c_base_t_foo ; end # is tracked
161
- private
162
- def base_priv ; end # private => not tracked
163
- end
164
-
165
- class Overrider < Base
166
- def base_priv ; end # overriding a private method => not tracked
167
- def base_yes ; end # new -> tracked
168
- def self.c_base_yes ; end # new -> tracked
169
-
170
- def base_t_foo ; end # NOT tracked
171
- def self.c_base_t_foo ; end # NOT tracked
172
-
173
- def to_s ; end # NOT tracked
174
- end
175
- end
176
-
177
- assert_instance_methods_candidates 'ImplOverridingTest::Base' => [:base_t_foo],
178
- 'ImplOverridingTest::Overrider' => [:base_yes]
179
- assert_class_methods_candidates 'ImplOverridingTest::Base' => [:c_base_t_foo],
180
- 'ImplOverridingTest::Overrider' => [:c_base_yes]
181
- end
182
- end
183
-
184
-
185
- end
@@ -1,37 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe PrivatePlease, 'calling observed methods and logging calls in 2 categories : internal or external' do
4
-
5
- before do
6
- #-----------------------------------------------------------------------------------------------------------------------
7
- load File.dirname(__FILE__) + '/fixtures/sample_class_with_all_calls_combinations.rb'
8
- #-----------------------------------------------------------------------------------------------------------------------
9
- end
10
- after { Object.send(:remove_const, :CallsSample) }
11
-
12
- example ('pure internal calls are categorized correctly') do
13
- CallsSample::Simple.new.make_internal_calls
14
- assert_calls_detected :inside => {'CallsSample::Simple' => mnames_for([:instance_m_1, :instance_m_2])},
15
- :outside => NO_CALLS_OBSERVED,
16
- :inside_c => {'CallsSample::Simple' => mnames_for([:class_m_1, :class_m_2])},
17
- :outside_c => NO_CALLS_OBSERVED
18
- end
19
-
20
- example ('pure external calls are categorized correctly') do
21
- CallsSample::AnotherClass.new.make_external_calls
22
- assert_calls_detected :inside => NO_CALLS_OBSERVED,
23
- :outside => {'CallsSample::Simple' => mnames_for([:instance_m_1])},
24
- :inside_c => {'CallsSample::Simple' => mnames_for([:class_m_2])},
25
- :outside_c => {'CallsSample::Simple' => mnames_for([:class_m_1])}
26
- end
27
-
28
- example('when a method is called both from inside and from outside its class, it is recorded is both categories') do
29
- CallsSample::AnotherClass.new.call_the_candidate_from_inside_and_outside
30
- assert_calls_detected :inside => {'CallsSample::Simple' => mnames_for([:instance_m_1, :instance_m_2])},
31
- :outside => {'CallsSample::Simple' => mnames_for([:instance_m_1])},
32
- :inside_c => {'CallsSample::Simple' => mnames_for([:class_m_2, :class_m_1])},
33
- :outside_c => {'CallsSample::Simple' => mnames_for([:class_m_1])}
34
- end
35
-
36
- #-----------------------------------------------------------------------------------------------------------------------
37
- end