loco_bot 2.0.0 → 2.0.1
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/.rubocop.yml +2 -0
- data/Rakefile +10 -1
- data/bin/loco_bot_cli +1 -1
- data/lib/loco_bot/cli/command/base.rb +1 -2
- data/lib/loco_bot/cli/command/report.rb +12 -4
- data/lib/loco_bot/cli/command.rb +3 -6
- data/lib/loco_bot/cli.rb +3 -5
- data/lib/loco_bot/robot/direction/east.rb +0 -1
- data/lib/loco_bot/robot/direction/north.rb +0 -1
- data/lib/loco_bot/robot/direction/south.rb +0 -1
- data/lib/loco_bot/robot/direction/west.rb +0 -1
- data/lib/loco_bot/robot/direction.rb +1 -4
- data/lib/loco_bot/robot.rb +1 -2
- data/lib/loco_bot/table.rb +3 -4
- data/lib/loco_bot/version.rb +2 -1
- data/loco_bot.gemspec +5 -2
- data/spec/loco_bot/cli/command/report_spec.rb +1 -1
- data/spec/loco_bot/cli/command_spec.rb +1 -1
- data/spec/loco_bot/cli_spec.rb +6 -4
- data/spec/loco_bot/robot/direction/east_spec.rb +1 -1
- data/spec/loco_bot/robot/direction/north_spec.rb +1 -1
- data/spec/loco_bot/robot/direction/south_spec.rb +1 -1
- data/spec/loco_bot/robot/direction/west_spec.rb +1 -1
- data/spec/loco_bot/robot/direction_spec.rb +1 -1
- data/spec/loco_bot/robot_spec.rb +5 -6
- data/spec/loco_bot/table_spec.rb +3 -3
- data/spec/spec_helper.rb +1 -1
- metadata +16 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6e0a1c8db7a70dcd7daec9e1493e617a4ef3d912
|
4
|
+
data.tar.gz: 1f9d8d45a358faf58a8dba65af42f9fd9b553581
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c6b6cbecc758ad45feda6b9c9bcfda1261afe32bc449c380e07d9db4c5582acff2240ea65454750a4eec31559a48bc6f73c7b6fef6225cf403b70001c853ebaa
|
7
|
+
data.tar.gz: 1753fbf0dc832a2d1d3418eae6bf5450c39b36a79f2162691d8223c56e7dac7ee37bea6c52e16dfdc3f6a42f9e2ac3648f02108e511da86e85404ee51773fb39
|
data/.rubocop.yml
ADDED
data/Rakefile
CHANGED
@@ -3,7 +3,16 @@ require 'rspec/core/rake_task'
|
|
3
3
|
|
4
4
|
RSpec::Core::RakeTask.new('spec')
|
5
5
|
|
6
|
+
begin
|
7
|
+
require 'rubocop/rake_task'
|
8
|
+
RuboCop::RakeTask.new do |task|
|
9
|
+
task.options = ['-D']
|
10
|
+
end
|
11
|
+
rescue LoadError
|
12
|
+
warn 'Rubocop not found'
|
13
|
+
end
|
14
|
+
|
6
15
|
task default: :test
|
7
16
|
|
8
17
|
desc 'Run the test suite'
|
9
|
-
task test: :spec
|
18
|
+
task test: [:spec, :rubocop]
|
data/bin/loco_bot_cli
CHANGED
@@ -3,7 +3,6 @@ module LocoBot
|
|
3
3
|
module Command
|
4
4
|
# Parent class for Command classes.
|
5
5
|
class Base
|
6
|
-
|
7
6
|
# @!attribute [r] table
|
8
7
|
# @return [Robot] the Robot
|
9
8
|
attr_reader :robot
|
@@ -20,7 +19,7 @@ module LocoBot
|
|
20
19
|
# Returns the Command's label.
|
21
20
|
# @return [String] the Command's label
|
22
21
|
def self.label
|
23
|
-
|
22
|
+
name.split('::').last.upcase
|
24
23
|
end
|
25
24
|
end
|
26
25
|
end
|
@@ -6,11 +6,19 @@ module LocoBot
|
|
6
6
|
# Executes the command.
|
7
7
|
# @return [void]
|
8
8
|
def execute
|
9
|
-
|
9
|
+
report_hash = robot.report
|
10
10
|
|
11
|
-
unless
|
12
|
-
|
13
|
-
|
11
|
+
puts report_string(report_hash) unless report_hash.empty?
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def report_string(report_hash)
|
17
|
+
[
|
18
|
+
report_hash[:x],
|
19
|
+
report_hash[:y],
|
20
|
+
report_hash[:direction].label
|
21
|
+
].join(',')
|
14
22
|
end
|
15
23
|
end
|
16
24
|
end
|
data/lib/loco_bot/cli/command.rb
CHANGED
@@ -10,11 +10,10 @@ module LocoBot
|
|
10
10
|
class CLI
|
11
11
|
# Top-level namespace for available commands.
|
12
12
|
module Command
|
13
|
-
|
14
13
|
# Returns the list of available commands.
|
15
14
|
# @return [Array<String>] the list of available commands
|
16
15
|
def self.list
|
17
|
-
list = constants.map {|const| const.to_s.upcase}
|
16
|
+
list = constants.map { |const| const.to_s.upcase }
|
18
17
|
list.delete('BASE')
|
19
18
|
list
|
20
19
|
end
|
@@ -23,11 +22,9 @@ module LocoBot
|
|
23
22
|
# @param name [String] the Command name
|
24
23
|
# @return [Command] the Command
|
25
24
|
def self.class_from_name(name)
|
26
|
-
return nil if name.nil?
|
25
|
+
return nil if name.nil? || name.capitalize.to_s == 'Base'
|
27
26
|
|
28
|
-
if const_defined?(name.capitalize, false)
|
29
|
-
const_get(name.capitalize)
|
30
|
-
end
|
27
|
+
const_get(name.capitalize) if const_defined?(name.capitalize, false)
|
31
28
|
end
|
32
29
|
end
|
33
30
|
end
|
data/lib/loco_bot/cli.rb
CHANGED
@@ -46,11 +46,9 @@ module LocoBot
|
|
46
46
|
private
|
47
47
|
|
48
48
|
def execute_command(command_class, arguments)
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
puts "#{command_class.label}: #{exception.message}"
|
53
|
-
end
|
49
|
+
command_class.new(robot, table).execute(*arguments)
|
50
|
+
rescue ArgumentError => exception
|
51
|
+
puts "#{command_class.label}: #{exception.message}"
|
54
52
|
end
|
55
53
|
|
56
54
|
def parse_input(input)
|
@@ -7,7 +7,6 @@ module LocoBot
|
|
7
7
|
class Robot
|
8
8
|
# Top-level namespace for the possible facing directions.
|
9
9
|
module Direction
|
10
|
-
|
11
10
|
# Returns the list of available Direction as Strings.
|
12
11
|
# @return [Array<String>]
|
13
12
|
def self.list
|
@@ -18,9 +17,7 @@ module LocoBot
|
|
18
17
|
# @param name [String] the Direction name
|
19
18
|
# @return [Command] the Direction
|
20
19
|
def self.from_name(name)
|
21
|
-
if const_defined?(name.capitalize, false)
|
22
|
-
const_get(name.capitalize)
|
23
|
-
end
|
20
|
+
const_get(name.capitalize) if const_defined?(name.capitalize, false)
|
24
21
|
end
|
25
22
|
end
|
26
23
|
end
|
data/lib/loco_bot/robot.rb
CHANGED
@@ -3,7 +3,6 @@ require 'loco_bot/robot/direction'
|
|
3
3
|
module LocoBot
|
4
4
|
# Representation of a robot, placeable on tables.
|
5
5
|
class Robot
|
6
|
-
|
7
6
|
# @!attribute [r] table
|
8
7
|
# @return [Table] the Table the Robot is currently placed on
|
9
8
|
attr_reader :table
|
@@ -78,7 +77,7 @@ module LocoBot
|
|
78
77
|
def report
|
79
78
|
return {} if table.nil?
|
80
79
|
|
81
|
-
{x: x, y: y, direction: direction}
|
80
|
+
{ x: x, y: y, direction: direction }
|
82
81
|
end
|
83
82
|
|
84
83
|
# Outputs a friendly greating.
|
data/lib/loco_bot/table.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
module LocoBot
|
2
2
|
# Representation of a table on which robots can be placed.
|
3
3
|
class Table
|
4
|
-
|
5
4
|
# @!attribute [r] width
|
6
5
|
# @return [Fixnum] width of the Table
|
7
6
|
# Determines the farthest accessible point on the Table's x-axis.
|
@@ -65,7 +64,7 @@ module LocoBot
|
|
65
64
|
# @param y [Integer] the y-axis coordinate
|
66
65
|
# @return [Boolean] true if a Robot can be placed at the given coordinates, false otherwise.
|
67
66
|
def position_valid?(x, y)
|
68
|
-
position_within_bounds?(x, y)
|
67
|
+
position_within_bounds?(x, y) && position_free?(x, y)
|
69
68
|
end
|
70
69
|
|
71
70
|
# The collection of Robots currently placed on the Table.
|
@@ -81,7 +80,7 @@ module LocoBot
|
|
81
80
|
end
|
82
81
|
|
83
82
|
def position_free?(x, y)
|
84
|
-
robots.none? {|robot| robot.x == x && robot.y == y }
|
83
|
+
robots.none? { |robot| robot.x == x && robot.y == y }
|
85
84
|
end
|
86
85
|
|
87
86
|
def validate_dimensions
|
@@ -89,7 +88,7 @@ module LocoBot
|
|
89
88
|
errors << "#{width} is not a valid width: it must be > 0" unless width > 0
|
90
89
|
errors << "#{height} is not a valid height: it must be > 0" unless height > 0
|
91
90
|
|
92
|
-
|
91
|
+
fail(ArgumentError, errors.join(', ')) unless errors.empty?
|
93
92
|
end
|
94
93
|
end
|
95
94
|
end
|
data/lib/loco_bot/version.rb
CHANGED
data/loco_bot.gemspec
CHANGED
@@ -8,8 +8,10 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = LocoBot::VERSION
|
9
9
|
spec.authors = ['Rafaël Gonzalez']
|
10
10
|
spec.email = ['github@rafaelgonzalez.me']
|
11
|
-
spec.summary =
|
12
|
-
|
11
|
+
spec.summary = 'Ruby gem of crazy robots and benevolent tables that ' \
|
12
|
+
'keep watching over them.'
|
13
|
+
spec.description = 'Issue commands to control the robots and the tables ' \
|
14
|
+
'will keep you from making them fall, you monster!'
|
13
15
|
spec.homepage = 'https://github.com/rafaelgonzalez/loco_bot'
|
14
16
|
spec.license = 'MIT'
|
15
17
|
|
@@ -23,4 +25,5 @@ Gem::Specification.new do |spec|
|
|
23
25
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
24
26
|
spec.add_development_dependency 'simplecov', '~> 0.9'
|
25
27
|
spec.add_development_dependency 'codeclimate-test-reporter', '~> 0.4.0'
|
28
|
+
spec.add_development_dependency 'rubocop', '~> 0.32.1'
|
26
29
|
end
|
@@ -12,7 +12,7 @@ RSpec.describe LocoBot::CLI::Command::Report do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
context 'after placing robot' do
|
15
|
-
before { subject.robot.place(table, 4
|
15
|
+
before { subject.robot.place(table, 4, 2, LocoBot::Robot::Direction::East) }
|
16
16
|
|
17
17
|
it 'outputs a string' do
|
18
18
|
expect { subject.execute }.to output("4,2,EAST\n").to_stdout
|
@@ -2,7 +2,7 @@ RSpec.describe LocoBot::CLI::Command do
|
|
2
2
|
describe '.list' do
|
3
3
|
subject { described_class.list }
|
4
4
|
|
5
|
-
it { is_expected.to eql
|
5
|
+
it { is_expected.to eql %w(HODOR LEFT MOVE PLACE REPORT RIGHT) }
|
6
6
|
end
|
7
7
|
|
8
8
|
describe '.class_from_name' do
|
data/spec/loco_bot/cli_spec.rb
CHANGED
@@ -17,9 +17,9 @@ RSpec.describe LocoBot::CLI do
|
|
17
17
|
let(:command_class_double) { double }
|
18
18
|
|
19
19
|
it 'calls the correct command' do
|
20
|
-
expect(LocoBot::CLI::Command::Place).to receive(:new)
|
21
|
-
|
22
|
-
|
20
|
+
expect(LocoBot::CLI::Command::Place).to receive(:new)
|
21
|
+
.with(subject.robot, subject.table)
|
22
|
+
.once.and_return(command_class_double)
|
23
23
|
|
24
24
|
expect(command_class_double).to receive(:execute).with('1', '3', 'SOUTH').once
|
25
25
|
|
@@ -41,7 +41,9 @@ RSpec.describe LocoBot::CLI do
|
|
41
41
|
let(:arguments) { '' }
|
42
42
|
|
43
43
|
it 'does not raise an error' do
|
44
|
-
expect { subject.input!(input) }.to output(
|
44
|
+
expect { subject.input!(input) }.to output(
|
45
|
+
"YADAYADA: not a known command. Valid commands are HODOR, LEFT, MOVE, PLACE, REPORT, RIGHT.\n"
|
46
|
+
).to_stdout
|
45
47
|
end
|
46
48
|
end
|
47
49
|
end
|
data/spec/loco_bot/robot_spec.rb
CHANGED
@@ -272,7 +272,7 @@ RSpec.describe LocoBot::Robot do
|
|
272
272
|
context 'when placed on a table' do
|
273
273
|
before { robot.place(table, 6, 17, LocoBot::Robot::Direction::East) }
|
274
274
|
|
275
|
-
it { is_expected.to eql(
|
275
|
+
it { is_expected.to eql(x: 6, y: 17, direction: LocoBot::Robot::Direction::East) }
|
276
276
|
end
|
277
277
|
|
278
278
|
context 'when not placed on a table' do
|
@@ -300,25 +300,25 @@ RSpec.describe LocoBot::Robot do
|
|
300
300
|
context 'facing north' do
|
301
301
|
let(:direction) { LocoBot::Robot::Direction::North }
|
302
302
|
|
303
|
-
it { is_expected.to eql(
|
303
|
+
it { is_expected.to eql(x: 10, y: 11) }
|
304
304
|
end
|
305
305
|
|
306
306
|
context 'facing south' do
|
307
307
|
let(:direction) { LocoBot::Robot::Direction::South }
|
308
308
|
|
309
|
-
it { is_expected.to eql(
|
309
|
+
it { is_expected.to eql(x: 10, y: 9) }
|
310
310
|
end
|
311
311
|
|
312
312
|
context 'facing east' do
|
313
313
|
let(:direction) { LocoBot::Robot::Direction::East }
|
314
314
|
|
315
|
-
it { is_expected.to eql(
|
315
|
+
it { is_expected.to eql(x: 11, y: 10) }
|
316
316
|
end
|
317
317
|
|
318
318
|
context 'facing west' do
|
319
319
|
let(:direction) { LocoBot::Robot::Direction::West }
|
320
320
|
|
321
|
-
it { is_expected.to eql(
|
321
|
+
it { is_expected.to eql(x: 9, y: 10) }
|
322
322
|
end
|
323
323
|
end
|
324
324
|
end
|
@@ -330,7 +330,6 @@ RSpec.describe LocoBot::Robot do
|
|
330
330
|
it { is_expected.to be false }
|
331
331
|
end
|
332
332
|
|
333
|
-
|
334
333
|
context 'when placed on a table' do
|
335
334
|
before { robot.place(table, 0, 0, direction) }
|
336
335
|
|
data/spec/loco_bot/table_spec.rb
CHANGED
@@ -11,20 +11,20 @@ RSpec.describe LocoBot::Table do
|
|
11
11
|
context 'with an invalid width' do
|
12
12
|
let(:width) { 0 }
|
13
13
|
|
14
|
-
it { expect{ subject }.to(raise_error(ArgumentError)) }
|
14
|
+
it { expect { subject }.to(raise_error(ArgumentError)) }
|
15
15
|
end
|
16
16
|
|
17
17
|
context 'with an invalid height' do
|
18
18
|
let(:height) { -5 }
|
19
19
|
|
20
|
-
it { expect{ subject }.to(raise_error(ArgumentError)) }
|
20
|
+
it { expect { subject }.to(raise_error(ArgumentError)) }
|
21
21
|
end
|
22
22
|
|
23
23
|
context 'with an invalid width and height' do
|
24
24
|
let(:width) { -16 }
|
25
25
|
let(:height) { 0 }
|
26
26
|
|
27
|
-
it { expect{ subject }.to(raise_error(ArgumentError)) }
|
27
|
+
it { expect { subject }.to(raise_error(ArgumentError)) }
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: loco_bot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rafaël Gonzalez
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: 0.4.0
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rubocop
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.32.1
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.32.1
|
83
97
|
description: Issue commands to control the robots and the tables will keep you from
|
84
98
|
making them fall, you monster!
|
85
99
|
email:
|
@@ -91,6 +105,7 @@ extra_rdoc_files: []
|
|
91
105
|
files:
|
92
106
|
- ".gitignore"
|
93
107
|
- ".rspec"
|
108
|
+
- ".rubocop.yml"
|
94
109
|
- ".travis.yml"
|
95
110
|
- Gemfile
|
96
111
|
- LICENSE.txt
|