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.
- 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,86 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe 'PrivatePlease.reporter', 'observing an instrumented program activity' do
|
4
|
-
|
5
|
-
def run_the_instrumented_program
|
6
|
-
ActivityTest::Simple.new.tap do |o|
|
7
|
-
o.not_a_candidate_1
|
8
|
-
o.not_a_candidate_2
|
9
|
-
o.class.not_a_candidate_c1
|
10
|
-
o.bad_candidate_3
|
11
|
-
o.bad_candidate_6
|
12
|
-
o.class.bad_candidate_c3
|
13
|
-
end
|
14
|
-
ActivityTest::Simple2.new.bad_candidate_too
|
15
|
-
ActivityTest::Simple2 .bad_candidate_c_too
|
16
|
-
end
|
17
|
-
|
18
|
-
before do
|
19
|
-
|
20
|
-
module ActivityTest
|
21
|
-
class Simple
|
22
|
-
def not_a_candidate_1; bad_candidate_3 end
|
23
|
-
def not_a_candidate_2; good_candidate_7 end
|
24
|
-
def self.not_a_candidate_c1;
|
25
|
-
good_candidate_c2
|
26
|
-
end
|
27
|
-
private_please
|
28
|
-
def bad_candidate_3; good_candidate_4 end
|
29
|
-
def good_candidate_4; good_candidate_5 end
|
30
|
-
def good_candidate_5; bad_candidate_6 end
|
31
|
-
def bad_candidate_6; good_candidate_7 end
|
32
|
-
def good_candidate_7; end
|
33
|
-
def ignored_8 ; 'never called' end
|
34
|
-
def self.ignored_c9 ; 'never called' end
|
35
|
-
def self.good_candidate_c2; end
|
36
|
-
def self.bad_candidate_c3; end
|
37
|
-
end
|
38
|
-
|
39
|
-
class Simple2
|
40
|
-
private_please
|
41
|
-
def bad_candidate_too; end
|
42
|
-
def ignored_2; 'never called' end
|
43
|
-
def self.ignored_c3; 'never called' end
|
44
|
-
def self.bad_candidate_c_too; end
|
45
|
-
end
|
46
|
-
end unless defined?(ActivityTest::Simple)
|
47
|
-
end
|
48
|
-
|
49
|
-
# Note: test all in 1 go because testing in bits would fail, and it differs from real usage.
|
50
|
-
it 'obtains the right info by observing the program activity' do
|
51
|
-
run_the_instrumented_program
|
52
|
-
the_report_data = PrivatePlease::Reporter::SimpleText.new(PrivatePlease.candidates_store, PrivatePlease.calls_store).data
|
53
|
-
{
|
54
|
-
:good_candidates => the_report_data.good_candidates,
|
55
|
-
:good_candidates_c => the_report_data.good_candidates_c,
|
56
|
-
:bad_candidates => the_report_data.bad_candidates,
|
57
|
-
:bad_candidates_c => the_report_data.bad_candidates_c,
|
58
|
-
:ignored => the_report_data.never_called_candidates,
|
59
|
-
:ignored_c => the_report_data.never_called_candidates_c
|
60
|
-
}.should == {
|
61
|
-
:good_candidates => {
|
62
|
-
'ActivityTest::Simple' => mnames_for([:good_candidate_4, :good_candidate_5, :good_candidate_7])
|
63
|
-
},
|
64
|
-
:good_candidates_c => {
|
65
|
-
'ActivityTest::Simple' => mnames_for([:good_candidate_c2])
|
66
|
-
},
|
67
|
-
:bad_candidates => {
|
68
|
-
'ActivityTest::Simple' => mnames_for([:bad_candidate_3, :bad_candidate_6]),
|
69
|
-
'ActivityTest::Simple2' => mnames_for([:bad_candidate_too])
|
70
|
-
},
|
71
|
-
:bad_candidates_c => {
|
72
|
-
'ActivityTest::Simple' => mnames_for([:bad_candidate_c3]),
|
73
|
-
'ActivityTest::Simple2' => mnames_for([:bad_candidate_c_too])
|
74
|
-
},
|
75
|
-
:ignored => {
|
76
|
-
'ActivityTest::Simple' => mnames_for([:ignored_8]),
|
77
|
-
'ActivityTest::Simple2' => mnames_for([:ignored_2])
|
78
|
-
},
|
79
|
-
:ignored_c => {
|
80
|
-
'ActivityTest::Simple' => mnames_for([:ignored_c9]),
|
81
|
-
'ActivityTest::Simple2' => mnames_for([:ignored_c3])
|
82
|
-
}
|
83
|
-
}
|
84
|
-
end
|
85
|
-
|
86
|
-
end
|
@@ -1,51 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe PrivatePlease::Report::Table do
|
4
|
-
let(:col_1) { %w(a b c) }
|
5
|
-
let(:col_2) { %w(X Y Z) }
|
6
|
-
|
7
|
-
def table(col_1, col_2)
|
8
|
-
PrivatePlease::Report::Table.new(col_1, col_2)
|
9
|
-
end
|
10
|
-
#------------------------------------------------------------------------------
|
11
|
-
|
12
|
-
it 'wraps 2 columns of data' do
|
13
|
-
t = table(col_1, col_2)
|
14
|
-
t.col_1.should == col_1
|
15
|
-
t.col_2.should == col_2
|
16
|
-
end
|
17
|
-
|
18
|
-
it 'pads with nil whichever column is shorter' do
|
19
|
-
table(['1'], %w(a b c)).tap do |t|
|
20
|
-
t.col_1.should == ['1', nil, nil]
|
21
|
-
t.col_2.should == %w(a b c)
|
22
|
-
end
|
23
|
-
table(%w(a b c), ['1']).tap do |t|
|
24
|
-
t.col_1.should == %w(a b c)
|
25
|
-
t.col_2.should == ['1', nil, nil]
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
|
-
example '#rows returns an array of [String, String]' do
|
31
|
-
t = table(['1', '2'], col_2)
|
32
|
-
t.rows.should == [
|
33
|
-
['1', 'X'],
|
34
|
-
['2', 'Y'],
|
35
|
-
[nil, 'Z'],
|
36
|
-
]
|
37
|
-
end
|
38
|
-
|
39
|
-
example '#empty?' do
|
40
|
-
table(['1', '2'], []).should_not be_empty
|
41
|
-
table([], ['1', '2']).should_not be_empty
|
42
|
-
table([], [] ).should be_empty
|
43
|
-
end
|
44
|
-
|
45
|
-
example '#longest_value_length' do
|
46
|
-
table(['a', '12345'], ['b', 'c']).longest_value_length.should == '12345'.length
|
47
|
-
table(['b'], ['a', '12345'] ).longest_value_length.should == '12345'.length
|
48
|
-
table([], [] ).longest_value_length.should == 0
|
49
|
-
end
|
50
|
-
|
51
|
-
end
|
data/spec/06_at_exit_spec.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe 'at_exit() behaviour' do
|
4
|
-
|
5
|
-
it 'prints the PP simpletext report to $stdout (when not in test mode)' do
|
6
|
-
$private_please_tests_are_running = false
|
7
|
-
PrivatePlease::Reporter::SimpleText.stub(:new => stub(:text => '<the-report-text>'))
|
8
|
-
$stdout.
|
9
|
-
should_receive(:puts).
|
10
|
-
with('<the-report-text>')
|
11
|
-
begin
|
12
|
-
PrivatePlease.at_exit
|
13
|
-
ensure
|
14
|
-
$private_please_tests_are_running = true
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
end
|
@@ -1,76 +0,0 @@
|
|
1
|
-
#----------
|
2
|
-
|
3
|
-
def mnames_for(args)
|
4
|
-
PrivatePlease::Storage::MethodsNames.new(Array(args))
|
5
|
-
end
|
6
|
-
|
7
|
-
#----------
|
8
|
-
|
9
|
-
class Hash
|
10
|
-
def to_methods_names_bucket
|
11
|
-
PrivatePlease::Storage::MethodsNamesBucket.new.tap do |bucket|
|
12
|
-
each_pair do |class_name, method_names_as_a|
|
13
|
-
method_names_as_a.each do |method_name|
|
14
|
-
bucket.add_method_name(class_name, method_name)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
|
22
|
-
def assert_classes_names(expected)
|
23
|
-
PrivatePlease.candidates_store.classes_names.should == expected
|
24
|
-
end
|
25
|
-
|
26
|
-
def assert_instance_methods_candidates(raw_expected)
|
27
|
-
expected = raw_expected.to_methods_names_bucket if raw_expected.is_a?(Hash)
|
28
|
-
PrivatePlease.candidates_store.instance_methods.should == expected
|
29
|
-
end
|
30
|
-
|
31
|
-
def assert_class_methods_candidates(raw_expected)
|
32
|
-
expected = raw_expected.to_methods_names_bucket if raw_expected.is_a?(Hash)
|
33
|
-
PrivatePlease.candidates_store.class_methods.should == expected
|
34
|
-
end
|
35
|
-
alias :assert_singleton_methods_candidates :assert_class_methods_candidates
|
36
|
-
|
37
|
-
#----------
|
38
|
-
|
39
|
-
def assert_calls_detected(expected)
|
40
|
-
calls_db = PrivatePlease.calls_store
|
41
|
-
{ :inside => calls_db.internal_calls,
|
42
|
-
:inside_c => calls_db.class_internal_calls,
|
43
|
-
:outside => calls_db.external_calls,
|
44
|
-
:outside_c => calls_db.class_external_calls
|
45
|
-
}.should == expected
|
46
|
-
end
|
47
|
-
|
48
|
-
NO_CALLS_OBSERVED = {}
|
49
|
-
|
50
|
-
def assert_no_calls_detected
|
51
|
-
assert_calls_detected :inside => NO_CALLS_OBSERVED, :outside => NO_CALLS_OBSERVED,
|
52
|
-
:inside_c => NO_CALLS_OBSERVED, :outside_c => NO_CALLS_OBSERVED
|
53
|
-
end
|
54
|
-
|
55
|
-
#----------
|
56
|
-
# Reporter::DataCompiler :
|
57
|
-
#----------
|
58
|
-
|
59
|
-
def run_and_inspect(fixture_file, __file__)
|
60
|
-
PrivatePlease.pp_automatic_mode_enable
|
61
|
-
load File.expand_path(File.dirname(__file__) + "/fixtures/#{fixture_file}")
|
62
|
-
c = PrivatePlease::Reporter::DataCompiler.new(PrivatePlease.candidates_store, PrivatePlease.calls_store)
|
63
|
-
data = c.compile_data
|
64
|
-
end
|
65
|
-
|
66
|
-
def assert_report_data_matches(data, expected_results = $expected_results)
|
67
|
-
['candidates_classes_names', data.candidates_classes_names ].should == ['candidates_classes_names', expected_results[:candidates_classes_names ]]
|
68
|
-
['good_candidates', data.good_candidates ].should == ['good_candidates', expected_results[:good_candidates ]]
|
69
|
-
['bad_candidates', data.bad_candidates ].should == ['bad_candidates', expected_results[:bad_candidates ]]
|
70
|
-
['never_called_candidates', data.never_called_candidates ].should == ['never_called_candidates', expected_results[:never_called_candidates ]]
|
71
|
-
['good_candidates_c', data.good_candidates_c ].should == ['good_candidates_c', expected_results[:good_candidates_c ]]
|
72
|
-
['bad_candidates_c', data.bad_candidates_c ].should == ['bad_candidates_c', expected_results[:bad_candidates_c ]]
|
73
|
-
['never_called_candidates_c', data.never_called_candidates_c].should == ['never_called_candidates_c', expected_results[:never_called_candidates_c]]
|
74
|
-
end
|
75
|
-
|
76
|
-
#----------
|
data/spec/fixtures/bug_22.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
load File.expand_path File.dirname(__FILE__) + '/../../doc/fixtures/fixture_helper.rb'
|
2
|
-
|
3
|
-
module Extra
|
4
|
-
def self.included(base)
|
5
|
-
base.extend(ClassMethods)
|
6
|
-
end
|
7
|
-
module ClassMethods
|
8
|
-
def a_class_method_via_module_Extra ; end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
|
13
|
-
class Simple
|
14
|
-
include Extra
|
15
|
-
end
|
16
|
-
Simple.a_class_method_via_module_Extra
|
17
|
-
|
data/spec/fixtures/bug_30.rb
DELETED
data/spec/fixtures/issue_25.rb
DELETED
@@ -1,56 +0,0 @@
|
|
1
|
-
require 'private_please'
|
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
|
-
private_please
|
44
|
-
def instance_m_1; end
|
45
|
-
def instance_m_2; end
|
46
|
-
|
47
|
-
def self.class_m_1;
|
48
|
-
class_m_2
|
49
|
-
end
|
50
|
-
def self.class_m_2; end
|
51
|
-
|
52
|
-
def never_called_1; end
|
53
|
-
def self.class_never_called_1; end
|
54
|
-
end
|
55
|
-
end unless defined?(ReportSample::Simple)
|
56
|
-
#-----------------------------------------------------------------------------------------------------------------------
|
@@ -1,69 +0,0 @@
|
|
1
|
-
module CallsSample
|
2
|
-
###########################################
|
3
|
-
class Simple # Internal calls : #
|
4
|
-
# -> called methods are _GOOD CANDIDATES_ #
|
5
|
-
def make_internal_calls ###########################################
|
6
|
-
instance_m_1 # i -> i
|
7
|
-
self.class.class_m_1 # i -> C
|
8
|
-
self.class.c_make_internal_method_calls # i -> C --> C
|
9
|
-
end # +-> i
|
10
|
-
|
11
|
-
def self.c_make_internal_method_calls #
|
12
|
-
class_m_1 # C -> C
|
13
|
-
new.instance_m_2 # C -> i
|
14
|
-
end #
|
15
|
-
end
|
16
|
-
|
17
|
-
#######################################################
|
18
|
-
class AnotherClass # External calls (would fail if methods were private) #
|
19
|
-
# -> called methods are _BAD CANDIDATES_ #
|
20
|
-
def make_external_calls #######################################################
|
21
|
-
Simple.new.instance_m_1 # i -> i
|
22
|
-
Simple .class_m_1 # i -> C
|
23
|
-
self.class.c_make_external_calls # i -> C -> i
|
24
|
-
end # -> C
|
25
|
-
def self.c_make_external_calls #
|
26
|
-
Simple.new.instance_m_1 # C -> i
|
27
|
-
Simple .class_m_1 # C -> C
|
28
|
-
end #
|
29
|
-
def call_the_candidate_from_inside_and_outside
|
30
|
-
make_external_calls
|
31
|
-
CallsSample::Simple.new.make_internal_calls
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
#-----------------------------------------------------------------------------------------------------------------------
|
36
|
-
module Extra ; private_please end # <<=== Pre-instrument.
|
37
|
-
module Extra::ClassMethods ; private_please end # <<=== Pre-instrument.
|
38
|
-
|
39
|
-
module Extra
|
40
|
-
def self.included(base)
|
41
|
-
base.extend(ClassMethods)
|
42
|
-
end
|
43
|
-
def an_instance_method ; end
|
44
|
-
module ClassMethods
|
45
|
-
def a_class_method_via_module_Extra ; end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
|
50
|
-
class Simple
|
51
|
-
def self.not_a_candidate_c1;
|
52
|
-
class_m_2
|
53
|
-
end
|
54
|
-
|
55
|
-
private_please
|
56
|
-
include Extra
|
57
|
-
def instance_m_1; end
|
58
|
-
def instance_m_2; end
|
59
|
-
|
60
|
-
def self.class_m_1;
|
61
|
-
class_m_2
|
62
|
-
end
|
63
|
-
def self.class_m_2; end
|
64
|
-
|
65
|
-
def never_called_1; end
|
66
|
-
def self.class_never_called_1; end
|
67
|
-
end
|
68
|
-
#-----------------------------------------------------------------------------------------------------------------------
|
69
|
-
end unless defined?(CallsSample::Simple)
|
data/spec/sandbox/Gemfile
DELETED
data/spec/sandbox/Gemfile.lock
DELETED
data/spec/sandbox/README.txt
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
To inspect the program
|
2
|
-
normal.rb
|
3
|
-
with PrivatePlease, launch it one of these ways :
|
4
|
-
|
5
|
-
$ ruby -rubygems -e "require 'private_please' ; load 'normal.rb'"
|
6
|
-
or
|
7
|
-
$ bundle exec ruby -e "require 'private_please' ; load 'normal.rb'"
|
8
|
-
|
9
|
-
You can also insert the
|
10
|
-
require 'private_please'
|
11
|
-
code in the program itself. (see normal_prepended_with_require.rb, line 3)
|
12
|
-
|
13
|
-
|
14
|
-
ruby normal.rb
|
15
|
-
->
|
16
|
-
ruby -rubygems -e "require 'private_please' ; load 'normal.rb'"
|
17
|
-
ruby -rubygems simple_with_require.rb
|
18
|
-
|
19
|
-
|
20
|
-
be ruby normal.rb
|
21
|
-
->
|
22
|
-
be ruby -e "require 'private_please' ; load 'normal.rb'"
|
23
|
-
be ruby simple_with_require.rb
|
24
|
-
|
25
|
-
|
26
|
-
|