hammer_cli 0.0.9 → 0.0.10
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 +4 -4
- data/README.md +5 -5
- data/doc/creating_apipie_commands.md +296 -0
- data/doc/creating_commands.md +547 -0
- data/doc/developer_docs.md +5 -926
- data/doc/development_tips.md +30 -0
- data/doc/writing_a_plugin.md +90 -0
- data/lib/hammer_cli/abstract.rb +31 -11
- data/lib/hammer_cli/apipie/resource.rb +14 -6
- data/lib/hammer_cli/apipie/write_command.rb +14 -5
- data/lib/hammer_cli/exception_handler.rb +7 -4
- data/lib/hammer_cli/options/normalizers.rb +27 -0
- data/lib/hammer_cli/output/adapter/abstract.rb +8 -8
- data/lib/hammer_cli/output/adapter/csv.rb +37 -4
- data/lib/hammer_cli/output/adapter/silent.rb +2 -2
- data/lib/hammer_cli/output/dsl.rb +3 -1
- data/lib/hammer_cli/output/output.rb +24 -19
- data/lib/hammer_cli/utils.rb +18 -0
- data/lib/hammer_cli/version.rb +1 -1
- data/lib/hammer_cli.rb +1 -0
- data/test/unit/abstract_test.rb +296 -0
- data/test/unit/apipie/command_test.rb +270 -0
- data/test/unit/apipie/fake_api.rb +101 -0
- data/test/unit/apipie/read_command_test.rb +34 -0
- data/test/unit/apipie/write_command_test.rb +38 -0
- data/test/unit/exception_handler_test.rb +45 -0
- data/test/unit/main_test.rb +47 -0
- data/test/unit/options/normalizers_test.rb +148 -0
- data/test/unit/options/option_definition_test.rb +43 -0
- data/test/unit/output/adapter/abstract_test.rb +96 -0
- data/test/unit/output/adapter/base_test.rb +27 -0
- data/test/unit/output/adapter/csv_test.rb +75 -0
- data/test/unit/output/adapter/table_test.rb +58 -0
- data/test/unit/output/definition_test.rb +27 -0
- data/test/unit/output/dsl_test.rb +119 -0
- data/test/unit/output/fields_test.rb +97 -0
- data/test/unit/output/formatters_test.rb +83 -0
- data/test/unit/output/output_test.rb +104 -0
- data/test/unit/settings_test.rb +106 -0
- data/test/unit/test_helper.rb +20 -0
- data/test/unit/utils_test.rb +35 -0
- data/test/unit/validator_test.rb +142 -0
- metadata +112 -35
- data/LICENSE +0 -5
- data/hammer_cli_complete +0 -13
@@ -0,0 +1,38 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '../test_helper')
|
2
|
+
require File.join(File.dirname(__FILE__), 'fake_api')
|
3
|
+
|
4
|
+
describe HammerCLI::Apipie::WriteCommand do
|
5
|
+
|
6
|
+
let(:cmd) { HammerCLI::Apipie::WriteCommand.new("") }
|
7
|
+
let(:cmd_run) { cmd.run([]) }
|
8
|
+
|
9
|
+
it "should raise exception when no action is defined" do
|
10
|
+
cmd.stubs(:handle_exception).returns(HammerCLI::EX_SOFTWARE)
|
11
|
+
cmd_run.must_equal HammerCLI::EX_SOFTWARE
|
12
|
+
end
|
13
|
+
|
14
|
+
context "resource defined" do
|
15
|
+
|
16
|
+
before :each do
|
17
|
+
cmd.class.resource FakeApi::Resources::Architecture, "some_action"
|
18
|
+
|
19
|
+
arch = FakeApi::Resources::Architecture.new
|
20
|
+
arch.expects(:some_action).returns([])
|
21
|
+
FakeApi::Resources::Architecture.stubs(:new).returns(arch)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should perform a call to api when resource is defined" do
|
25
|
+
cmd_run.must_equal 0
|
26
|
+
end
|
27
|
+
|
28
|
+
context "output" do
|
29
|
+
it "should print success message" do
|
30
|
+
cmd.class.success_message "XXX"
|
31
|
+
proc { cmd_run }.must_output /.*XXX.*/
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'test_helper')
|
2
|
+
|
3
|
+
|
4
|
+
describe HammerCLI::ExceptionHandler do
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
@log_output = Logging::Appenders['__test__']
|
8
|
+
@log_output.reset
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:output) { HammerCLI::Output::Output.new }
|
12
|
+
let(:handler) { HammerCLI::ExceptionHandler.new(:output => output)}
|
13
|
+
let(:heading) { "Something went wrong" }
|
14
|
+
|
15
|
+
it "should handle unauthorized" do
|
16
|
+
output.expects(:print_error).with(heading, "Invalid username or password")
|
17
|
+
handler.handle_exception(RestClient::Unauthorized.new, :heading => heading)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should handle general exception" do
|
21
|
+
output.expects(:print_error).with(heading, "Error: message")
|
22
|
+
handler.handle_exception(Exception.new('message'), :heading => heading)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should handle unknown exception" do
|
26
|
+
output.expects(:print_error).with(heading, "Error: message")
|
27
|
+
MyException = Class.new(Exception)
|
28
|
+
handler.handle_exception(MyException.new('message'), :heading => heading)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should handle resource not found" do
|
32
|
+
ex = RestClient::ResourceNotFound.new
|
33
|
+
output.expects(:print_error).with(heading, ex.message)
|
34
|
+
handler.handle_exception(ex, :heading => heading)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should log the error" do
|
38
|
+
ex = RestClient::ResourceNotFound.new
|
39
|
+
output.default_adapter = :silent
|
40
|
+
handler.handle_exception(ex)
|
41
|
+
@log_output.readline.strip.must_equal 'ERROR Exception : Resource Not Found'
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'test_helper')
|
2
|
+
|
3
|
+
describe HammerCLI::MainCommand do
|
4
|
+
|
5
|
+
describe "loading context" do
|
6
|
+
|
7
|
+
let(:context) { {} }
|
8
|
+
let(:cmd) { HammerCLI::MainCommand.new("", context) }
|
9
|
+
|
10
|
+
before :each do
|
11
|
+
cmd.stubs(:execute).returns(1)
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "username" do
|
15
|
+
|
16
|
+
it "should prioritize parameter" do
|
17
|
+
cmd.run(["-uuser"])
|
18
|
+
context[:username].must_equal "user"
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should prioritize parameter 2" do
|
22
|
+
cmd.run([])
|
23
|
+
context[:username].must_equal nil
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
describe "password" do
|
30
|
+
|
31
|
+
it "should prioritize parameter" do
|
32
|
+
cmd.run(["-ppassword"])
|
33
|
+
context[:password].must_equal "password"
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should prioritize parameter" do
|
37
|
+
cmd.run([])
|
38
|
+
context[:password].must_equal nil
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
@@ -0,0 +1,148 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '../test_helper')
|
2
|
+
|
3
|
+
|
4
|
+
describe HammerCLI::Options::Normalizers do
|
5
|
+
|
6
|
+
|
7
|
+
describe 'abstract' do
|
8
|
+
|
9
|
+
let(:formatter) { HammerCLI::Options::Normalizers::AbstractNormalizer.new }
|
10
|
+
|
11
|
+
it "should raise exception on format" do
|
12
|
+
proc { formatter.format(nil) }.must_raise NotImplementedError
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
describe 'list' do
|
18
|
+
|
19
|
+
let(:formatter) { HammerCLI::Options::Normalizers::List.new }
|
20
|
+
|
21
|
+
it "should return empty array on nil" do
|
22
|
+
formatter.format(nil).must_equal []
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should return empty array on empty string" do
|
26
|
+
formatter.format("").must_equal []
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should parse a string" do
|
30
|
+
formatter.format("a").must_equal ['a']
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should parse a comma separated string" do
|
34
|
+
formatter.format("a,b,c").must_equal ['a', 'b', 'c']
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
describe 'key_value_list' do
|
40
|
+
|
41
|
+
let(:formatter) { HammerCLI::Options::Normalizers::KeyValueList.new }
|
42
|
+
|
43
|
+
it "should return empty array on nil" do
|
44
|
+
formatter.format(nil).must_equal({})
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should return empty array on empty string" do
|
48
|
+
formatter.format("").must_equal({})
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should parse a string" do
|
52
|
+
proc { formatter.format("a") }.must_raise ArgumentError
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should parse a comma separated string" do
|
56
|
+
formatter.format("a=1,b=2,c=3").must_equal({'a' => '1', 'b' => '2', 'c' => '3'})
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should parse a comma separated string 2" do
|
60
|
+
proc { formatter.format("a=1,b,c=3") }.must_raise ArgumentError
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe 'bool' do
|
65
|
+
|
66
|
+
let(:formatter) { HammerCLI::Options::Normalizers::Bool.new }
|
67
|
+
|
68
|
+
it "should return true on true" do
|
69
|
+
formatter.format("true").must_equal(true)
|
70
|
+
formatter.format("TRUE").must_equal(true)
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should return true on t" do
|
74
|
+
formatter.format("t").must_equal(true)
|
75
|
+
formatter.format("T").must_equal(true)
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should return true on yes" do
|
79
|
+
formatter.format("yes").must_equal(true)
|
80
|
+
formatter.format("YES").must_equal(true)
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should return true on y" do
|
84
|
+
formatter.format("y").must_equal(true)
|
85
|
+
formatter.format("Y").must_equal(true)
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should return true on 1" do
|
89
|
+
formatter.format("1").must_equal(true)
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should return false on false" do
|
93
|
+
formatter.format("false").must_equal(false)
|
94
|
+
formatter.format("FALSE").must_equal(false)
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should return false on f" do
|
98
|
+
formatter.format("f").must_equal(false)
|
99
|
+
formatter.format("F").must_equal(false)
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should return false on no" do
|
103
|
+
formatter.format("no").must_equal(false)
|
104
|
+
formatter.format("NO").must_equal(false)
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should return false on n" do
|
108
|
+
formatter.format("n").must_equal(false)
|
109
|
+
formatter.format("N").must_equal(false)
|
110
|
+
end
|
111
|
+
|
112
|
+
it "should return false on 0" do
|
113
|
+
formatter.format("0").must_equal(false)
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should raise exception on nil" do
|
117
|
+
proc { formatter.format(nil) }.must_raise ArgumentError
|
118
|
+
end
|
119
|
+
|
120
|
+
it "should raise exception on other values" do
|
121
|
+
proc { formatter.format('unknown') }.must_raise ArgumentError
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
describe 'enum' do
|
126
|
+
|
127
|
+
let(:formatter) { HammerCLI::Options::Normalizers::Enum.new ['a', 'b'] }
|
128
|
+
|
129
|
+
it "should return return value when in the list" do
|
130
|
+
formatter.format("a").must_equal("a")
|
131
|
+
end
|
132
|
+
|
133
|
+
it "should rise argument error when the value is nil" do
|
134
|
+
proc { formatter.format(nil) }.must_raise ArgumentError
|
135
|
+
end
|
136
|
+
|
137
|
+
it "should rise argument error when the value is not in the list" do
|
138
|
+
proc { formatter.format("c") }.must_raise ArgumentError
|
139
|
+
end
|
140
|
+
|
141
|
+
it "should list allowed values in description" do
|
142
|
+
formatter.description.must_equal("One of 'a', 'b'")
|
143
|
+
end
|
144
|
+
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '../test_helper')
|
2
|
+
|
3
|
+
# require 'hammer_cli/options/option_definition'
|
4
|
+
|
5
|
+
describe HammerCLI::Options::OptionDefinition do
|
6
|
+
|
7
|
+
class FakeFormatter < HammerCLI::Options::Normalizers::AbstractNormalizer
|
8
|
+
def format(val)
|
9
|
+
">>>#{val}<<<"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class TestOptionFormattersCmd < HammerCLI::AbstractCommand
|
14
|
+
option "--test-format", "TEST_FORMAT", "Test option with a formatter",
|
15
|
+
:format => FakeFormatter.new,
|
16
|
+
:default => "A"
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "formatters" do
|
20
|
+
|
21
|
+
it "should use formatter to format a default value" do
|
22
|
+
opt = TestOptionFormattersCmd.find_option("--test-format")
|
23
|
+
|
24
|
+
opt_instance = opt.of(TestOptionFormattersCmd.new([]))
|
25
|
+
opt_instance.read.must_equal '>>>A<<<'
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should use formatter as a conversion block" do
|
29
|
+
opt = TestOptionFormattersCmd.find_option("--test-format")
|
30
|
+
|
31
|
+
opt_instance = opt.of(TestOptionFormattersCmd.new([]))
|
32
|
+
# clamp api changed in 0.6.2
|
33
|
+
if opt_instance.respond_to? :write
|
34
|
+
opt_instance.write('B')
|
35
|
+
else
|
36
|
+
opt_instance.take('B')
|
37
|
+
end
|
38
|
+
opt_instance.read.must_equal '>>>B<<<'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '../../test_helper')
|
2
|
+
|
3
|
+
describe HammerCLI::Output::Adapter::Abstract do
|
4
|
+
|
5
|
+
let(:adapter_class) { HammerCLI::Output::Adapter::Abstract }
|
6
|
+
let(:adapter) { HammerCLI::Output::Adapter::Abstract.new }
|
7
|
+
|
8
|
+
|
9
|
+
it "should have tags" do
|
10
|
+
adapter.tags.must_be_kind_of Array
|
11
|
+
end
|
12
|
+
|
13
|
+
class UnknownTestFormatter < HammerCLI::Output::Formatters::FieldFormatter
|
14
|
+
def format(data)
|
15
|
+
data+'.'
|
16
|
+
end
|
17
|
+
|
18
|
+
def tags
|
19
|
+
[:unknown]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should filter formatters with incompatible tags" do
|
24
|
+
|
25
|
+
HammerCLI::Output::Formatters::FormatterLibrary.expects(:new).with({ :type => [] })
|
26
|
+
adapter = adapter_class.new({}, {:type => [UnknownTestFormatter.new]})
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should keep compatible formatters" do
|
30
|
+
formatter = UnknownTestFormatter.new
|
31
|
+
HammerCLI::Output::Formatters::FormatterLibrary.expects(:new).with({ :type => [formatter] })
|
32
|
+
# set :unknown tag to abstract
|
33
|
+
adapter_class.any_instance.stubs(:tags).returns([:unknown])
|
34
|
+
adapter = adapter_class.new({}, {:type => [formatter]})
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should put serializers first" do
|
38
|
+
formatter1 = UnknownTestFormatter.new
|
39
|
+
formatter1.stubs(:tags).returns([])
|
40
|
+
formatter2 = UnknownTestFormatter.new
|
41
|
+
formatter2.stubs(:tags).returns([:flat])
|
42
|
+
HammerCLI::Output::Formatters::FormatterLibrary.expects(:new).with({ :type => [formatter2, formatter1] })
|
43
|
+
# set :unknown tag to abstract
|
44
|
+
adapter_class.any_instance.stubs(:tags).returns([:flat])
|
45
|
+
adapter = adapter_class.new({}, {:type => [formatter1, formatter2]})
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
context "messages" do
|
50
|
+
it "should print message to stdout" do
|
51
|
+
proc { adapter.print_message("MESSAGE") }.must_output(/.*MESSAGE.*/, "")
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should print formatted message with parameters" do
|
55
|
+
proc { adapter.print_message("MESSAGE %{a}s, %{b}s", :a => 'A', :b => 'B') }.must_output(/.*MESSAGE A, B.*/, "")
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should raise not implemented on print_records" do
|
61
|
+
proc { adapter.print_records([], []) }.must_raise NotImplementedError
|
62
|
+
end
|
63
|
+
|
64
|
+
context "error messages" do
|
65
|
+
it "should print error message to stderr" do
|
66
|
+
proc { adapter.print_error("MESSAGE") }.must_output("", /.*MESSAGE.*/)
|
67
|
+
end
|
68
|
+
|
69
|
+
let(:expected_output) { "MESSAGE:\n"+
|
70
|
+
" error\n"+
|
71
|
+
" message\n"+
|
72
|
+
" details\n"
|
73
|
+
}
|
74
|
+
|
75
|
+
let(:expected_formatted_output) { "MESSAGE A, B:\n"+
|
76
|
+
" error A\n"+
|
77
|
+
" error B\n"
|
78
|
+
}
|
79
|
+
|
80
|
+
it "should print list details of error to stderr" do
|
81
|
+
proc { adapter.print_error("MESSAGE", ["error", "message", "details"]) }.must_output("", expected_output)
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should print string details of error to stderr" do
|
85
|
+
proc { adapter.print_error("MESSAGE", "error\nmessage\ndetails") }.must_output("", expected_output)
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should print formatted message with parameters" do
|
89
|
+
proc {
|
90
|
+
adapter.print_error("MESSAGE %{a}s, %{b}s", ["error %{a}s", "error %{b}s"], :a => 'A', :b => 'B')
|
91
|
+
}.must_output("", expected_formatted_output)
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '../../test_helper')
|
2
|
+
|
3
|
+
describe HammerCLI::Output::Adapter::Base do
|
4
|
+
|
5
|
+
let(:adapter) { HammerCLI::Output::Adapter::Base.new }
|
6
|
+
|
7
|
+
context "print_records" do
|
8
|
+
|
9
|
+
let(:field_name) { Fields::DataField.new(:path => [:name], :label => "Name") }
|
10
|
+
let(:fields) {
|
11
|
+
[field_name]
|
12
|
+
}
|
13
|
+
let(:data) {[{
|
14
|
+
:name => "John Doe"
|
15
|
+
}]}
|
16
|
+
|
17
|
+
it "should print field name" do
|
18
|
+
proc { adapter.print_records(fields, data) }.must_output(/.*Name[ ]*:.*/, "")
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should print field value" do
|
22
|
+
proc { adapter.print_records(fields, data) }.must_output(/.*John Doe.*/, "")
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '../../test_helper')
|
2
|
+
|
3
|
+
describe HammerCLI::Output::Adapter::CSValues do
|
4
|
+
|
5
|
+
let(:adapter) { HammerCLI::Output::Adapter::CSValues.new }
|
6
|
+
|
7
|
+
context "print_records" do
|
8
|
+
|
9
|
+
let(:field_name) { Fields::DataField.new(:path => [:name], :label => "Name") }
|
10
|
+
let(:field_started_at) { Fields::DataField.new(:path => [:started_at], :label => "Started At") }
|
11
|
+
let(:fields) {
|
12
|
+
[field_name, field_started_at]
|
13
|
+
}
|
14
|
+
let(:data) {[{
|
15
|
+
:name => "John Doe",
|
16
|
+
:started_at => "2000"
|
17
|
+
}]}
|
18
|
+
|
19
|
+
it "should print column name" do
|
20
|
+
proc { adapter.print_records(fields, data) }.must_output(/.*Name,Started At.*/, "")
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should print field value" do
|
24
|
+
proc { adapter.print_records(fields, data) }.must_output(/.*John Doe.*/, "")
|
25
|
+
end
|
26
|
+
|
27
|
+
context "handle ids" do
|
28
|
+
let(:field_id) { Fields::Id.new(:path => [:some_id], :label => "Id") }
|
29
|
+
let(:fields) {
|
30
|
+
[field_name, field_id]
|
31
|
+
}
|
32
|
+
|
33
|
+
it "should ommit column of type Id by default" do
|
34
|
+
out, err = capture_io { adapter.print_records(fields, data) }
|
35
|
+
out.wont_match(/.*Id.*/)
|
36
|
+
out.wont_match(/.*John Doe,.*/)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should print column of type Id when --show-ids is set" do
|
40
|
+
adapter = HammerCLI::Output::Adapter::CSValues.new( { :show_ids => true } )
|
41
|
+
out, err = capture_io { adapter.print_records(fields, data) }
|
42
|
+
out.must_match(/.*Id.*/)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context "formatters" do
|
47
|
+
it "should apply formatters" do
|
48
|
+
class DotFormatter < HammerCLI::Output::Formatters::FieldFormatter
|
49
|
+
def format(data)
|
50
|
+
'-DOT-'
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
adapter = HammerCLI::Output::Adapter::CSValues.new({}, { :DataField => [ DotFormatter.new ]})
|
55
|
+
out, err = capture_io { adapter.print_records(fields, data) }
|
56
|
+
out.must_match(/.*-DOT-.*/)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context "print message" do
|
62
|
+
|
63
|
+
it "shoud print a message" do
|
64
|
+
proc { adapter.print_message("SOME MESSAGE") }.must_output("Message\nSOME MESSAGE\n", "")
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should print message, id and name of created/updated record" do
|
68
|
+
proc {
|
69
|
+
adapter.print_message("SOME MESSAGE", "id" => 83, "name" => "new_record")
|
70
|
+
}.must_output("Message,Id,Name\nSOME MESSAGE,83,new_record\n", "")
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '../../test_helper')
|
2
|
+
|
3
|
+
describe HammerCLI::Output::Adapter::Table do
|
4
|
+
|
5
|
+
let(:adapter) { HammerCLI::Output::Adapter::Table.new }
|
6
|
+
|
7
|
+
context "print_records" do
|
8
|
+
|
9
|
+
let(:field_name) { Fields::DataField.new(:path => [:name], :label => "Name") }
|
10
|
+
let(:fields) {
|
11
|
+
[field_name]
|
12
|
+
}
|
13
|
+
let(:data) {[{
|
14
|
+
:name => "John Doe"
|
15
|
+
}]}
|
16
|
+
|
17
|
+
it "should print column name" do
|
18
|
+
proc { adapter.print_records(fields, data) }.must_output(/.*NAME.*/, "")
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should print field value" do
|
22
|
+
proc { adapter.print_records(fields, data) }.must_output(/.*John Doe.*/, "")
|
23
|
+
end
|
24
|
+
|
25
|
+
context "handle ids" do
|
26
|
+
let(:field_id) { Fields::Id.new(:path => [:some_id], :label => "Id") }
|
27
|
+
let(:fields) {
|
28
|
+
[field_name, field_id]
|
29
|
+
}
|
30
|
+
|
31
|
+
it "should ommit column of type Id by default" do
|
32
|
+
out, err = capture_io { adapter.print_records(fields, data) }
|
33
|
+
out.wont_match(/.*ID.*/)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should print column of type Id when --show-ids is set" do
|
37
|
+
adapter = HammerCLI::Output::Adapter::Table.new( { :show_ids => true } )
|
38
|
+
out, err = capture_io { adapter.print_records(fields, data) }
|
39
|
+
out.must_match(/.*ID.*/)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context "formatters" do
|
44
|
+
it "should apply formatters" do
|
45
|
+
class DotFormatter < HammerCLI::Output::Formatters::FieldFormatter
|
46
|
+
def format(data)
|
47
|
+
'-DOT-'
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
adapter = HammerCLI::Output::Adapter::Table.new({}, { :DataField => [ DotFormatter.new ]})
|
52
|
+
out, err = capture_io { adapter.print_records(fields, data) }
|
53
|
+
out.must_match(/.*-DOT-.*/)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '../test_helper')
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
describe HammerCLI::Output::Definition do
|
6
|
+
|
7
|
+
let(:definition) { HammerCLI::Output::Definition.new }
|
8
|
+
let(:last_field) { definition.fields[-1] }
|
9
|
+
let(:field_count) { definition.fields.length }
|
10
|
+
|
11
|
+
it "should be able to add field" do
|
12
|
+
definition.fields << Fields::Field.new
|
13
|
+
field_count.must_equal 1
|
14
|
+
end
|
15
|
+
|
16
|
+
it "append should allow to add data from another definition" do
|
17
|
+
another_def = HammerCLI::Output::Definition.new
|
18
|
+
another_def.fields << Fields::Field.new
|
19
|
+
another_def.fields << Fields::Field.new
|
20
|
+
|
21
|
+
definition.append another_def.fields
|
22
|
+
field_count.must_equal another_def.fields.length
|
23
|
+
definition.fields.must_equal another_def.fields
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|