private_please 0.0.5 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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/Guardfile DELETED
@@ -1,8 +0,0 @@
1
- # A sample Guardfile
2
- # More info at https://github.com/guard/guard#readme
3
-
4
- guard 'rspec', :version => 2 do
5
- watch(%r{^spec/.+_spec\.rb$})
6
- watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
7
- watch('spec/spec_helper.rb') { "spec" }
8
- end
data/LICENSE DELETED
@@ -1,22 +0,0 @@
1
- Copyright (c) 2012 Alain Ravet
2
-
3
- MIT License
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining
6
- a copy of this software and associated documentation files (the
7
- "Software"), to deal in the Software without restriction, including
8
- without limitation the rights to use, copy, modify, merge, publish,
9
- distribute, sublicense, and/or sell copies of the Software, and to
10
- permit persons to whom the Software is furnished to do so, subject to
11
- the following conditions:
12
-
13
- The above copyright notice and this permission notice shall be
14
- included in all copies or substantial portions of the Software.
15
-
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/TODO DELETED
@@ -1,20 +0,0 @@
1
-
2
- install only in classes (? and modules)
3
- def self.install
4
- Object.send :include, PrivatePlease::Tracking::Extension
5
- ^^^^^^
6
- TOO WIDE
7
- end
8
-
9
-
10
- DSL
11
- - observe class methods too
12
-
13
- Report :
14
- - option : show file and line number of good candidate definition
15
- - option : show code snippet around the good candidate
16
- - display list of methods that were never called
17
- - display candidates that are already private
18
-
19
- Doc
20
- - write README
data/bin/pp_ruby DELETED
@@ -1,62 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- # ----------------------------------------------------------------------------------- #
4
- # Effects : inject PrivatePlease tracking in the command #
5
- # ----------------------------------------------------------------------------------- #
6
- # $ pp_ruby normal.rb #
7
- # $ bundle exec pp_ruby normal.rb #
8
- # become #
9
- # $ ruby -rubygems -e "require 'private_please' ; load 'normal.rb'" #
10
- # $ bundle exec ruby -e "require 'private_please' ; load 'normal.rb'" #
11
- # ----------------------------------------------------------------------------------- #
12
-
13
-
14
- ########################
15
- # Extract command parts :
16
- ########################
17
-
18
- switches, filename, arguments = [], nil, []
19
- loop do
20
- case ARGV[0]
21
- when '-r' then switches << ARGV.shift << ARGV.shift
22
- when '-e' then switches << ARGV.shift << ARGV.shift.inspect
23
- when /^-\S/ then switches << ARGV.shift
24
- else break
25
- end
26
- end
27
- filename = ARGV.shift
28
- arguments = ARGV
29
-
30
-
31
- ######################
32
- # Assemble new command :
33
- ######################
34
-
35
- # ? called with `bundle exec ruby .....`
36
- in_bundler_mode = !!defined?(Bundler)
37
-
38
- program = in_bundler_mode ?
39
- 'bundle exec ruby' :
40
- 'ruby'
41
-
42
- command = if filename
43
- rubygems_or_not = in_bundler_mode ? nil : " -rubygems"
44
- [ program,
45
- switches,
46
- %|#{rubygems_or_not} -e "require 'private_please' ; load '#{filename}'"| ,
47
- arguments
48
- ]
49
- else
50
- [ program,
51
- switches,
52
- arguments
53
- ]
54
- end.flatten.compact.join(' ')
55
-
56
-
57
- #############################
58
- # Execute transformed command :
59
- #############################
60
-
61
- puts "Executing: #{command}"
62
- puts `#{command}`
data/bin/ruby_pp DELETED
@@ -1,62 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- # ----------------------------------------------------------------------------------- #
4
- # Effects : inject PrivatePlease tracking in the command #
5
- # ----------------------------------------------------------------------------------- #
6
- # $ pp_ruby normal.rb #
7
- # $ bundle exec pp_ruby normal.rb #
8
- # become #
9
- # $ ruby -rubygems -e "require 'private_please' ; load 'normal.rb'" #
10
- # $ bundle exec ruby -e "require 'private_please' ; load 'normal.rb'" #
11
- # ----------------------------------------------------------------------------------- #
12
-
13
-
14
- ########################
15
- # Extract command parts :
16
- ########################
17
-
18
- switches, filename, arguments = [], nil, []
19
- loop do
20
- case ARGV[0]
21
- when '-r' then switches << ARGV.shift << ARGV.shift
22
- when '-e' then switches << ARGV.shift << ARGV.shift.inspect
23
- when /^-\S/ then switches << ARGV.shift
24
- else break
25
- end
26
- end
27
- filename = ARGV.shift
28
- arguments = ARGV
29
-
30
-
31
- ######################
32
- # Assemble new command :
33
- ######################
34
-
35
- # ? called with `bundle exec ruby .....`
36
- in_bundler_mode = !!defined?(Bundler)
37
-
38
- program = in_bundler_mode ?
39
- 'bundle exec ruby' :
40
- 'ruby'
41
-
42
- command = if filename
43
- rubygems_or_not = in_bundler_mode ? nil : " -rubygems"
44
- [ program,
45
- switches,
46
- %|#{rubygems_or_not} -e "require 'private_please' ; load '#{filename}'"| ,
47
- arguments
48
- ]
49
- else
50
- [ program,
51
- switches,
52
- arguments
53
- ]
54
- end.flatten.compact.join(' ')
55
-
56
-
57
- #############################
58
- # Execute transformed command :
59
- #############################
60
-
61
- puts "Executing: #{command}"
62
- puts `#{command}`
data/doc/dev_notes.txt DELETED
@@ -1,32 +0,0 @@
1
- Q: Where is the TODO list :
2
- A: https://github.com/alainravet/private_please/issues?state=open
3
-
4
- How to run the tests :
5
- ========================
6
-
7
- $ cd <project root>
8
- $ bundle exec rspec
9
- or
10
- $ bundle exec guard # (see https://github.com/alainravet/private_please/issues/10)
11
-
12
-
13
- How to test on multiple versions of Ruby :
14
- ============================================
15
- # install rbenv + multiple versions of Ruby
16
- # install the rbenv-each plugin
17
- $ rbenv each -v bundle exec ruby -Ilib rspec
18
-
19
-
20
- How to run the latest PP code on a custom Ruby code sample :
21
- ======================================================
22
-
23
- $ cd <project root>
24
- $ bundle exec ruby -Ilib doc/fixtures/complex.rb
25
-
26
- How to display more than the list of methods that can be made private ?
27
- ======================================================
28
-
29
- $ export PP_OPTIONS="--show-bad-candidates --show-never-called"
30
- $ bundle exec ruby -Ilib doc/fixtures/complex.rb
31
- or
32
- $ PP_OPTIONS="--show-bad-candidates --show-never-called" bundle exec ruby -Ilib doc/fixtures/complex.rb
@@ -1,103 +0,0 @@
1
- load File.dirname(__FILE__) + '/fixture_helper.rb'
2
-
3
- module ComplexReport
4
-
5
- class Class1
6
- def initialize
7
- super
8
- end
9
- def sole_entry_point
10
- instance_m_1
11
- self.class.class_m_1
12
- self.class.c_make_internal_method_calls
13
- end
14
-
15
- def instance_m_1; end
16
- def instance_m_2; end
17
-
18
- def self.class_m_1;
19
- class_m_2
20
- end
21
- def self.class_m_2; end
22
-
23
-
24
- def self.c_make_internal_method_calls
25
- class_m_1
26
- new.instance_m_2
27
- end
28
- end
29
-
30
- end
31
-
32
- #-----------------------------------------------------------------------------------------------------------------------
33
-
34
- ComplexReport::Class1.new.sole_entry_point
35
-
36
- module ComplexReport
37
- ###########################################
38
- class Simple # Internal calls : #
39
- # -> called methods are _GOOD CANDIDATES_ #
40
- def make_internal_calls ###########################################
41
- instance_m_1 # i -> i
42
- self.class.class_m_1 # i -> C
43
- self.class.c_make_internal_method_calls # i -> C --> C
44
- end # +-> i
45
-
46
- def self.c_make_internal_method_calls #
47
- class_m_1 # C -> C
48
- new.instance_m_2 # C -> i
49
- end #
50
- end
51
-
52
- #######################################################
53
- class AnotherClass # External calls (would fail if methods were private) #
54
- # -> called methods are _BAD CANDIDATES_ #
55
- def make_external_calls #######################################################
56
- Simple.new.instance_m_1 # i -> i
57
- Simple .class_m_1 # i -> C
58
- self.class.c_make_external_calls # i -> C -> i
59
- end # -> C
60
- def self.c_make_external_calls #
61
- Simple.new.instance_m_1 # C -> i
62
- Simple .class_m_1 # C -> C
63
- end #
64
- def call_the_candidate_from_inside_and_outside
65
- make_external_calls
66
- Simple.new.make_internal_calls
67
- Simple.a_class_method_via_module_Extra
68
- end
69
- end
70
-
71
- #-----------------------------------------------------------------------------------------------------------------------
72
- module Extra
73
- def self.included(base)
74
- base.extend(ClassMethods)
75
- end
76
- def im_never_called ; raise; end
77
- module ClassMethods
78
- def a_class_method_via_module_Extra ; end
79
- end
80
- end
81
-
82
-
83
- class Simple
84
- def self.not_a_candidate_c1;
85
- class_m_2
86
- end
87
-
88
- include Extra
89
- def instance_m_1; end
90
- def instance_m_2; end
91
-
92
- def self.class_m_1;
93
- class_m_2
94
- end
95
- def self.class_m_2; end
96
-
97
- def never_called_1; end
98
- def self.class_never_called_1; end
99
- end
100
- #-----------------------------------------------------------------------------------------------------------------------
101
- end
102
-
103
- ComplexReport::AnotherClass.new.call_the_candidate_from_inside_and_outside
@@ -1,7 +0,0 @@
1
- require File.dirname(__FILE__) + '/fixture_helper.rb'
2
- load File.dirname(__FILE__) + '/fixture_helper.rb'
3
-
4
- module ReportSample
5
- class EmptyClass
6
- end
7
- end
@@ -1,8 +0,0 @@
1
- begin
2
- # for $ bundle exec ruby -r private_please doc/fixtures/empty_class.r
3
- PrivatePlease::Storage
4
- rescue NameError
5
- # for $ bundle exec ruby -Ilib doc/fixtures/empty_class.r
6
- require 'private_please'
7
- end
8
- PrivatePlease.pp_automatic_mode_enable
@@ -1,57 +0,0 @@
1
- load File.dirname(__FILE__) + '/fixture_helper.rb'
2
-
3
- module ReportSample
4
- ###########################################
5
- class Simple # Internal calls : #
6
- # -> called methods are _GOOD CANDIDATES_ #
7
- def make_internal_calls ###########################################
8
- instance_m_1 # i -> i
9
- self.class.class_m_1 # i -> C
10
- self.class.c_make_internal_method_calls # i -> C --> C
11
- end # +-> i
12
-
13
- def self.c_make_internal_method_calls #
14
- class_m_1 # C -> C
15
- new.instance_m_2 # C -> i
16
- end #
17
- end
18
-
19
- #######################################################
20
- class AnotherClass # External calls (would fail if methods were private) #
21
- # -> called methods are _BAD CANDIDATES_ #
22
- def make_external_calls #######################################################
23
- Simple.new.instance_m_1 # i -> i
24
- Simple .class_m_1 # i -> C
25
- self.class.c_make_external_calls # i -> C -> i
26
- end # -> C
27
- def self.c_make_external_calls #
28
- Simple.new.instance_m_1 # C -> i
29
- Simple .class_m_1 # C -> C
30
- end #
31
- def call_the_candidate_from_inside_and_outside
32
- make_external_calls
33
- Simple.new.make_internal_calls
34
- end
35
- end
36
-
37
- #-----------------------------------------------------------------------------------------------------------------------
38
- class Simple
39
- def self.not_a_candidate_c1;
40
- class_m_2
41
- end
42
-
43
- def instance_m_1; end
44
- def instance_m_2; end
45
-
46
- def self.class_m_1;
47
- class_m_2
48
- end
49
- def self.class_m_2; end
50
-
51
- def never_called_1; end
52
- def self.class_never_called_1; end
53
- end
54
- end
55
- #-----------------------------------------------------------------------------------------------------------------------
56
-
57
- ReportSample::Simple.new.make_internal_calls
@@ -1,49 +0,0 @@
1
- # Holds the details of 1 method that was marked via `private_please`.
2
-
3
- module PrivatePlease
4
- class Candidate
5
-
6
- def initialize(klass, method_name, is_instance_method)
7
- @klass, @method_name, @is_instance_method = klass, method_name, is_instance_method
8
- @klass_name = klass.to_s
9
- end
10
-
11
- def self.for_instance_method(klass, method_name)
12
- new(klass, method_name, true)
13
- end
14
-
15
- def self.for_class_method(klass, method_name)
16
- new(klass, method_name, false)
17
- end
18
-
19
- #----------------------------------------------------------------------------
20
- # QUERIES:
21
- #----------------------------------------------------------------------------
22
-
23
- attr_reader :klass,
24
- :klass_name,
25
- :method_name,
26
- :is_instance_method
27
-
28
- alias_method :instance_method?, :is_instance_method
29
-
30
- def already_instrumented?
31
- instrumented_candidates_store.stored?(self)
32
- end
33
-
34
- #----------------------------------------------------------------------------
35
- # SUGAR:
36
- #----------------------------------------------------------------------------
37
-
38
- def mark_as_instrumented
39
- instrumented_candidates_store.store(self)
40
- end
41
-
42
- #----------------------------------------------------------------------------
43
- private
44
-
45
- def instrumented_candidates_store
46
- PrivatePlease.candidates_store
47
- end
48
- end
49
- end