satoyos/Shuffle100

View on GitHub
app/models/deck.rb

Summary

Maintainability
A
25 mins
Test Coverage
class Deck
#  PROPERTIES = [:poems, :counter, :poems100]
  PROPERTIES = [:poems, :counter]
  PROPERTIES.each do |prop|
    attr_accessor prop
  end

  JSON_FILE = '100.json'

  class << self
    def original_deck
      @original_deck ||= self.new
    end

    def original_poems
      self.original_deck.poems
    end

    def create_from_bool100(bool100)
      self.new.select_from_bool100(bool100)
    end

  end

  def initialize(size=100)
    read_poems(size)
    @counter = 0
  end

  def read_poems(size)
    @poems = OH::JSONParser.parse_from_file(JSON_FILE).
        map{|poem_hash| Poem.new(poem_hash)}[0..size-1]
  end

  def next_poem
#    puts '++ coming into [next_poem]'
    if @counter == @poems.size
      return nil
    end
    @counter += 1
    @poems[@counter-1]
  end

  def size
    @poems.size
  end

  def shuffle_with_size(new_size)
    return nil if new_size > self.size
    @poems = (@poems.shuffle)[0..new_size-1]
    self
  end

  def shuffle!
    shuffle_with_size(self.size)
  end

  def add_fake_poems!
    joining_num = (self.size <= 50) ? self.size : 100 - self.size
    new_poem_numbers =
        ((1..100).to_a - self.poems.map{|poem| poem.number}).shuffle.slice(0, joining_num)
    @poems = (@poems + new_poem_numbers.map{|num| self.class.original_poems[num-1]}).shuffle
    self
  end

  :protected

  def select_from_bool100(bool100)
    raise 'use array[100] for select_from_bool100:' unless bool100.size == 100
    raise "number of poems in deck => #{@poems.size}" unless @poems.size == 100
    poems = []
    @poems.each_with_index do |poem, idx|
      poems << poem if bool100[idx]
    end
    @poems = poems
    self
  end

  def rollback_poem
    case @counter
      when 0 ; nil
      when 1
        @counter = 0
        nil
      else
        @counter -= 1
        @poems[@counter-1]
    end

  end

end