bovem 2.4.1 → 3.0.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.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/Gemfile +1 -1
  4. data/README.md +98 -2
  5. data/bovem.gemspec +3 -3
  6. data/doc/Bovem.html +25 -6
  7. data/doc/Bovem/Application.html +3057 -0
  8. data/doc/Bovem/Command.html +7031 -0
  9. data/doc/Bovem/CommandMethods.html +125 -0
  10. data/doc/Bovem/CommandMethods/Children.html +1285 -0
  11. data/doc/Bovem/CommandMethods/Help.html +209 -0
  12. data/doc/Bovem/Configuration.html +3 -3
  13. data/doc/Bovem/Console.html +8 -8
  14. data/doc/Bovem/ConsoleMethods.html +3 -3
  15. data/doc/Bovem/ConsoleMethods/Interactions.html +3 -3
  16. data/doc/Bovem/ConsoleMethods/Interactions/ClassMethods.html +3 -3
  17. data/doc/Bovem/ConsoleMethods/Logging.html +4 -4
  18. data/doc/Bovem/ConsoleMethods/Logging/ClassMethods.html +3 -3
  19. data/doc/Bovem/ConsoleMethods/Output.html +3 -3
  20. data/doc/Bovem/ConsoleMethods/StyleHandling.html +4 -4
  21. data/doc/Bovem/ConsoleMethods/StyleHandling/ClassMethods.html +8 -8
  22. data/doc/Bovem/Errors.html +4 -4
  23. data/doc/Bovem/Errors/Error.html +631 -0
  24. data/doc/Bovem/Errors/InvalidConfiguration.html +3 -3
  25. data/doc/Bovem/Errors/InvalidLogger.html +3 -3
  26. data/doc/Bovem/Localizer.html +376 -0
  27. data/doc/Bovem/Logger.html +64 -160
  28. data/doc/Bovem/Option.html +7009 -0
  29. data/doc/Bovem/Parser.html +276 -0
  30. data/doc/Bovem/ParserMethods.html +125 -0
  31. data/doc/Bovem/ParserMethods/General.html +134 -0
  32. data/doc/Bovem/ParserMethods/General/ClassMethods.html +574 -0
  33. data/doc/Bovem/Shell.html +8 -8
  34. data/doc/Bovem/ShellMethods.html +3 -3
  35. data/doc/Bovem/ShellMethods/Directories.html +3 -3
  36. data/doc/Bovem/ShellMethods/Execute.html +3 -3
  37. data/doc/Bovem/ShellMethods/General.html +3 -3
  38. data/doc/Bovem/ShellMethods/Read.html +3 -3
  39. data/doc/Bovem/ShellMethods/Write.html +3 -3
  40. data/doc/Bovem/Version.html +6 -6
  41. data/doc/_index.html +119 -11
  42. data/doc/class_list.html +1 -1
  43. data/doc/file.README.html +98 -5
  44. data/doc/frames.html +1 -1
  45. data/doc/index.html +98 -5
  46. data/doc/method_list.html +476 -26
  47. data/doc/top-level-namespace.html +3 -3
  48. data/lib/bovem.rb +8 -1
  49. data/lib/bovem/application.rb +158 -0
  50. data/lib/bovem/command.rb +529 -0
  51. data/lib/bovem/console.rb +8 -8
  52. data/lib/bovem/errors.rb +27 -0
  53. data/lib/bovem/localizer.rb +27 -0
  54. data/lib/bovem/logger.rb +2 -8
  55. data/lib/bovem/option.rb +250 -0
  56. data/lib/bovem/parser.rb +317 -0
  57. data/lib/bovem/shell.rb +2 -2
  58. data/lib/bovem/version.rb +3 -3
  59. data/locales/en.yml +33 -0
  60. data/locales/it.yml +33 -0
  61. data/spec/bovem/application_spec.rb +170 -0
  62. data/spec/bovem/command_spec.rb +526 -0
  63. data/spec/bovem/configuration_spec.rb +4 -4
  64. data/spec/bovem/console_spec.rb +22 -22
  65. data/spec/bovem/errors_spec.rb +18 -0
  66. data/spec/bovem/logger_spec.rb +22 -12
  67. data/spec/bovem/option_spec.rb +307 -0
  68. data/spec/bovem/parser_spec.rb +126 -0
  69. data/spec/bovem/shell_spec.rb +4 -4
  70. metadata +32 -5
