removing repeated code blocks

This commit is contained in:
lenise.rodrigues 2021-05-26 20:24:07 -03:00
parent 10dc87ecc8
commit 35f3f3d680
8 changed files with 143 additions and 73 deletions

10
ruby/Dockerfile Normal file
View File

@ -0,0 +1,10 @@
FROM ruby:2.6
RUN mkdir -p /app
WORKDIR /app
RUN gem install bundler:2.1.4
COPY Gemfile Gemfile.lock /app/
RUN bundle install
COPY . /app

View File

@ -1,3 +1,7 @@
source "https://rubygems.org" # frozen_string_literal: true
source 'https://rubygems.org'
gem 'rspec', '~> 3.0' gem 'rspec', '~> 3.0'
gem 'rubocop', '~> 1.15'

View File

@ -1,7 +1,14 @@
GEM GEM
remote: https://rubygems.org/ remote: https://rubygems.org/
specs: specs:
ast (2.4.2)
diff-lcs (1.4.4) diff-lcs (1.4.4)
parallel (1.20.1)
parser (3.0.1.1)
ast (~> 2.4.1)
rainbow (3.0.0)
regexp_parser (2.1.1)
rexml (3.2.5)
rspec (3.10.0) rspec (3.10.0)
rspec-core (~> 3.10.0) rspec-core (~> 3.10.0)
rspec-expectations (~> 3.10.0) rspec-expectations (~> 3.10.0)
@ -15,12 +22,26 @@ GEM
diff-lcs (>= 1.2.0, < 2.0) diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.10.0) rspec-support (~> 3.10.0)
rspec-support (3.10.2) rspec-support (3.10.2)
rubocop (1.15.0)
parallel (~> 1.10)
parser (>= 3.0.0.0)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 1.8, < 3.0)
rexml
rubocop-ast (>= 1.5.0, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 1.4.0, < 3.0)
rubocop-ast (1.6.0)
parser (>= 3.0.1.1)
ruby-progressbar (1.11.0)
unicode-display_width (2.0.0)
PLATFORMS PLATFORMS
ruby ruby
DEPENDENCIES DEPENDENCIES
rspec (~> 3.0) rspec (~> 3.0)
rubocop (~> 1.15)
BUNDLED WITH BUNDLED WITH
2.1.4 2.1.4

8
ruby/Makefile Normal file
View File

@ -0,0 +1,8 @@
test:
docker-compose up --build test
lint:
docker-compose up --build lint
auto-correct:
docker-compose up --build auto-correct

13
ruby/README.md Normal file
View File

@ -0,0 +1,13 @@
## Guilded Rose
Guio and Lenise's implementation for [guilded rose refactoring](https://github.com/emilybache/GildedRose-Refactoring-Kata#gilded-rose-refactoring-kata)
### Testing
`make test`
#### Linter - Rubocop
`make lint`
automatic fix detected offenses
`make auto-correct`

22
ruby/docker-compose.yml Normal file
View File

@ -0,0 +1,22 @@
version: '2'
services:
base:
build:
context: .
volumes:
- .:/app
lint:
extends:
service: base
command: rubocop
auto-correct:
extends:
service: base
command: bundle exec rubocop --auto-correct
test:
extends:
service: base
command: bundle exec rspec gilded_rose_spec.rb

View File

@ -1,43 +1,35 @@
class GildedRose # frozen_string_literal: true
class GildedRose
def initialize(items) def initialize(items)
@items = items @items = items
end end
def update_quality() def update_quality
@items.each do |item| @items.each do |item|
case item.name if item.name.include?('Backstage passes')
when "Sulfuras, Hand of Ragnaros"
when "Backstage passes to a TAFKAL80ETC concert"
item.quality += 1 if item.sell_in > 10 item.quality += 1 if item.sell_in > 10
item.quality += 2 if item.sell_in <= 10 and item.sell_in > 5 item.quality += 2 if (item.sell_in <= 10) && (item.sell_in > 5)
item.quality += 3 if item.sell_in <= 5 item.quality += 3 if item.sell_in <= 5
item.sell_in -= 1 item.sell_in -= 1
item.quality = 0 if item.sell_in < 0 item.quality = 0 if item.sell_in.negative?
when "Aged Brie" elsif !item.name.include?('Sulfuras')
item.sell_in -= 1 factor = 0
if item.quality < 50 factor = case item.name
if item.sell_in < 0 when 'Aged Brie'
item.quality += 2 1
else
item.quality += 1
end
end
when /Conjured/ when /Conjured/
item.sell_in -= 1 -2
if item.quality > 0
item.quality -= 2
item.quality -= 2 if item.sell_in < 0
end
else else
-1
end
if (item.quality >= 0) && (item.quality <= 50)
item.sell_in -= 1 item.sell_in -= 1
if item.quality > 0 item.quality += factor
item.quality -= 1 item.quality += factor if item.sell_in.negative?
item.quality -= 1 if item.sell_in < 0
end end
end item.quality = 50 if item.quality > 50
if item.quality < 0 item.quality = 0 if item.quality.negative?
item.quality = 0
end end
end end
end end
@ -52,7 +44,7 @@ class Item
@quality = quality @quality = quality
end end
def to_s() def to_s
"#{@name}, #{@sell_in}, #{@quality}" "#{@name}, #{@sell_in}, #{@quality}"
end end
end end

View File

