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,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
|
-
|