@@ -7,7 +7,7 @@
7
7
  require "spec_helper"
8
8
 
9
9
  describe Bovem::Configuration do
10
- class BaseConfiguration < ::Bovem::Configuration
10
+ class BaseConfiguration < Bovem::Configuration
11
11
  property :property
12
12
  end
13
13
 
@@ -24,15 +24,15 @@ describe Bovem::Configuration do
24
24
  end
25
25
 
26
26
  it "reject a missing or unreadable file" do
27
- expect { BaseConfiguration.new("/non-existing")}.to raise_error(::Bovem::Errors::InvalidConfiguration)
27
+ expect { BaseConfiguration.new("/non-existing")}.to raise_error(Bovem::Errors::InvalidConfiguration)
28
28
  end
29
29
 
30
30
  it "reject an invalid configuration" do
31
31
  ::File.open("#{test_prefix}-1", "w") {|f| f.write("config.property = ") }
32
32
  ::File.open("#{test_prefix}-2", "w") {|f| f.write("config.non_property = 1234") }
33
33
 
34
- expect { BaseConfiguration.new("#{test_prefix}-1")}.to raise_error(::Bovem::Errors::InvalidConfiguration)
35
- expect { BaseConfiguration.new("#{test_prefix}-2")}.to raise_error(::Bovem::Errors::InvalidConfiguration)
34
+ expect { BaseConfiguration.new("#{test_prefix}-1")}.to raise_error(Bovem::Errors::InvalidConfiguration)
35
+ expect { BaseConfiguration.new("#{test_prefix}-2")}.to raise_error(Bovem::Errors::InvalidConfiguration)
36
36
 
37
37
  File.unlink("#{test_prefix}-1")
38
38
  File.unlink("#{test_prefix}-2")
@@ -8,7 +8,7 @@ require "spec_helper"
8
8
 
9
9
  describe Bovem::Console do
10
10
  let(:console) {
11
- c = ::Bovem::Console.new
11
+ c = Bovem::Console.new
12
12
  c.i18n = :en
13
13
  c
14
14
  }
@@ -20,46 +20,46 @@ describe Bovem::Console do
20
20
 
21
21
  describe ".instance" do
22
22
  it "should always return the same instance" do
23
- instance = ::Bovem::Console.instance
24
- expect(::Bovem::Console.instance).to be(instance)
23
+ instance = Bovem::Console.instance
24
+ expect(Bovem::Console.instance).to be(instance)
25
25
  end
26
26
  end
27
27
 
28
28
  describe ".parse_style" do
29
29
  it "should correctly parse styles" do
30
- expect(::Bovem::Console.parse_style("red")).to eq("\e[31m")
31
- expect(::Bovem::Console.parse_style("bg_green")).to eq("\e[42m")
32
- expect(::Bovem::Console.parse_style("bright")).to eq("\e[1m")
33
- expect(::Bovem::Console.parse_style("FOO")).to eq("")
34
- expect(::Bovem::Console.parse_style(nil)).to eq("")
35
- expect(::Bovem::Console.parse_style(["A"])).to eq("")
36
- expect(::Bovem::Console.parse_style("-")).to eq("")
30
+ expect(Bovem::Console.parse_style("red")).to eq("\e[31m")
31
+ expect(Bovem::Console.parse_style("bg_green")).to eq("\e[42m")
32
+ expect(Bovem::Console.parse_style("bright")).to eq("\e[1m")
33
+ expect(Bovem::Console.parse_style("FOO")).to eq("")
34
+ expect(Bovem::Console.parse_style(nil)).to eq("")
35
+ expect(Bovem::Console.parse_style(["A"])).to eq("")
36
+ expect(Bovem::Console.parse_style("-")).to eq("")
37
37
  end
38
38
  end
39
39
 
40
40
  describe ".replace_markers" do
41
41
  it "should correct replace markers" do
