amp-front 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.
- 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
|