amp-front 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +24 -0
- data/Ampfile +3 -0
- data/Gemfile +10 -0
- data/Gemfile.lock +36 -0
- data/LICENSE +20 -0
- data/README.md +50 -0
- data/Rakefile +64 -0
- data/VERSION +1 -0
- data/design_docs/commands.md +91 -0
- data/design_docs/dependencies.md +35 -0
- data/design_docs/plugins.md +47 -0
- data/features/amp.feature +8 -0
- data/features/amp_help.feature +36 -0
- data/features/amp_plugin_list.feature +10 -0
- data/features/step_definitions/amp-front_steps.rb +23 -0
- data/features/support/env.rb +4 -0
- data/lib/amp-front.rb +30 -0
- data/lib/amp-front/dispatch/commands/base.rb +158 -0
- data/lib/amp-front/dispatch/commands/builtin/help.rb +23 -0
- data/lib/amp-front/dispatch/commands/builtin/plugin.rb +24 -0
- data/lib/amp-front/dispatch/commands/validations.rb +171 -0
- data/lib/amp-front/dispatch/runner.rb +86 -0
- data/lib/amp-front/help/entries/__default__.erb +31 -0
- data/lib/amp-front/help/entries/ampfiles.md +42 -0
- data/lib/amp-front/help/entries/commands.erb +6 -0
- data/lib/amp-front/help/entries/new-commands.md +81 -0
- data/lib/amp-front/help/help.rb +312 -0
- data/lib/amp-front/plugins/base.rb +87 -0
- data/lib/amp-front/support/module_extensions.rb +92 -0
- data/lib/amp-front/third_party/maruku.rb +136 -0
- data/lib/amp-front/third_party/maruku/attributes.rb +227 -0
- data/lib/amp-front/third_party/maruku/defaults.rb +71 -0
- data/lib/amp-front/third_party/maruku/errors_management.rb +92 -0
- data/lib/amp-front/third_party/maruku/helpers.rb +260 -0
- data/lib/amp-front/third_party/maruku/input/charsource.rb +326 -0
- data/lib/amp-front/third_party/maruku/input/extensions.rb +69 -0
- data/lib/amp-front/third_party/maruku/input/html_helper.rb +189 -0
- data/lib/amp-front/third_party/maruku/input/linesource.rb +111 -0
- data/lib/amp-front/third_party/maruku/input/parse_block.rb +615 -0
- data/lib/amp-front/third_party/maruku/input/parse_doc.rb +234 -0
- data/lib/amp-front/third_party/maruku/input/parse_span_better.rb +746 -0
- data/lib/amp-front/third_party/maruku/input/rubypants.rb +225 -0
- data/lib/amp-front/third_party/maruku/input/type_detection.rb +147 -0
- data/lib/amp-front/third_party/maruku/input_textile2/t2_parser.rb +163 -0
- data/lib/amp-front/third_party/maruku/maruku.rb +33 -0
- data/lib/amp-front/third_party/maruku/output/to_ansi.rb +223 -0
- data/lib/amp-front/third_party/maruku/output/to_html.rb +991 -0
- data/lib/amp-front/third_party/maruku/output/to_markdown.rb +164 -0
- data/lib/amp-front/third_party/maruku/output/to_s.rb +56 -0
- data/lib/amp-front/third_party/maruku/string_utils.rb +191 -0
- data/lib/amp-front/third_party/maruku/structures.rb +167 -0
- data/lib/amp-front/third_party/maruku/structures_inspect.rb +87 -0
- data/lib/amp-front/third_party/maruku/structures_iterators.rb +61 -0
- data/lib/amp-front/third_party/maruku/textile2.rb +1 -0
- data/lib/amp-front/third_party/maruku/toc.rb +199 -0
- data/lib/amp-front/third_party/maruku/usage/example1.rb +33 -0
- data/lib/amp-front/third_party/maruku/version.rb +40 -0
- data/lib/amp-front/third_party/trollop.rb +766 -0
- data/spec/amp-front_spec.rb +25 -0
- data/spec/command_specs/base_spec.rb +123 -0
- data/spec/command_specs/command_spec.rb +97 -0
- data/spec/command_specs/help_spec.rb +33 -0
- data/spec/command_specs/spec_helper.rb +37 -0
- data/spec/command_specs/validations_spec.rb +267 -0
- data/spec/dispatch_specs/runner_spec.rb +116 -0
- data/spec/dispatch_specs/spec_helper.rb +15 -0
- data/spec/help_specs/help_entry_spec.rb +78 -0
- data/spec/help_specs/help_registry_spec.rb +77 -0
- data/spec/help_specs/spec_helper.rb +15 -0
- data/spec/plugin_specs/base_spec.rb +36 -0
- data/spec/plugin_specs/spec_helper.rb +15 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +33 -0
- data/spec/support_specs/module_extensions_spec.rb +104 -0
- data/spec/support_specs/spec_helper.rb +15 -0
- data/test/third_party_tests/test_trollop.rb +1181 -0
- metadata +192 -0
@@ -0,0 +1,116 @@
|
|
1
|
+
##################################################################
|
2
|
+
# Licensing Information #
|
3
|
+
# #
|
4
|
+
# The following code is licensed, as standalone code, under #
|
5
|
+
# the Ruby License, unless otherwise directed within the code. #
|
6
|
+
# #
|
7
|
+
# For information on the license of this code when distributed #
|
8
|
+
# with and used in conjunction with the other modules in the #
|
9
|
+
# Amp project, please see the root-level LICENSE file. #
|
10
|
+
# #
|
11
|
+
# © Michael J. Edgar and Ari Brown, 2009-2010 #
|
12
|
+
# #
|
13
|
+
##################################################################
|
14
|
+
|
15
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
16
|
+
|
17
|
+
describe Amp::Dispatch::Runner do
|
18
|
+
before do
|
19
|
+
@runner = Amp::Dispatch::Runner.new(['--version'], :ampfile => "NO SUCH FILE@@@@@@@@@@@@@@@@@@")
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#run!' do
|
23
|
+
it 'parses arguments' do
|
24
|
+
proc { @runner.run! }.should raise_error(SystemExit)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'runs the matching command' do
|
28
|
+
mock_command_class = mock('command class')
|
29
|
+
mock_command = mock('command')
|
30
|
+
Amp::Command.should_receive(:for_name).
|
31
|
+
with('tester --verbose').
|
32
|
+
and_return(mock_command_class)
|
33
|
+
mock_command_class.should_receive(:inspect).and_return('Amp::Command::Tester')
|
34
|
+
mock_command_class.should_receive(:new).and_return(mock_command)
|
35
|
+
mock_command.should_receive(:collect_options).and_return([{:verbose => true}, ['--verbose']])
|
36
|
+
mock_command.should_receive(:call).with(
|
37
|
+
{:verbose => true, :help => false, :version => false}, ['--verbose'])
|
38
|
+
|
39
|
+
runner = Amp::Dispatch::Runner.new(['tester', '--verbose'])
|
40
|
+
runner.run!
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'does not crash when no valid command' do
|
44
|
+
Amp::Command.should_receive(:for_name).
|
45
|
+
with('').
|
46
|
+
and_return(nil)
|
47
|
+
mock_command_class = mock('command class')
|
48
|
+
mock_command = mock('command')
|
49
|
+
Amp::Command::Help = mock_command_class
|
50
|
+
mock_command_class.should_receive(:name).at_most(:once).and_return('Amp::Command::Help')
|
51
|
+
mock_command_class.should_receive(:new).and_return(mock_command)
|
52
|
+
mock_command.should_receive(:collect_options).and_return([{}, []])
|
53
|
+
mock_command.should_receive(:call).with(
|
54
|
+
{:help => false, :version => false}, [])
|
55
|
+
|
56
|
+
runner = Amp::Dispatch::Runner.new([''])
|
57
|
+
runner.run!
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe '#trim_argv_for_command' do
|
62
|
+
it 'strips arguments when arguments matches the command name' do
|
63
|
+
arguments = ['base', 'help']
|
64
|
+
command = mock(:command_class)
|
65
|
+
command.should_receive(:inspect).and_return('Amp::Command::Base')
|
66
|
+
@runner.trim_argv_for_command(arguments, command).should == ['help']
|
67
|
+
arguments.should == ['base', 'help']
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'strips arguments for commands in namespaces' do
|
71
|
+
arguments = ['base', 'help']
|
72
|
+
command = mock(:command_class)
|
73
|
+
command.should_receive(:inspect).and_return('Amp::Command::Base::Help')
|
74
|
+
@runner.trim_argv_for_command(arguments, command).should == []
|
75
|
+
arguments.should == ['base', 'help']
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'raises when the command name does not match arguments' do
|
79
|
+
arguments = ['base', 'hello']
|
80
|
+
command = mock(:command_class)
|
81
|
+
command.should_receive(:inspect).twice.and_return('Amp::Command::Base::Help')
|
82
|
+
proc { @runner.trim_argv_for_command(arguments, command) }.should raise_error(ArgumentError)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe '#collect_options' do
|
87
|
+
it 'stops un unknown options' do
|
88
|
+
arguments = ['help', 'please']
|
89
|
+
options = @runner.collect_options(arguments)
|
90
|
+
arguments.should == ['help', 'please']
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'parses --version automatically and exit' do
|
94
|
+
swizzling_stdout do
|
95
|
+
proc { @runner.collect_options(['--version', 'please']) }.should raise_error(SystemExit)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'displays Amp::VERSION_TITLE with --version' do
|
100
|
+
result = swizzling_stdout do
|
101
|
+
proc { @runner.collect_options(['--version', 'please']) }.should raise_error(SystemExit)
|
102
|
+
end
|
103
|
+
result.should include(Amp::VERSION_TITLE)
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'returns the parsed options' do
|
107
|
+
options, arguments = @runner.collect_options(['help', 'please'])
|
108
|
+
options.should == {:version => false, :help => false}
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'returns the unparsed arguments' do
|
112
|
+
options, arguments = @runner.collect_options(['help', 'please'])
|
113
|
+
arguments.should == ['help', 'please']
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
##################################################################
|
2
|
+
# Licensing Information #
|
3
|
+
# #
|
4
|
+
# The following code is licensed, as standalone code, under #
|
5
|
+
# the Ruby License, unless otherwise directed within the code. #
|
6
|
+
# #
|
7
|
+
# For information on the license of this code when distributed #
|
8
|
+
# with and used in conjunction with the other modules in the #
|
9
|
+
# Amp project, please see the root-level LICENSE file. #
|
10
|
+
# #
|
11
|
+
# © Michael J. Edgar and Ari Brown, 2009-2010 #
|
12
|
+
# #
|
13
|
+
##################################################################
|
14
|
+
|
15
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
@@ -0,0 +1,78 @@
|
|
1
|
+
##################################################################
|
2
|
+
# Licensing Information #
|
3
|
+
# #
|
4
|
+
# The following code is licensed, as standalone code, under #
|
5
|
+
# the Ruby License, unless otherwise directed within the code. #
|
6
|
+
# #
|
7
|
+
# For information on the license of this code when distributed #
|
8
|
+
# with and used in conjunction with the other modules in the #
|
9
|
+
# Amp project, please see the root-level LICENSE file. #
|
10
|
+
# #
|
11
|
+
# © Michael J. Edgar and Ari Brown, 2009-2010 #
|
12
|
+
# #
|
13
|
+
##################################################################
|
14
|
+
|
15
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
16
|
+
|
17
|
+
describe Amp::Help::HelpEntry do
|
18
|
+
before(:each) do
|
19
|
+
@entry_counter ||= 0
|
20
|
+
@entry_counter += 1
|
21
|
+
@entry_name = "fake_help_#{@entry_counter}"
|
22
|
+
end
|
23
|
+
|
24
|
+
after(:each) do
|
25
|
+
Amp::Help::HelpRegistry.entries[@entry_name] = []
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '#text' do
|
29
|
+
it 'equals the text provided in the constructor' do
|
30
|
+
entry = Amp::Help::HelpEntry.new(@entry_name, 'abcba')
|
31
|
+
entry.text.should == 'abcba'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe Amp::Help::MarkdownHelpEntry do
|
36
|
+
describe '#text' do
|
37
|
+
it 'equals the text provided run through the markdown parser' do
|
38
|
+
input = '*hello* **there**'
|
39
|
+
entry = Amp::Help::MarkdownHelpEntry.new(@entry_name, input)
|
40
|
+
output = entry.text
|
41
|
+
output.should == "\e[4mhello\e[24m \e[1mthere\e[22m\n\n"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe Amp::Help::ErbHelpEntry do
|
47
|
+
describe '#text' do
|
48
|
+
it 'equals the text provided run through ERb' do
|
49
|
+
input = '<% 5.times do |x| %><%= x %><% end %>'
|
50
|
+
entry = Amp::Help::ErbHelpEntry.new(@entry_name, input)
|
51
|
+
output = entry.text
|
52
|
+
output.should == "01234"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe Amp::Help::CommandHelpEntry do
|
58
|
+
describe '#text' do
|
59
|
+
it "contains the command's description" do
|
60
|
+
@klass = Class.new(Amp::Command::Base) { desc 'foo bar baz' }
|
61
|
+
entry = Amp::Help::CommandHelpEntry.new(@entry_name, @klass)
|
62
|
+
output = entry.text
|
63
|
+
output.should include('foo bar baz')
|
64
|
+
end
|
65
|
+
|
66
|
+
it "contains the command's options" do
|
67
|
+
@klass = Class.new(Amp::Command::Base) do
|
68
|
+
opt :force, 'forces something dangerous', :short => '-f'
|
69
|
+
end
|
70
|
+
entry = Amp::Help::CommandHelpEntry.new(@entry_name, @klass)
|
71
|
+
output = entry.text
|
72
|
+
output.should include('--force')
|
73
|
+
output.should include('forces something dangerous')
|
74
|
+
output.should include('-f')
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
##################################################################
|
2
|
+
# Licensing Information #
|
3
|
+
# #
|
4
|
+
# The following code is licensed, as standalone code, under #
|
5
|
+
# the Ruby License, unless otherwise directed within the code. #
|
6
|
+
# #
|
7
|
+
# For information on the license of this code when distributed #
|
8
|
+
# with and used in conjunction with the other modules in the #
|
9
|
+
# Amp project, please see the root-level LICENSE file. #
|
10
|
+
# #
|
11
|
+
# © Michael J. Edgar and Ari Brown, 2009-2010 #
|
12
|
+
# #
|
13
|
+
##################################################################
|
14
|
+
|
15
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
16
|
+
|
17
|
+
describe Amp::Help::HelpRegistry do
|
18
|
+
before(:each) do
|
19
|
+
@entry_counter ||= 0
|
20
|
+
@entry_counter += 1
|
21
|
+
@entry_name = "fake_help_#{@entry_counter}"
|
22
|
+
end
|
23
|
+
|
24
|
+
after(:each) do
|
25
|
+
Amp::Help::HelpRegistry.entries[@entry_name] = []
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '#register' do
|
29
|
+
it 'makes help entries available through #[]' do
|
30
|
+
fake_help_entry = mock(:help_entry)
|
31
|
+
Amp::Help::HelpRegistry.register(@entry_name, fake_help_entry)
|
32
|
+
Amp::Help::HelpRegistry[@entry_name].should == [fake_help_entry]
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'makes help entries availabe through #entries' do
|
36
|
+
fake_help_entry = mock(:help_entry)
|
37
|
+
Amp::Help::HelpRegistry.register(@entry_name, fake_help_entry)
|
38
|
+
Amp::Help::HelpRegistry.entries[@entry_name].should == [fake_help_entry]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe '#unregister' do
|
43
|
+
it 'raises an error when the help entry is not found' do
|
44
|
+
lambda {
|
45
|
+
Amp::Help::HelpRegistry.unregister('frobnozzle')
|
46
|
+
}.should raise_error(ArgumentError)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'only needs one argument when a help entry is unambiguous' do
|
50
|
+
fake_help_entry = mock(:help_entry)
|
51
|
+
Amp::Help::HelpRegistry.entries[@entry_name] = [fake_help_entry]
|
52
|
+
# Sanity check before unregistering it
|
53
|
+
Amp::Help::HelpRegistry.entries[@entry_name].should == [fake_help_entry]
|
54
|
+
Amp::Help::HelpRegistry.unregister(@entry_name)
|
55
|
+
Amp::Help::HelpRegistry.entries[@entry_name].should == []
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'raises an error when giving 1 argument on an ambiguous match' do
|
59
|
+
fake_1, fake_2 = mock(:help_entry), mock(:other_help_entry)
|
60
|
+
Amp::Help::HelpRegistry.entries[@entry_name] = [fake_1, fake_2]
|
61
|
+
# Sanity check before unregistering it
|
62
|
+
Amp::Help::HelpRegistry.entries[@entry_name].should == [fake_1, fake_2]
|
63
|
+
lambda {
|
64
|
+
Amp::Help::HelpRegistry.unregister(@entry_name)
|
65
|
+
}.should raise_error(ArgumentError)
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'succeeds when ambiguous matches are clarified' do
|
69
|
+
fake_1, fake_2 = mock(:help_entry), mock(:other_help_entry)
|
70
|
+
Amp::Help::HelpRegistry.entries[@entry_name] = [fake_1, fake_2]
|
71
|
+
# Sanity check before unregistering it
|
72
|
+
Amp::Help::HelpRegistry.entries[@entry_name].should == [fake_1, fake_2]
|
73
|
+
Amp::Help::HelpRegistry.unregister(@entry_name, fake_2)
|
74
|
+
Amp::Help::HelpRegistry.entries[@entry_name].should == [fake_1]
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
##################################################################
|
2
|
+
# Licensing Information #
|
3
|
+
# #
|
4
|
+
# The following code is licensed, as standalone code, under #
|
5
|
+
# the Ruby License, unless otherwise directed within the code. #
|
6
|
+
# #
|
7
|
+
# For information on the license of this code when distributed #
|
8
|
+
# with and used in conjunction with the other modules in the #
|
9
|
+
# Amp project, please see the root-level LICENSE file. #
|
10
|
+
# #
|
11
|
+
# © Michael J. Edgar and Ari Brown, 2009-2010 #
|
12
|
+
# #
|
13
|
+
##################################################################
|
14
|
+
|
15
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
@@ -0,0 +1,36 @@
|
|
1
|
+
##################################################################
|
2
|
+
# Licensing Information #
|
3
|
+
# #
|
4
|
+
# The following code is licensed, as standalone code, under #
|
5
|
+
# the Ruby License, unless otherwise directed within the code. #
|
6
|
+
# #
|
7
|
+
# For information on the license of this code when distributed #
|
8
|
+
# with and used in conjunction with the other modules in the #
|
9
|
+
# Amp project, please see the root-level LICENSE file. #
|
10
|
+
# #
|
11
|
+
# © Michael J. Edgar and Ari Brown, 2009-2010 #
|
12
|
+
# #
|
13
|
+
##################################################################
|
14
|
+
|
15
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
16
|
+
|
17
|
+
describe Amp::Plugins::Base do
|
18
|
+
it 'yields itself for easy configuration' do
|
19
|
+
new_plugin = Amp::Plugins::Base.create('silly') do |plugin|
|
20
|
+
plugin.author = 'Michael Edgar'
|
21
|
+
end
|
22
|
+
new_plugin.author.should == 'Michael Edgar'
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'mentions its author when inspected' do
|
26
|
+
plugin = Amp::Plugins::Base.create('silly') do |plugin|
|
27
|
+
plugin.author = 'adgar@carboni.ca'
|
28
|
+
end
|
29
|
+
plugin.new.inspect.should include('adgar@carboni.ca')
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'infers its own module name' do
|
33
|
+
plugin = Amp::Plugins::Base.create('silly')
|
34
|
+
plugin.new.module.should == 'Amp::Plugins::Silly'
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
##################################################################
|
2
|
+
# Licensing Information #
|
3
|
+
# #
|
4
|
+
# The following code is licensed, as standalone code, under #
|
5
|
+
# the Ruby License, unless otherwise directed within the code. #
|
6
|
+
# #
|
7
|
+
# For information on the license of this code when distributed #
|
8
|
+
# with and used in conjunction with the other modules in the #
|
9
|
+
# Amp project, please see the root-level LICENSE file. #
|
10
|
+
# #
|
11
|
+
# © Michael J. Edgar and Ari Brown, 2009-2010 #
|
12
|
+
# #
|
13
|
+
##################################################################
|
14
|
+
|
15
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color --backtrace
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
##################################################################
|
2
|
+
# Licensing Information #
|
3
|
+
# #
|
4
|
+
# The following code is licensed, as standalone code, under #
|
5
|
+
# the Ruby License, unless otherwise directed within the code. #
|
6
|
+
# #
|
7
|
+
# For information on the license of this code when distributed #
|
8
|
+
# with and used in conjunction with the other modules in the #
|
9
|
+
# Amp project, please see the root-level LICENSE file. #
|
10
|
+
# #
|
11
|
+
# © Michael J. Edgar and Ari Brown, 2009-2010 #
|
12
|
+
# #
|
13
|
+
##################################################################
|
14
|
+
|
15
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
16
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
17
|
+
require 'amp-front'
|
18
|
+
require 'spec'
|
19
|
+
|
20
|
+
include Amp
|
21
|
+
|
22
|
+
Spec::Runner.configure do |config|
|
23
|
+
end
|
24
|
+
|
25
|
+
def swizzling_stdout
|
26
|
+
new_stdout = StringIO.new
|
27
|
+
$stdout, old_stdout = new_stdout, $stdout
|
28
|
+
yield
|
29
|
+
new_stdout.string
|
30
|
+
ensure
|
31
|
+
$stdout = old_stdout
|
32
|
+
new_stdout.string
|
33
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
##################################################################
|
2
|
+
# Licensing Information #
|
3
|
+
# #
|
4
|
+
# The following code is licensed, as standalone code, under #
|
5
|
+
# the Ruby License, unless otherwise directed within the code. #
|
6
|
+
# #
|
7
|
+
# For information on the license of this code when distributed #
|
8
|
+
# with and used in conjunction with the other modules in the #
|
9
|
+
# Amp project, please see the root-level LICENSE file. #
|
10
|
+
# #
|
11
|
+
# © Michael J. Edgar and Ari Brown, 2009-2010 #
|
12
|
+
# #
|
13
|
+
##################################################################
|
14
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
15
|
+
|
16
|
+
describe ModuleExtensions do
|
17
|
+
before do
|
18
|
+
@class = Class.new do
|
19
|
+
extend ModuleExtensions
|
20
|
+
cattr_reader :read1, :read2
|
21
|
+
cattr_writer :write1, :write2
|
22
|
+
cattr_accessor :both1, :both2
|
23
|
+
cattr_accessor_with_default :arr1, []
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#cattr_reader' do
|
28
|
+
it 'creates reading methods for the given variables' do
|
29
|
+
@class.__send__(:instance_variable_set, :@read1, 'hello')
|
30
|
+
@class.read1.should == 'hello'
|
31
|
+
@class.__send__(:instance_variable_set, :@read2, 5)
|
32
|
+
@class.read2.should == 5
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe '#cattr_writer' do
|
37
|
+
it 'creates writing methods for the given variables' do
|
38
|
+
@class.write1 = 'hello'
|
39
|
+
@class.__send__(:instance_variable_get, :@write1).should == 'hello'
|
40
|
+
@class.write2 = 5
|
41
|
+
@class.__send__(:instance_variable_get, :@write2).should == 5
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe '#cattr_accessor' do
|
46
|
+
it 'creates reading and writing methods for the given variables' do
|
47
|
+
@class.both1 = 'hello'
|
48
|
+
@class.both1.should == 'hello'
|
49
|
+
@class.__send__(:instance_variable_get, :@both1).should == 'hello'
|
50
|
+
@class.__send__(:instance_variable_set, :@both1, 'world')
|
51
|
+
@class.both1.should == 'world'
|
52
|
+
@class.both2 = 5
|
53
|
+
@class.both2.should == 5
|
54
|
+
@class.__send__(:instance_variable_get, :@both2).should == 5
|
55
|
+
@class.__send__(:instance_variable_set, :@both2, 10)
|
56
|
+
@class.both2.should == 10
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe '#cattr_accessor_with_default' do
|
61
|
+
it 'creates reading and writing methods, but defaults the ivar value' do
|
62
|
+
@class.arr1.should == []
|
63
|
+
@class.__send__(:instance_variable_get, :@arr1).should == []
|
64
|
+
@class.arr1.should == [] # second invocation, after default value set
|
65
|
+
@class.arr1 = [1, 2]
|
66
|
+
@class.arr1.should == [1, 2]
|
67
|
+
@class.__send__(:instance_variable_get, :@arr1).should == [1, 2]
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe '#cattr_get_and_setter' do
|
72
|
+
before do
|
73
|
+
@base = Class.new do
|
74
|
+
extend ModuleExtensions
|
75
|
+
cattr_get_and_setter :type
|
76
|
+
type :silly
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'acts a setter and getter on the base class' do
|
81
|
+
@base.type.should == :silly
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'is not inherited' do
|
85
|
+
@derived = Class.new(@base)
|
86
|
+
@derived.type.should_not == :silly
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'can be used by inherited classes' do
|
90
|
+
@derived = Class.new(@base) do
|
91
|
+
type :laughable
|
92
|
+
end
|
93
|
+
@derived.type.should == :laughable
|
94
|
+
@base.type.should == :silly
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'turns a block into a proc and sets it' do
|
98
|
+
@derived = Class.new(@base) do
|
99
|
+
type { 5 + 3 }
|
100
|
+
end
|
101
|
+
@derived.type.call.should == 8
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|