42
- expect(::Bovem::Console.replace_markers("{mark=red}RED{/mark}")).to eq("\e[31mRED\e[0m")
43
- expect(::Bovem::Console.replace_markers("{mark=red}RED {mark=green}GREEN{/mark}{/mark}")).to eq("\e[31mRED \e[32mGREEN\e[31m\e[0m")
44
- expect(::Bovem::Console.replace_markers("{mark=red}RED {mark=bright-green}GREEN {mark=blue}BLUE{mark=NONE}RED{/mark}{/mark}{/mark}{/mark}")).to eq("\e[31mRED \e[1m\e[32mGREEN \e[34mBLUERED\e[1m\e[32m\e[31m\e[0m")
45
- expect(::Bovem::Console.replace_markers("{mark=bg_red}RED{mark=reset}NORMAL{/mark}{/mark}")).to eq("\e[41mRED\e[0mNORMAL\e[41m\e[0m")
46
- expect(::Bovem::Console.replace_markers("{mark=NONE}RED{/mark}")).to eq("RED")
42
+ expect(Bovem::Console.replace_markers("{mark=red}RED{/mark}")).to eq("\e[31mRED\e[0m")
43
+ expect(Bovem::Console.replace_markers("{mark=red}RED {mark=green}GREEN{/mark}{/mark}")).to eq("\e[31mRED \e[32mGREEN\e[31m\e[0m")
44
+ expect(Bovem::Console.replace_markers("{mark=red}RED {mark=bright-green}GREEN {mark=blue}BLUE{mark=NONE}RED{/mark}{/mark}{/mark}{/mark}")).to eq("\e[31mRED \e[1m\e[32mGREEN \e[34mBLUERED\e[1m\e[32m\e[31m\e[0m")
45
+ expect(Bovem::Console.replace_markers("{mark=bg_red}RED{mark=reset}NORMAL{/mark}{/mark}")).to eq("\e[41mRED\e[0mNORMAL\e[41m\e[0m")
46
+ expect(Bovem::Console.replace_markers("{mark=NONE}RED{/mark}")).to eq("RED")
47
47
  end
48
48
 
49
49
  it "should clean up markers if requested" do
50
- expect(::Bovem::Console.replace_markers("{mark=red}RED{/mark}", true)).to eq("RED")
50
+ expect(Bovem::Console.replace_markers("{mark=red}RED{/mark}", true)).to eq("RED")
51
51
  end
52
52
  end
53
53
 
54
54
  describe ".execute_command" do
55
55
  it "should execute a command" do
56
- expect(::Bovem::Console.execute("echo OK")).to eq("OK\n")
56
+ expect(Bovem::Console.execute("echo OK")).to eq("OK\n")
57
57
  end
58
58
  end
59
59
 
60
60
  describe ".min_banner_length" do
61
61
  it "should return a number" do
62
- expect(::Bovem::Console.min_banner_length).to be_a(Fixnum)
62
+ expect(Bovem::Console.min_banner_length).to be_a(Fixnum)
63
63
  end
64
64
  end
65
65
 
@@ -172,7 +172,7 @@ describe Bovem::Console do
172
172
 
173
173
  describe "#replace_markers" do
174
174
  it "should just forwards to .replace_markers" do
175
- expect(::Bovem::Console).to receive(:replace_markers).with("A", "B")
175
+ expect(Bovem::Console).to receive(:replace_markers).with("A", "B")
176
176
  console.replace_markers("A", "B")
177
177
  end
178
178
  end
@@ -208,7 +208,7 @@ describe Bovem::Console do
208
208
 
209
209
  describe "#write_banner_aligned" do
210
210
  it "should call #min_banner_length and #format" do
211
- expect(::Bovem::Console).to receive(:min_banner_length).and_return(1)
211
+ expect(Bovem::Console).to receive(:min_banner_length).and_return(1)
212
212
  expect(console).to receive(:format).with(" A", "B", "C", "D", "E")
213
213
  console.write_banner_aligned("A", "B", "C", "D", "E")
214
214
  end
@@ -415,8 +415,8 @@ describe Bovem::Console do
415
415
  end
416
416
 
417
417
  it "should execute the given block" do
418
- expect(::Bovem::Console).to receive(:foo)
419
- console.task { ::Bovem::Console.foo }
418
+ expect(Bovem::Console).to receive(:foo)
419
+ console.task { Bovem::Console.foo }
420
420
  end
