loco_bot 1.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 (49) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +6 -0
  5. data/Gemfile +3 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +393 -0
  8. data/Rakefile +9 -0
  9. data/bin/loco_bot_cli +10 -0
  10. data/lib/loco_bot/cli/command/base.rb +28 -0
  11. data/lib/loco_bot/cli/command/hodor.rb +14 -0
  12. data/lib/loco_bot/cli/command/left.rb +14 -0
  13. data/lib/loco_bot/cli/command/move.rb +14 -0
  14. data/lib/loco_bot/cli/command/place.rb +17 -0
  15. data/lib/loco_bot/cli/command/report.rb +18 -0
  16. data/lib/loco_bot/cli/command/right.rb +14 -0
  17. data/lib/loco_bot/cli/command.rb +34 -0
  18. data/lib/loco_bot/cli.rb +67 -0
  19. data/lib/loco_bot/robot/direction/east.rb +37 -0
  20. data/lib/loco_bot/robot/direction/north.rb +37 -0
  21. data/lib/loco_bot/robot/direction/south.rb +37 -0
  22. data/lib/loco_bot/robot/direction/west.rb +37 -0
  23. data/lib/loco_bot/robot/direction.rb +27 -0
  24. data/lib/loco_bot/robot.rb +102 -0
  25. data/lib/loco_bot/table.rb +94 -0
  26. data/lib/loco_bot/version.rb +4 -0
  27. data/lib/loco_bot.rb +8 -0
  28. data/loco_bot.gemspec +26 -0
  29. data/spec/loco_bot/cli/command/hodor_spec.rb +14 -0
  30. data/spec/loco_bot/cli/command/left_spec.rb +14 -0
  31. data/spec/loco_bot/cli/command/move_spec.rb +14 -0
  32. data/spec/loco_bot/cli/command/place_spec.rb +14 -0
  33. data/spec/loco_bot/cli/command/report_spec.rb +22 -0
  34. data/spec/loco_bot/cli/command/right_spec.rb +14 -0
  35. data/spec/loco_bot/cli/command_spec.rb +53 -0
  36. data/spec/loco_bot/cli_spec.rb +37 -0
  37. data/spec/loco_bot/robot/direction/east_spec.rb +25 -0
  38. data/spec/loco_bot/robot/direction/north_spec.rb +25 -0
  39. data/spec/loco_bot/robot/direction/south_spec.rb +25 -0
  40. data/spec/loco_bot/robot/direction/west_spec.rb +25 -0
  41. data/spec/loco_bot/robot/direction_spec.rb +35 -0
  42. data/spec/loco_bot/robot_spec.rb +247 -0
  43. data/spec/loco_bot/table_spec.rb +197 -0
  44. data/spec/spec_helper.rb +31 -0
  45. data/spec/support/test_1.txt +3 -0
  46. data/spec/support/test_2.txt +3 -0
  47. data/spec/support/test_3.txt +6 -0
  48. data/spec/support/test_4.txt +28 -0
  49. metadata +183 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ef33dd6ab2797541d85647722519e50e1fcf5c56