@ -1,87 +1,87 @@
require File.join(File.dirname(__FILE__), 'gilded_rose') # frozen_string_literal: true
require_relative File.join(File.dirname(__FILE__), 'gilded_rose')
describe GildedRose do describe GildedRose do
describe '#update_quality' do
describe "#update_quality" do it 'does not change the name' do
it "does not change the name" do items = [Item.new('foo', 0, 0)]
items = [Item.new("foo", 0, 0)] GildedRose.new(items).update_quality
GildedRose.new(items).update_quality() expect(items[0].name).to eq 'foo'
expect(items[0].name).to eq "foo"
end end
it "degrades quality at double speed when sell by date has passed" do it 'degrades quality at double speed when sell by date has passed' do
items = [Item.new("foo", 0, 10)] items = [Item.new('foo', 0, 10)]
GildedRose.new(items).update_quality() GildedRose.new(items).update_quality
expect(items[0].quality).to eq 8 expect(items[0].quality).to eq 8
end end
it "degrades quality at normal speed when sell by date hasn't passed" do it "degrades quality at normal speed when sell by date hasn't passed" do
items = [Item.new("foo", 1, 10)] items = [Item.new('foo', 1, 10)]
GildedRose.new(items).update_quality() GildedRose.new(items).update_quality
expect(items[0].quality).to eq 9 expect(items[0].quality).to eq 9
end end
it "does not decrease quality when it's zero" do it "does not decrease quality when it's zero" do
items = [Item.new("foo", 1, 0)] items = [Item.new('foo', 1, 0)]
GildedRose.new(items).update_quality() GildedRose.new(items).update_quality
expect(items[0].quality).to eq 0 expect(items[0].quality).to eq 0
end end
it "increase quality by 1 when item is Aged Brie and sell by date hasn't passed" do it "increase quality by 1 when item is Aged Brie and sell by date hasn't passed" do
items = [Item.new("Aged Brie", 1, 0)] items = [Item.new('Aged Brie', 1, 0)]
GildedRose.new(items).update_quality() GildedRose.new(items).update_quality
expect(items[0].quality).to eq 1 expect(items[0].quality).to eq 1
end end
it "increase quality by 2 when item is Aged Brie and sell by date has passed" do it 'increase quality by 2 when item is Aged Brie and sell by date has passed' do
items = [Item.new("Aged Brie", 0, 0)] items = [Item.new('Aged Brie', 0, 0)]
GildedRose.new(items).update_quality() GildedRose.new(items).update_quality
expect(items[0].quality).to eq 2 expect(items[0].quality).to eq 2
end end
it "does not increase quality when it's already 50" do it "does not increase quality when it's already 50" do
items = [Item.new("Aged Brie", 0, 50)] items = [Item.new('Aged Brie', 0, 50)]
GildedRose.new(items).update_quality() GildedRose.new(items).update_quality
expect(items[0].quality).to eq 50 expect(items[0].quality).to eq 50
end end
it "does not change quality and sell by date when it's a legendary item (Sulfuras)" do it "does not change quality and sell by date when it's a legendary item (Sulfuras)" do
items = [Item.new("Sulfuras, Hand of Ragnaros", 0, 80)] items = [Item.new('Sulfuras, Hand of Ragnaros', 0, 80)]
GildedRose.new(items).update_quality() GildedRose.new(items).update_quality
expect(items[0].quality).to eq 80 expect(items[0].quality).to eq 80
expect(items[0].sell_in).to eq 0 expect(items[0].sell_in).to eq 0
end end
it "increase quality by 1 when item is Backstage Passes and sell by date is bigger than 10" do it 'increase quality by 1 when item is Backstage Passes and sell by date is bigger than 10' do
items = [Item.new("Backstage passes to a TAFKAL80ETC concert", 11, 1)] items = [Item.new('Backstage passes to a TAFKAL80ETC concert', 11, 1)]
GildedRose.new(items).update_quality() GildedRose.new(items).update_quality
expect(items[0].quality).to eq 2 expect(items[0].quality).to eq 2
end end
it "increase quality by 2 when item is Backstage Passes and sell by date is less or equal 10" do it 'increase quality by 2 when item is Backstage Passes and sell by date is less or equal 10' do
items = [Item.new("Backstage passes to a TAFKAL80ETC concert", 10, 1)] items = [Item.new('Backstage passes to a TAFKAL80ETC concert', 10, 1)]
GildedRose.new(items).update_quality() GildedRose.new(items).update_quality
expect(items[0].quality).to eq 3 expect(items[0].quality).to eq 3
end end
it "increase quality by 3 when item is Backstage Passes and sell by date is less or equal 5" do it 'increase quality by 3 when item is Backstage Passes and sell by date is less or equal 5' do
items = [Item.new("Backstage passes to a TAFKAL80ETC concert", 5, 1)] items = [Item.new('Backstage passes to a TAFKAL80ETC concert', 5, 1)]
GildedRose.new(items).update_quality() GildedRose.new(items).update_quality
expect(items[0].quality).to eq 4 expect(items[0].quality).to eq 4
end end
it "sets quality to 0 when item is Backstage Passes and sell by date has passed" do it 'sets quality to 0 when item is Backstage Passes and sell by date has passed' do
items = [Item.new("Backstage passes to a TAFKAL80ETC concert", 0, 50)] items = [Item.new('Backstage passes to a TAFKAL80ETC concert', 0, 50)]
GildedRose.new(items).update_quality() GildedRose.new(items).update_quality
expect(items[0].quality).to eq 0 expect(items[0].quality).to eq 0
end end
it "degrades quality twice as fast for Conjured items" do it 'degrades quality twice as fast for Conjured items' do
items = [Item.new("Conjured sword", 10, 50), Item.new("Conjured axe", 0, 50)] items = [Item.new('Conjured sword', 10, 50), Item.new('Conjured axe', 0, 50)]
GildedRose.new(items).update_quality() GildedRose.new(items).update_quality
expect(items[0].quality).to eq 48 expect(items[0].quality).to eq 48
expect(items[1].quality).to eq 46 expect(items[1].quality).to eq 46
end end
end end
end end