421
421
 
422
422
  it "should write the correct status" do
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+ #
3
+ # This file is part of the bovem gem. Copyright (C) 2013 and above Shogun <shogun_panda@me.com>.
4
+ # Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
5
+ #
6
+
7
+ require "spec_helper"
8
+
9
+ describe Bovem::Errors::Error do
10
+ describe "#initialize" do
11
+ it "copies attributes" do
12
+ error = Bovem::Errors::Error.new("A", "B", "C")
13
+ expect(error.target).to eq("A")
14
+ expect(error.reason).to eq("B")
15
+ expect(error.message).to eq("C")
16
+ end
17
+ end
18
+ end
@@ -7,37 +7,41 @@
7
7
  require "spec_helper"
8
8
 
9
9
  describe Bovem::Logger do
10
+ before(:each) do
11
+ allow(::Time).to receive(:now).and_return(Time.at(10))
12
+ end
13
+
10
14
  describe ".create" do
11
15
  it "should create a new default logger" do
12
- logger = ::Bovem::Logger.create
13
- expect(logger.device).to eq(::Bovem::Logger.default_file)
16
+ logger = Bovem::Logger.create
17
+ expect(logger.device).to eq(Bovem::Logger.default_file)
14
18
  expect(logger.level).to eq(::Logger::INFO)
15
- expect(logger.formatter).to eq(::Bovem::Logger.default_formatter)
19
+ expect(logger.formatter).to eq(Bovem::Logger.default_formatter)
16
20
  end
17
21
 
18
22
  it "should create a logger with a custom file and level" do
19
- logger = ::Bovem::Logger.create("/dev/null", ::Logger::WARN)
23
+ logger = Bovem::Logger.create("/dev/null", ::Logger::WARN)
20
24
  expect(logger.device).to eq("/dev/null")
21
25
  expect(logger.level).to eq(::Logger::WARN)
22
- expect(logger.formatter).to eq(::Bovem::Logger.default_formatter)
26
+ expect(logger.formatter).to eq(Bovem::Logger.default_formatter)
23
27
  end
24
28
 
25
29
  it "should create a logger with a custom formatter" do
26
30
  formatter = Proc.new {|severity, datetime, progname, msg| msg }
27
- logger = ::Bovem::Logger.create("/dev/null", ::Logger::WARN, formatter)
31
+ logger = Bovem::Logger.create("/dev/null", ::Logger::WARN, formatter)
28
32
  expect(logger.device).to eq("/dev/null")
29
33
  expect(logger.level).to eq(::Logger::WARN)
30
34
  expect(logger.formatter).to eq(formatter)
31
35
  end
32
36
 
33
37
  it "should raise exceptions for invalid files" do
34
- expect { ::Bovem::Logger.create("/invalid/file") }.to raise_error(::Bovem::Errors::InvalidLogger)
38
+ expect { Bovem::Logger.create("/invalid/file") }.to raise_error(Bovem::Errors::InvalidLogger)
35
39
  end
36
40
  end
37
41
 
38
42
  describe ".default_formatter" do
39
43
  let(:output) { ::StringIO.new }
40
- let(:logger) { ::Bovem::Logger.create(output, Logger::DEBUG) }
44
+ let(:logger) { Bovem::Logger.create(output, Logger::DEBUG) }
41
45
 
42
46
  def get_last_line(buffer)
43
47
  buffer.string.split("\n").last.strip.gsub(/ T\+\d+\.\d+/, "")
@@ -82,21 +86,27 @@ describe Bovem::Logger do
82
86
 
83
87
  describe ".get_real_file" do
84
88
  it "should return the standard ouput" do
85
- expect(::Bovem::Logger.get_real_file("STDOUT")).to eq($stdout )
89
+ expect(Bovem::Logger.get_real_file("STDOUT")).to eq($stdout )
86
90
  end
87
91
 
88
92
  it "should return the standard error" do
89
- expect(::Bovem::Logger.get_real_file("STDERR")).to eq($stderr )
93
+ expect(Bovem::Logger.get_real_file("STDERR")).to eq($stderr )
90
94
  end
91
95
 
92
96
  it "should return the file" do