4
+ data.tar.gz: 2695c38bbc217dd317ba7ab67cfc6681e4034be7
5
+ SHA512:
6
+ metadata.gz: 713365f6dd107ae2ac6410e192d5f77d4da7fd60590f289b409967e29dad9a83987103a6be79800092d0d02eba6b27a15b1f28dec10ac205736b1b4b0db69526
7
+ data.tar.gz: 511a8c28a3cfcd05ceb5b925f15c4cebfa250ca6a7b219657403c80d829add94e1c070248112b6260641a6805a94f505aa4a49828696ba914941d776663de2ac
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ --require spec_helper
3
+ --order random
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.0
4
+ - 2.0.0
5
+
6
+ script: 'bundle exec rake test'
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Rafaël Gonzalez
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,393 @@
1
+ [![Build Status](https://travis-ci.org/rafaelgonzalez/loco_bot.svg?branch=master)](https://travis-ci.org/rafaelgonzalez/loco_bot)
2
+ [![Dependency Status](https://gemnasium.com/rafaelgonzalez/loco_bot.svg)](https://gemnasium.com/rafaelgonzalez/loco_bot)
3
+ [![Test Coverage](https://codeclimate.com/github/rafaelgonzalez/loco_bot/badges/coverage.svg)](https://codeclimate.com/github/rafaelgonzalez/loco_bot)
4
+ [![Code Climate](https://codeclimate.com/github/rafaelgonzalez/loco_bot/badges/gpa.svg)](https://codeclimate.com/github/rafaelgonzalez/loco_bot)
5
+
6
+ # LocoBot
7
+
8
+ Ruby gem of crazy robots and benevolent tables that keep watching over them.
9
+
10
+ Issue commands to control the robots and the tables will keep you from making them fall.
11
+
12
+ > You monster!
13
+
14
+ > *- GLadOS*
15
+
16
+ ## Rules
17
+
18
+ - Robots can not move until placed on a table.
19
+ - Robots are free to roam around the surface of the table, but will be prevented from
20
+ - falling from the table
21
+ - crashing into other robots on the same table
22
+
23
+ ## Installation
24
+
25
+ Via RubyGems:
26
+
27
+ $ gem install loco_bot
28
+
29
+ Or in a Gemfile:
30
+
31
+ gem 'loco_bot'
32
+
33
+ ## Usage
34
+
35
+ ### Command line interface
36
+
37
+ From the CLI, you can place a robot on a table of 5x5 and play around with it.
38
+
39
+ This means you only have a unique instance of `Robot` and `Table` available through this interface.
40
+
41
+ To use multiple robots and tables, see the API usage further below.
42
+
43
+ #### Manual input
44
+
45
+ Just run the binary and start typing commands:
46
+
47
+ $ loco_bot_cli
48
+
49
+ Available commands are:
50
+
51
+ - **PLACE X,Y,F**
52
+
53
+ Puts the robot on the table in position X,Y and facing NORTH, SOUTH, EAST or WEST.
54
+
55
+ - **MOVE**
56
+
57
+ Moves the robot one unit forward in the direction it is currently facing.
58
+
59
+ - **LEFT** and **RIGHT**
60
+
61
+ Rotates the robot 90 degrees in the specified direction without changing its position.
62
+
63
+ - **REPORT**
64
+
65
+ Announces the X,Y and F of the robot.
66
+
67
+ - **HODOR**
68
+
69
+ Outputs a friendly greating.
70
+
71
+ Example:
72
+
73
+ $ loco_bot_cli
74
+ PLACE 1,2,SOUTH
75
+ MOVE
76
+ LEFT
77
+ MOVE
78
+ MOVE
79
+ REPORT
80
+ 0,4,EAST
81
+
82
+ #### Input from files
83
+
84
+ You can also use files to issue commands, like so:
85
+
86
+ $ loco_bot_cli < ./spec/support/test_1.txt
87
+
88
+ ### API
89
+
90
+ Full documentation is available [here](http://rubydoc.info/github/rafaelgonzalez/locobot/master/frames).
91
+
92
+ #### LocoBot::Table
93
+
94
+ ##### #new
95
+
96
+ You can specify the dimensions of the `Table`. Default dimensions are 5x5.
97
+
98
+ ```ruby
99
+ table = LocoBot::Table.new
100
+ table.width # => 5
101
+ table.height # => 5
102
+
103
+ table = LocoBot::Table.new(20, 25)
104
+ table.width # => 20
105
+ table.height # => 25
106
+ ```
107
+
108
+ ##### #place_robot
109
+
110
+ Place the given `Robot` on the `Table`.
111
+
112
+ This method works the same way as `Robot#place`, only a `Robot` is passed as first argument instead of a `Table`.
113
+
114
+ Placing a `Robot` on a `Table` will:
115
+
116
+ - update the `Table`'s list of `Robot`s
117
+
118
+ ```ruby
119
+ robot = LocoBot::Robot.new
120
+ table = LocoBot::Table.new(10, 20)
121
+
122
+ table.robots # => []
123
+
124
+ table.place_robot(robot, 2, 3, LocoBot::Robot::Direction::North) # => true
125
+
126
+ table.robots # => [#<LocoBot::Robot:0x007f9212e7ad5>]
127
+ ```
128
+
129
+ - update the `Robot`'s positions
130
+
131
+ ```ruby
132
+ robot = LocoBot::Robot.new
133
+ table = LocoBot::Table.new(10, 20)
134
+
135
+ robot.x # => nil
136
+ robot.y # => nil
137
+ robot.direction # => nil
138
+ robot.table # => nil
139
+
140
+ table.place_robot(robot, 2, 3, LocoBot::Robot::Direction::North) # => true
141
+
142
+ robot.x # => 2
143
+ robot.y # => 3
144
+ robot.direction # => LocoBot::Robot::Direction::North
145
+ robot.table # => #<LocoBot::Table:0x007f9212e62480 @width=10, @height=20>
146
+ ```
147
+
148
+ A `Robot` can not be placed on a spot outside the `Table`.
149
+
150
+ ```ruby
151
+ robot = LocoBot::Robot.new
152
+ table = LocoBot::Table.new(10, 20)
153
+
154
+ table.place_robot(robot, 100, 12, LocoBot::Robot::Direction::North) # => false
155
+
156
+ robot.table # => nil
157
+ table.robots # => []
158
+ ```
159
+
160
+ A `Robot` can not be placed on a spot of the `Table` where there is another `Robot`.
161
+
162
+ ```ruby
163
+ robot = LocoBot::Robot.new
164
+ table = LocoBot::Table.new(10, 20)
165
+
166
+ table.place_robot(LocoBot::Robot.new, 2, 3, LocoBot::Robot::Direction::North) # => true
167
+
168
+ table.place_robot(robot, 2, 3, LocoBot::Robot::Direction::East) # => false
169
+
170
+ robot.table # => nil
171
+ table.robots.count # => 1
172
+ ```
173
+
174
+ ##### #remove_robot
175
+
176
+ Removes the given `Robot` from the `Table`.
177
+
178
+ ```ruby
179
+ robot = LocoBot::Robot.new
180
+ table = LocoBot::Table.new(10, 20)
181
+ table.place_robot(robot, 2, 3, LocoBot::Robot::Direction::North) # => true
182
+
183
+ table.robots # => [#<LocoBot::Robot:0x007f9212e7ad5>]
184
+ robot.table # => #<LocoBot::Table:0x007f9212e62480 @width=10, @height=20>
185
+
186
+ table.remove_remove(robot)
187
+
188
+ table.robots # => []
189
+ robot.table # => nil
190
+ ```
191
+
192
+ #### LocoBot::Robot
193
+
194
+ All the following methods, except for `#report` and `#hodor`, return a `Boolean`.
195
+
196
+ If they return `true`, the operation as succeded and the state of the Robot has changed. They will return `false` otherwise.
197
+
198
+ ##### #place
199
+
200
+ Place the `Robot` on the given `Table`.
201
+
202
+ This method works the same way as `Table#place_robot`, only a `Table` is passed as first argument instead of a `Robot`.
203
+
204
+ Placing a `Robot` on a `Table` will:
205
+
206
+ - update the `Table`'s list of `Robot`s
207
+
208
+ ```ruby
209
+ robot = LocoBot::Robot.new
210
+ table = LocoBot::Table.new(10, 20)
211
+
212
+ table.robots # => []
213
+
214
+ robot.place(table, 2, 3, LocoBot::Robot::Direction::North) # => true
215
+
216
+ table.robots # => [#<LocoBot::Robot:0x007f9212e7ad5>]
217
+ ```
218
+
219
+ - update the `Robot`'s positions
220
+
221
+ ```ruby
222
+ robot = LocoBot::Robot.new
223
+ table = LocoBot::Table.new(10, 20)
224
+
225
+ robot.x # => nil
226
+ robot.y # => nil
227
+ robot.direction # => nil
228
+ robot.table # => nil
229
+
230
+ robot.place(table, 2, 3, LocoBot::Robot::Direction::North) # => true
231
+
232
+ robot.x # => 2
233
+ robot.y # => 3
234
+ robot.direction # => LocoBot::Robot::Direction::North
235
+ robot.table # => #<LocoBot::Table:0x007f9212e62480 @width=10, @height=20>
236
+ ```
237
+
238
+ A `Robot` can not be placed on a spot outside the `Table`.
239
+
240
+ ```ruby
241
+ robot = LocoBot::Robot.new
242
+ table = LocoBot::Table.new(10, 20)
243
+
244
+ robot.place(table, 100, 12, LocoBot::Robot::Direction::North) # => false
245
+
246
+ robot.table # => nil
247
+ table.robots # => []
248
+ ```
249
+
250
+ A `Robot` can not be placed on a spot of the `Table` where there is another `Robot`.
251
+
252
+ ```ruby
253
+ robot = LocoBot::Robot.new
254
+ table = LocoBot::Table.new(10, 20)
255
+
256
+ LocoBot::Robot.new.place(table, 2, 3, LocoBot::Robot::Direction::North) # => true
257
+
258
+ robot.place(table, 2, 3, LocoBot::Robot::Direction::East) # => false
259
+
260
+ robot.table # => nil
261
+ table.robots.count # => 1
262
+ ```
263
+
264
+ ##### #remove
265
+
266
+ Removes the `Robot` from its current `Table`.
267
+
268
+ ```ruby
269
+ robot = LocoBot::Robot.new
270
+ table = LocoBot::Table.new(10, 20)
271
+ robot.place(table, 2, 3, LocoBot::Robot::Direction::North) # => true
272
+
273
+ table.robots # => [#<LocoBot::Robot:0x007f9212e7ad5>]
274
+ robot.table # => #<LocoBot::Table:0x007f9212e62480 @width=10, @height=20>
275
+
276
+ robot.remove
277
+
278
+ table.robots # => []
279
+ robot.table # => nil
280
+ ```
281
+
282
+ ##### #turn_left, #turn_right
283
+
284
+ Changes the `Robot`'s facing direction without changing its position.
285
+
286
+ ```ruby
287
+ robot = LocoBot::Robot.new
288
+ table = LocoBot::Table.new
289
+
290
+ robot.place(table, 2, 3, LocoBot::Robot::Direction::West)
291
+ robot.direction # => LocoBot::Robot::Direction::West
292
+
293
+ robot.turn_right # => true
294
+ robot.direction # => LocoBot::Robot::Direction::North
295
+
296
+ robot.turn_left # => true
297
+ robot.direction # => LocoBot::Robot::Direction::West
298
+ ```
299
+
300
+ ##### #move
301
+
302
+ Moves the robot one unit forward in the direction it is currently facing.
303
+
304
+ ```ruby
305
+ robot = LocoBot::Robot.new
306
+ table = LocoBot::Table.new
307
+
308
+ robot.place(table, 2, 3, LocoBot::Robot::Direction::West)
309
+
310
+ robot.move # => true
311
+
312
+ robot.x # => 1
313
+ robot.y # => 3
314
+ ```
315
+
316
+ The robot will not move if it makes it fall out of the table.
317
+
318
+ ```ruby
319
+ robot = LocoBot::Robot.new
320
+ table = LocoBot::Table.new
321
+
322
+ robot.place(table, 0, 0, LocoBot::Robot::Direction::South)
323
+
324
+ robot.move # => false
325
+
326
+ robot.x # => 0
327
+ robot.y # => 0
328
+ ```
329
+
330
+ It will not move either if there is another robot on the destination spot.
331
+
332
+ ```ruby
333
+ robot = LocoBot::Robot.new
334
+ table = LocoBot::Table.new
335
+
336
+ LocoBot::Robot.new.place(table, 0, 0, LocoBot::Robot::Direction::South)
337
+
338
+ robot.move # => false
339
+
340
+ robot.x # => 0
341
+ robot.y # => 0
342
+ ```
343
+
344
+ ##### #report
345
+
346
+ Returns a Hash describing the `Robot`'s position and facing direction.
347
+
348
+ ```ruby
349
+ robot = LocoBot::Robot.new
350
+ table = LocoBot::Table.new
351
+
352
+ robot.place(table, 2, 3, LocoBot::Robot::Direction::West)
353
+
354
+ robot.report
355
+ # => {x: 2, y: 3, direction: LocoBot::Robot::Direction::West}
356
+ ```
357
+
358
+ ##### #hodor!
359
+
360
+ Outputs a friendly message.
361
+
362
+ ```ruby
363
+ LocoBot::Robot.new.hodor!
364
+ # stdout => "HODOR HODOR !\n"
365
+ ```
366
+
367
+ #### LocoBot::CLI
368
+
369
+ You can still access the command line interface through code.
370
+
371
+ ```ruby
372
+ cli = LocoBot::CLI.new
373
+
374
+ cli.input!('PLACE 1,2,WEST')
375
+
376
+ cli.robot.x # => 1
377
+ cli.robot.y # => 2
378
+ cli.robot.direction # => LocoBot::Robot::Direction::West
379
+ ```
380
+
381
+ ## License
382
+
383
+ Copyright 2014 Rafaël Gonzalez
384
+
385
+ Released under the terms of the MIT licence. See the LICENSE file for more details.
386
+
387
+ ## Contributing
388
+
389
+ 1. Fork it ( https://github.com/rafaelgonzalez/loco_bot/fork )
390
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
391
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
392
+ 4. Push to the branch (`git push origin my-new-feature`)
393
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new('spec')
5
+
6
+ task default: :test
7
+
8
+ desc 'Run the test suite'
9
+ task test: :spec
data/bin/loco_bot_cli ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
3
+
4
+ require 'loco_bot'
5
+
6
+ cli = LocoBot::CLI.new
7
+
8
+ while input = STDIN.gets
9
+ cli.input!(input)
10
+ end
@@ -0,0 +1,28 @@
1
+ module LocoBot
2
+ class CLI
3
+ module Command
4
+ # Parent class for Command classes.
5
+ class Base
6
+
7
+ # @!attribute [r] table
8
+ # @return [Robot] the Robot
9
+ attr_reader :robot
10
+
11
+ # @!attribute [r] table
12
+ # @return [Table] the Table
13
+ attr_reader :table
14
+
15
+ def initialize(robot, table)
16
+ @robot = robot
17
+ @table = table
18
+ end
19
+
20
+ # Returns the Command's label.
21
+ # @return [String] the Command's label
22
+ def self.label
23
+ self.name.split("::").last.upcase
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,14 @@
1
+ module LocoBot
2
+ class CLI
3
+ module Command
4
+ # Upon execution, outputs a string to STDOUT.
5
+ class Hodor < Base
6
+ # Executes the command.
7
+ # @return [void]
8
+ def execute
9
+ robot.hodor!
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module LocoBot
2
+ class CLI
3
+ module Command
4
+ # Upon execution, calls #turn_left on the robot attribute.
5
+ class Left < Base
6
+ # Executes the command.
7
+ # @return [Boolean] true if the operation succeeded, false otherwise.
8
+ def execute
9
+ robot.turn_left
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module LocoBot
2
+ class CLI
3
+ module Command
4
+ # Upon execution, calls #move on the robot attribute.
5
+ class Move < Base
6
+ # Executes the command.
7
+ # @return [Boolean] true if the operation succeeded, false otherwise.
8
+ def execute
9
+ robot.move
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,17 @@
1
+ module LocoBot
2
+ class CLI
3
+ module Command
4
+ # Upon execution, calls #place on the robot attribute.
5
+ class Place < Base
6
+ # Executes the command.
7
+ # Calls #place on the robot attribute, passing the table attribute and the given arguments.
8
+ # @return [Boolean] true if the operation succeeded, false otherwise.
9
+ def execute(x, y, direction_name)
10
+ direction = Robot::Direction.from_name(direction_name)
11
+
12
+ robot.place(table, x.to_i, y.to_i, direction)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,18 @@
1
+ module LocoBot
2
+ class CLI
3
+ module Command
4
+ # Upon execution, outputs the robot position to STDOUT.
5
+ class Report < Base
6
+ # Executes the command.
7
+ # @return [void]
8
+ def execute
9
+ report = robot.report
10
+
11
+ unless report.empty?
12
+ puts "#{report[:x]},#{report[:y]},#{report[:direction].label}"
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,14 @@
1
+ module LocoBot
2
+ class CLI
3
+ module Command
4
+ # Upon execution, calls #turn_right on the robot attribute.
5
+ class Right < Base
6
+ # Executes the command.
7
+ # @return [Boolean] true if the operation succeeded, false otherwise.
8
+ def execute
9
+ robot.turn_right
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,34 @@
1
+ require 'loco_bot/cli/command/base'
2
+ require 'loco_bot/cli/command/hodor'
3
+ require 'loco_bot/cli/command/left'
4
+ require 'loco_bot/cli/command/move'
5
+ require 'loco_bot/cli/command/place'
6
+ require 'loco_bot/cli/command/report'
7
+ require 'loco_bot/cli/command/right'
8
+
9
+ module LocoBot
10
+ class CLI
11
+ # Top-level namespace for available commands.
12
+ module Command
13
+
14
+ # Returns the list of available commands.
15
+ # @return [Array<String>] the list of available commands
16
+ def self.list
17
+ list = constants.map {|const| const.to_s.upcase}
18
+ list.delete('BASE')
19
+ list
20
+ end
21
+
22
+ # Returns a Command class that as the same name as the given name.
23
+ # @param name [String] the Command name
24
+ # @return [Command] the Command
25
+ def self.class_from_name(name)
26
+ return nil if name.nil? or name.capitalize.to_s == 'Base'
27
+
28
+ if const_defined?(name.capitalize, false)
29
+ const_get(name.capitalize)
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end