93
- expect(::Bovem::Logger.get_real_file("/dev/null")).to eq("/dev/null" )
97
+ expect(Bovem::Logger.get_real_file("/dev/null")).to eq("/dev/null" )
94
98
  end
95
99
  end
96
100
 
97
101
  describe ".default_file" do
98
102
  it "should return the standard output" do
99
- expect(::Bovem::Logger.default_file).to eq($stdout)
103
+ expect(Bovem::Logger.default_file).to eq($stdout)
104
+ end
105
+ end
106
+
107
+ describe ".start_time" do
108
+ it "should store the start time" do
109
+ expect(Bovem::Logger.start_time).to eq(Time.at(10))
100
110
  end
101
111
  end
102
112
  end
@@ -0,0 +1,307 @@
1
+ # encoding: utf-8
2
+ #
3
+ # This file is part of the bovem gem. Copyright (C) 2013 and above Shogun <shogun_panda@me.com>.
4
+ # Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
5
+ #
6
+
7
+ require "spec_helper"
8
+
9
+ describe Bovem::Option do
10
+ let(:application) {
11
+ Bovem::Application.new {
12
+ action {}
13
+ }
14
+ }
15
+
16
+ let(:command) {
17
+ c = Bovem::Command.new
18
+ c.application = application
19
+ c
20
+ }
21
+
22
+ let(:option) {
23
+ o = Bovem::Option.new("NAME")
24
+ o.parent = command
25
+ o
26
+ }
27
+
28
+ describe "#initialize" do
29
+ it "should set good forms" do
30
+ option = Bovem::Option.new("NAME")
31
+ expect(option.name).to eq("NAME")
32
+ expect(option.short).to eq("N")
33
+ expect(option.long).to eq("NAME")
34
+
35
+ option = Bovem::Option.new("NAME", "O")
36
+ expect(option.name).to eq("NAME")
37
+ expect(option.short).to eq("O")
38
+ expect(option.long).to eq("NAME")
39
+
40
+ option = Bovem::Option.new("NAME", ["O", "OPTION"])
41
+ expect(option.name).to eq("NAME")
42
+ expect(option.short).to eq("O")
43
+ expect(option.long).to eq("OPTION")
44
+
45
+ end
46
+
47
+ it "should set options" do
48
+ option = Bovem::Option.new("NAME", ["O", "OPTION"], {required: true, help: "HELP", unused: "UNUSED"})
49
+ expect(option.help).to be_true
50
+ expect(option.help).to eq("HELP")
51
+ end
52
+ end
53
+
54
+ describe "#short=" do
55
+ it "should set good form" do
56
+ option.short = "a"
57
+ expect(option.short).to eq("a")
58
+
59
+ option.short = "-b"
60
+ expect(option.short).to eq("b")
61
+
62
+ option.short = "-c"
63
+ expect(option.short).to eq("c")
64
+
65
+ option.short = 1
66
+ expect(option.short).to eq("1")
67
+
68
+ option.short = true
69
+ expect(option.short).to eq("t")
70
+
71
+ option.short = nil
72
+ expect(option.short).to eq("N")
73
+ end
74
+ end
75
+
76
+ describe "#long=" do
77
+ it "should set good form" do
78
+ option.long = "a"
79
+ expect(option.long).to eq("a")
80
+
81
+ option.long = "abc"
82
+ expect(option.long).to eq("abc")
83
+
84
+ option.long = "-def"
85
+ expect(option.long).to eq("def")
86
+
87
+ option.long = "--ghi"
88
+ expect(option.long).to eq("ghi")
89
+
90
+ option.long = true
91
+ expect(option.long).to eq("true")
92
+
93
+ option.long = 1
94
+ expect(option.long).to eq("1")
95
+
96
+ option.long = nil
97
+ expect(option.long).to eq("NAME")
98
+ end
99
+ end
100
+
101
+ describe "#validator=" do
102
+ it "should set a good validator" do
103
+ proc = -> {}
104
+
105
+ option.validator = "VALUE"
106
+ expect(option.validator).to eq(["VALUE"])
107
+ option.validator = 1
108
+ expect(option.validator).to eq([1])
109
+ option.validator = ["VALUE", "VALUE"]
110
+ expect(option.validator).to eq(["VALUE"])
111
+ option.validator = [1, 2, 1]
112
+ expect(option.validator).to eq([1, 2])
113
+ option.validator = /VALUE/
114
+ expect(option.validator).to eq(/VALUE/)
115
+ option.validator = proc
116
+ expect(option.validator).to eq(proc)
117
+ option.validator = nil
118
+ expect(option.validator).to be_nil
119
+ option.validator = ""
120
+ expect(option.validator).to be_nil
121
+ option.validator = []
122
+ expect(option.validator).to be_nil
123
+ option.validator = //
124
+ expect(option.validator).to be_nil
125
+ end
126
+ end
127
+
128
+ describe "#complete_short" do
129
+ it "should return a good short form" do
130
+ expect(Bovem::Option.new("NAME").complete_short).to eq("-N")
131
+ expect(Bovem::Option.new("NAME", "A").complete_short).to eq("-A")
132
+ expect(Bovem::Option.new("NAME", ["A", "BC"]).complete_short).to eq("-A")
133
+ expect(Bovem::Option.new("NAME", [true, false]).complete_short).to eq("-t")
134
+ end
135
+ end
136
+
137
+ describe "#complete_long" do
138
+ it "should return a good short form" do
139
+ expect(Bovem::Option.new("NAME").complete_long).to eq("--NAME")
140
+ expect(Bovem::Option.new("NAME", "A").complete_long).to eq("--NAME")
141
+ expect(Bovem::Option.new("NAME", ["A", "BC"]).complete_long).to eq("--BC")
142
+ expect(Bovem::Option.new("NAME", [true, true]).complete_long).to eq("--true")
143
+ end
144
+ end
145
+
146
+ describe "#label" do
147
+ it "should return a good label" do
148
+ expect(Bovem::Option.new("NAME").label).to eq("-N/--NAME")
149
+ expect(Bovem::Option.new("NAME", "A").label).to eq("-A/--NAME")
150
+ expect(Bovem::Option.new("NAME", ["A", "BC"]).label).to eq("-A/--BC")
151
+ expect(Bovem::Option.new("NAME", [true, true]).label).to eq("-t/--true")
152
+ end
153
+
154
+ end
155
+
156
+ describe "#meta" do
157
+ it "should return the option meta" do
158
+ expect(Bovem::Option.new("NAME", []).meta).to be_nil
159
+ expect(Bovem::Option.new("NAME", [], {type: String}).meta).to eq("NAME")
160
+ expect(Bovem::Option.new("foo", [], {type: String}).meta).to eq("FOO")
161
+ expect(Bovem::Option.new("NAME", [], {type: String, meta: "STRING"}).meta).to eq("STRING")
162
+ end
163
+ end
164
+
165
+ describe "#set" do
166
+ it "should set the value" do
167
+ expect(option.set("VALUE")).to be_true
168
+ expect(option.value).to eq("VALUE")
169
+ expect(option.provided?).to be_true
170
+ end
171
+
172
+ it "should match against a regexp validator" do
173
+ option.validator = /^A|B$/
174
+
175
+ expect{ option.set("VALUE") }.to raise_error(Bovem::Errors::Error)
176
+ expect(option.value).to be_false
177
+ expect(option.provided?).to be_false
178
+
179
+ expect(option.set("VALUE", false)).to be_false
180
+ expect(option.value).to be_false
181
+ expect(option.provided?).to be_false
182
+
183
+ option.set("A")
184
+ expect(option.value).to eq("A")
185
+ expect(option.provided?).to be_true
186
+
187
+ option.set("B")
188
+ expect(option.value).to eq("B")
189
+ expect(option.provided?).to be_true
190
+ end
191
+
192
+ it "should match against an array validator" do
193
+ option.validator = ["A", "B"]
194
+
195
+ expect{ option.set("VALUE") }.to raise_error(Bovem::Errors::Error)
196
+ expect(option.value).to be_false
197
+ expect(option.provided?).to be_false
198
+
199
+ expect(option.set("VALUE", false)).to be_false
200
+ expect(option.value).to be_false
201
+ expect(option.provided?).to be_false
202
+
203
+ option.set("A")
204
+ expect(option.value).to eq("A")
205
+ expect(option.provided?).to be_true
206
+
207
+ option.set("B")
208
+ expect(option.value).to eq("B")
209
+ expect(option.provided?).to be_true
210
+
211
+ option.validator = [1, 2]
212
+ expect{ option.set("VALUE") }.to raise_error(Bovem::Errors::Error)
213
+ expect(option.value).to be_false
214
+ expect(option.provided?).to be_false
215
+
216
+ option.set(1)
217
+ expect(option.value).to eq(1)
218
+ expect(option.provided?).to be_true
219
+ end
220
+
221
+ it "should match against a Proc validator" do
222
+ option.validator = ->(v) { v % 2 == 0 }
223
+
224
+ expect{ option.set(1) }.to raise_error(Bovem::Errors::Error)
225
+ expect(option.value).to be_false
226
+ expect(option.provided?).to be_false
227
+
228
+ option.set(2)
229
+ expect(option.value).to eq(2)
230
+ expect(option.provided?).to be_true
231
+
232
+ option.set(4)
233
+ expect(option.value).to eq(4)
234
+ expect(option.provided?).to be_true
235
+ end
236
+ end
237
+
238
+ describe "#execute_action" do
239
+ it "should execute action if provided" do
240
+ check = false
241
+ option = Bovem::Option.new("NAME") { |_, _| check = true }
242
+ option.execute_action
243
+
244
+ expect(check).to be_true
245
+ expect(option.provided?).to be_true
246
+ end
247
+
248
+ it "should result in a no-op if the action is missing or doesn't take enough arguments" do
249
+ option.execute_action
250
+ expect(option.provided?).to be_false
251
+
252
+ option = Bovem::Option.new("NAME")
253
+ expect(option.provided?).to be_false
254
+ end
255
+ end
256
+
257
+ describe "#requires_argument?" do
258
+ it "should check if the option requires argument" do
259
+ expect(Bovem::Option.new("NAME", []).requires_argument?).to be_false
260
+ expect(Bovem::Option.new("NAME", [], {type: String}).requires_argument?).to be_true
261
+ expect(Bovem::Option.new("NAME", [], {type: Integer}).requires_argument?).to be_true
262
+ expect(Bovem::Option.new("NAME", [], {type: Float}).requires_argument?).to be_true
263
+ expect(Bovem::Option.new("NAME", [], {type: Array}).requires_argument?).to be_true
264
+ expect(Bovem::Option.new("NAME").requires_argument?).to be_false
265
+ end
266
+ end
267
+
268
+ describe "#provided?" do
269
+ it "should check if the option was provided" do
270
+ expect(Bovem::Option.new("NAME").provided?).to be_false
271
+ option.set(true)
272
+ expect(option.provided?).to be_true
273
+ end
274
+ end
275
+
276
+ describe "#has_help?" do
277
+ it "should check if the option has a help" do
278
+ expect(Bovem::Option.new("NAME").has_help?).to be_false
279
+ expect(Bovem::Option.new("NAME", [], help: "HELP").has_help?).to be_true
280
+ end
281
+ end
282
+
283
+ describe "#value" do
284
+ it "should return the set value" do
285
+ option.default = "DEFAULT VALUE"
286
+ expect(option.value).to eq("DEFAULT VALUE")
287
+
288
+ option.default = nil
289
+ expect(option.value).to be_false
290
+
291
+ option.set(true)
292
+ expect(option.value).to be_true
293
+
294
+ option.set("VALUE")
295
+ expect(option.value).to eq("VALUE")
296
+ end
297
+
298
+ it "should return good defaults" do
299
+ expect(Bovem::Option.new("NAME").value).to be_false
300
+ expect(Bovem::Option.new("NAME", [], {type: Regexp}).value).to be_false
301
+ expect(Bovem::Option.new("NAME", [], {type: String}).value).to eq("")
302
+ expect(Bovem::Option.new("NAME", [], {type: Integer}).value).to eq(0)
303
+ expect(Bovem::Option.new("NAME", [], {type: Float}).value).to eq(0.0)
304
+ expect(Bovem::Option.new("NAME", [], {type: Array}).value).to eq([])
305
+ end
306
+ end
307
+ end